Loading...
Pages: [1]   Go Down
Author Topic: [résolu] array.splice() en C?  (Read 206 times)
0 Members and 1 Guest are viewing this topic.
Britanny
Offline Offline
Full Member
***
Karma: 0
Posts: 231
Mais vrai, j'ai trop pleuré, toute lune est atroce
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Code:
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....
Code:
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
« Last Edit: December 19, 2011, 12:01:30 pm by mrbbp » Logged

France
Offline Offline
Edison Member
*
Karma: 12
Posts: 1800
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Code:
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.
Logged

Britanny
Offline Offline
Full Member
***
Karma: 0
Posts: 231
Mais vrai, j'ai trop pleuré, toute lune est atroce
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6
eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Panther 10.3.9

Arduino Diecimila
Arduino Mega
Arduino Standalone

Arduino 1307.04



Britanny
Offline Offline
Full Member
***
Karma: 0
Posts: 231
Mais vrai, j'ai trop pleuré, toute lune est atroce
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
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 smiley-wink

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

Code:
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);
}
Logged

Pages: [1]   Go Up
Print
 
Jump to: