problème boucle while

problème boucle while - C++ - Programmation

Marsh Posté le 18-04-2009 à 09:14:32    

Bonjour, je suis débutant en c++ et j'ai un petit problème avec une boucle while, voici le code
 

Code :
  1. static int wgCount = 0;
  2. char ** getWidgets(int windowId)
  3. {
  4. char ** test = NULL;
  5. for (wgCount; wgCount < sizeof(widgets); wgCount++)
  6.         {
  7.           test = split(widgets[wgCount],';');
  8.   if (atoi(test[2]) == windowId)
  9.        return test;
  10. }
  11. test = NULL;
  12. wgCount = 0;
  13. return test;
  14. };
  15. while (1)
  16. {
  17. datas = getWidgets(id);
  18. if ( (char *)datas == NULL)
  19.  break;
  20. this->addWidget(( char * ) datas);
  21. }


 
 
Le problème, c'est que je voudrais sortir de la boucle while quand la fonction getWidgets retourne un pointeur null mais ca ne fonctionne pas, j'ai toujours une boucle infinie.


Message édité par t0t0l le 18-04-2009 à 17:12:16
Reply

Marsh Posté le 18-04-2009 à 09:14:32   

Reply

Marsh Posté le 18-04-2009 à 11:41:50    

id ne semble pas changer à chaque tour de boucle
où est déclaré datas ?
Tu n'est pas obligé de caster datas pour le comparer à NULL.

Reply

Marsh Posté le 18-04-2009 à 12:26:36    

jesus_christ a écrit :

id ne semble pas changer à chaque tour de boucle
où est déclaré datas ?
Tu n'est pas obligé de caster datas pour le comparer à NULL.


 
 
voici le code complet de la fonction qui intègre ma boucle while
 

Code :
  1. void KrWindow::_getWidgets()
  2. {
  3.    char ** datas = NULL;
  4.    while (1)
  5.    {
  6.       datas = getWidgets(this->getId());
  7.       if ( datas == NULL)
  8.          break;
  9.       this->addWidget(datas);
  10.    }
  11. };


 
 
pour expliquer un peu plus mon but recherché voici ce que je veut faire
 
j'ai un tableau de *char, par exemple :  
 
static char * widgets[] = {
    //id;app;window;type;label;x;y;w;h;fColor;bColor;orientation;action;defaultValue
    "1;0;1;5;essai1;10;10;100;40;000000;000000;0;1=20; ",
    "2;0;1;5;essai2;10;10;100;40;000000;000000;0;1=20; "
};
 
Je veux renvoyer a ma fonction (KrWindow::_getWidgets) toutes les lignes ou la troisième valeur (window) est egale à 1 par exemple (parametre id de ma fonction).
 
je sais pas si j'ai été très clair  :pt1cable:  
 
 

Reply

Marsh Posté le 18-04-2009 à 12:57:44    

this->getId() change-t-il à chaque tour de boucle ?
Ta condition d'arret est bonne, mais j'ai surtout l'impression que tu ne déplaces pas ton indice, donc à tour ta boucle fait la même chose, d'où la boucle infinie.

Reply

Marsh Posté le 18-04-2009 à 13:03:14    

non id ne varie pas, puisque je veux recuperer toutes les lignes ou window (qui correspond a mon parametre windowId) est egal à 1 par exemple.

Reply

Marsh Posté le 18-04-2009 à 16:12:11    

Code :
  1. static int wgCount = 0;
  2. char ** getWidgets(int windowId)
  3. {
  4. char ** test = NULL;
  5. for ( wgCount ; wgCount < sizeof(widgets); )
  6.         {
  7.           test = split(widgets[wgCount++],';');
  8.   if (atoi(test[2]) == windowId)
  9.        return test;
  10. }
  11. test = NULL;
  12. wgCount = 0;
  13. return test;
  14. }


 
voila une solution, ça corrige juste ton bug. Mais je n'aime pas le style de la fonction, l'usage de la static pour wgCount est difficile à comprendre et très peu souple. Le coup de la static qui est remise à 0 une fois que la boucle est terminée, j'avais jamais vu...

Reply

Marsh Posté le 18-04-2009 à 16:47:54    

Ok merci ca fonctionne ;)
 
L'utilisation de wgCount en statique c'est d'avoir un index statique qui parcourt mon tableau afin de ne pas recommencer sa lecture depuis le debut a chaque appel de la fonction. Sinon la fonction me renverra a chaque fois la première ligne du tableau...
 
 
Si t'as une autre idée, je suis preneur.
 
edit : j'ai parlé trop vite, maintenant je n'ai plus de boucle infinie mais la fonction me retourne toujours qu'une seule ligne  :(  
 
 


Message édité par t0t0l le 18-04-2009 à 17:16:16
Reply

Marsh Posté le 18-04-2009 à 20:55:16    

peut-être parce qu'il n'y a qu'une seule ligne de bonne.
je te propose :
 

Code :
  1. char** getWidgets(int windowId, int index)
  2. {
  3.     for (; index < sizeof(widgets); index++)
  4.     {
  5.         char** test = split(widgets[index],';');
  6.         if (atoi(test[2]) == windowId)
  7.             return test;
  8.     }
  9.     return NULL;
  10. }
  11. char** datas;
  12. int index = 0;
  13. while ( datas = getWidgets(id, index++) )
  14. {
  15.     this->addWidget(( char * ) datas);
  16. }


 
Par contre le cast de datas de char** vers char*, il me semble douteux...


Message édité par jesus_christ le 18-04-2009 à 20:55:55
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed