2013-07-26 3 views
0

J'ai un problème concernant la portée des variables à l'intérieur pour les boucles en C++. J'ai une variable j qui compte une certaine condition comme on le voit dans le code ci-dessouscondition pour le comportement impair de la boucle C++

int j; 
for (int i=0; i<8; i++){ 
    if ((betaSol(i,0) >= -HalfPi) && (betaSol(i,0) <= HalfPi)){ 
     // j gives size of new vector where beta is within bounds 
     j++; 
    } 
} 
Eigen::MatrixXd vectorname(j,1); 

Maintenant, je veux utiliser le même j dans l'état de la prochaine boucle comme suit

for (int ii = 0; ii<j; ii++){ 
     vectorname(ii,0) = functionname(alphaSol_filt(ii,0),betaSol_filt(ii,0)); 
    } 

ici est où le problème se produit. Cela devient une boucle infinie et ii sort des limites. La chose étrange est que lorsque je remplace la deuxième boucle avec ce qui suit:

for (int ii = 0; ii<j; ii++){ 
    std::cout << j <<std::endl; 
    } 

cela fonctionne correctement. Cependant si je change quelque chose, alors il devient une boucle infinie et je ne sais pas ce qui se passe

+0

Bienvenue dans Stack Overflow. Veuillez lire la page [About] bientôt. Vous n'avez pas initialisé 'j', vous obtenez donc des valeurs indéterminées avec lesquelles travailler. –

+0

Merci pour votre réponse. Mais j'utilise la même valeur j que j'ai initialisée en 1ère ligne. De plus, si je publie la valeur de j en dehors de la première boucle for, j'obtiens la valeur correcte. –

+5

'int j;' n'initialise pas 'j'. 'int j = 0;' fait. –

Répondre

0

Lorsque vous avez une initialisation vide, j est initialisé à toute valeur qui se trouve dans l'espace mémoire dans lequel il est stocké, au moins avec la plupart des compilateurs que j'ai utilisés. Puisque vous incrémentez j, je suppose que vous ne l'initialisez pas dans la boucle, donc vous aurez probablement besoin de mettre j = 0, ou une autre valeur qui a du sens pour votre programme. Comme pour la deuxième boucle toujours en boucle, j'ai vu des compilateurs initialisés ints avec aucune valeur assignée à la valeur maximale possible pour ints (2 147 483 647), ce qui prendrait beaucoup de temps pour faire une boucle même sans trop faire et semblerait être une boucle infinie.

0

utilisation:

int j=0;

au lieu de

int j;

et vérifier si les fonctions au sein de la boucle for modifier la valeur de ii ou j qui rend la boucle infinie.