[résolu] array.splice() en C?

Bonjour, j'imagine que pour des habitués du C ma requête est évidente, pour moi, c'est du chinois.

J'ai une table composée de 12 éléments,
je tire au hasard dans cette table... jusque là tout va bien!

int table[] = {1,2,3,4,5,6,7,8,9,10,11,12};
int tirage = table[int(random(12))];

Maintenant, je voudrais ne tirer au hasard qu'une fois chaque élément.
ou mettre dans le désordre la liste et prendre chaque élément...

en C i'y a t-il une solution?

Ma première tentative a été de copier la table et de virer l'élément tiré et de recommencer un tirage dans la table plus courte... et ainsi de suite... jusque plus rien...
Mais quand je transmets ma table à ma fonction, elle n'a plus de longueur...

j'utilise sizeof(array)/sizeof(array[0]) pour avoir ma longueur de table...
mais dans ma fonction j'ai rien...

C'est sans doute un pb avec les pointeurs, mais je suis vraiment trop quiche avec ça!
sur le moment je comprends et puis en fait quand j'essaie c'est pas ça...

j'essaie un truc comme ça, pour entrer ma table et la ressortir... mais à l'intérieur de ma fonction, sizeof(array) donne 2 pas 12....

int * foo(int array[]) {
return array;
}

une idée donc pour faire le truc..
peut-être avec une récursive (mais là encore l'exercice intellectuel me démoralise)

merci

mrbbp:

int * foo(int array[]) {

return array;
}

Une chose à ne pas oublier, la valeur retournée par sizeof est déterminée à la compilation.
Si la taille est inconnue à la compilation le calcul est faux.
Si le tableau change de taille pendant l'exécution le calcul est faux.

ahhhhhh d'accord...
Ben ça va pas être simple alors de savoir combien d'elements à moins d'avoir une globale qu'on diminue...

Chaque valeurs de ton premier tableau déjà lue, tu la mets dans un deuxième tableau, tu fait une boucle qui vérifie que la valeur lue actuellement ne figure pas dans ton tableau, si elle y figure, tu avances ta lecture d'une case.

Salut,
j'ai posé aussi la question en anglais dans le forum "programming" et la soluce proposée m'a semblé plus simple.

You could maintain a shadow boolean array to see if the number has been chosen before, or simply negate the value in the array, if you're only expecting positive numbers.

merci de ta réponse.

ps: je pensais à un truc comme ça mais en ce moment j'aime beaucoup les "do...while" et je voyais pas comment la faire avec un do...while :wink:

je vous donne le code que j'ai gratté, ' pourrait r'servir... :slight_smile:

int table[] = {0,2,4,6,8,10};
const int longueurTable = sizeof(table)/sizeof(table[0]);
boolean tableControle[longueurTable];
int t;
int compteur;

void setup() {
  Serial.begin(9600);
// remplissage de la table de contrôle
  for (int i=0; i<longueurTable; i++) {
    tableControle[i] = false;
  }
}

void loop() {
  // réinit de la table de contrôle
  if (compteur == longueurTable) {
    for (int i=0; i<longueurTable; i++) {
      tableControle[i] = false;
    }
    compteur = 0;
    Serial.println("reinit tableControle\n");
  }
  
// tire au hasard dans la table et vérifie dans la table de controle
  do {t= int(random(longueurTable));}
  while (tableControle[t]);
// mets à jour la table de controle
  tableControle[t] = true;
// compteur sert à savoir si tous les éléments de la table ont été tirés
  compteur++;
 
// pour le débug
  Serial.println(table[t]);
  delay(2000);
}