Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1502 connectés 

  FORUM HardWare.fr
  Programmation

  C++ et boucle for : convention

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C++ et boucle for : convention

n°21788
janoscoder
Posté le 02-04-2001 à 14:15:01  profilanswer
 

j'ai remarqué que visual donne pour
 
for (int i=0; i<n; i++)
 ...
for (int i=0; i<p; i++)
 ...
 
error: i already defined
 
c'est pas drôle car les autres compilateurs que j'utilise considèrent i comme locale dans la boucle for.
 
je n'ai pas de bouquin de c++ sous la main, donc j'aimerais savoir quelle est la norme. (je suis persuadé que c'est i locale, mais bon)
Ah oui, s'il y a une option dans visual, on peut toujours rêver, pour arranger ça, qu'elle se montre.
 
enfin, j'ai installé le service pack 5 de vc6, et ça n'a rien changé.

mood
Publicité
Posté le 02-04-2001 à 14:15:01  profilanswer
 

n°21791
JPA
Posté le 02-04-2001 à 14:22:58  profilanswer
 

Quand tu fais 2 boucles imbriquées, je ne vois pas comment ne pas avoir deux compteurs différents si tu as besoin du compteur dans la boucle.

n°21792
kadreg
profil: Utilisateur
Posté le 02-04-2001 à 14:24:17  profilanswer
 

Le visual a raison, c'est i global. Le for est une autre manière d'ecrire un while :
 
for (A;B;C) {
   D
}
 
est transformé en :
A
while (B) {
  D
  C
}
 
le A, ta déclaration, n'est pas dans la boucle. Il est donc dans le scope supérieur.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°21793
janoscoder
Posté le 02-04-2001 à 14:24:54  profilanswer
 

elles ne sont pas imbriquées,
elles sont consécutives:
for (int i ...)
{
 ...
}
 
for (int i ...)
{
 ...
}

n°21794
janoscoder
Posté le 02-04-2001 à 14:26:03  profilanswer
 

Je vois bien qu'on peut "expander" un for en while, mais est-ce la norme?

n°21797
JPA
Posté le 02-04-2001 à 14:29:52  profilanswer
 

je connais pas VC++ mais quand tu écris :  
 
for (int i=0; i<n; i++)  
...  
for (int i=0; i<p; i++)  
 
tu définis ta variable au moment de la création de la boucle. (Me corriger si je me trompe)
Essaie dans la 2° : for (i=0; i<p; i++) et dis nous si ça plante

n°21798
janoscoder
Posté le 02-04-2001 à 14:32:45  profilanswer
 

Ca marche bien, mais ça rend mon code incompatible avec les autres compilateurs que j'utilise. et je viens de faire un tour sur le site de la norme c++, et je pense bien que visual se trompe:
 
http://www.cygnus.com/misc/wp/dec96pub/stmt.html
 
  6.5.3  The for statement                                    [stmt.for]
 
1 The for statement
          for ( for-init-statement conditionopt ; expressionopt ) statement
  is equivalent to
 
          {
                  for-init-statement
                  while ( condition ) {
                          statement
                          expression ;
                  }
          }
  except  that  names declared in the for-init-statement are in the same
  declarative-region as those declared in the condition, and except that
  a  continue in statement (not enclosed in another iteration statement)
  will execute expression before re-evaluating condition.   [Note:  Thus
  the  first statement specifies initialization for the loop; the condi-
  tion (_stmt.select_) specifies a test,  made  before  each  iteration,
  such  that  the  loop  is exited when the condition becomes false; the
  expression often specifies incrementing that is done after each itera-
  tion.  ]
 
2 Either  or both of the condition and the expression can be omitted.  A
  missing  condition  makes  the  implied  while  clause  equivalent  to
  while(true).
 
3 If  the  for-init-statement is a declaration, the scope of the name(s)
  declared extends to the end of the for-statement.  [Example:
          int i = 42;
          int a[10];
 
          for (int i = 0; i < 10; i++)
                  a[i] = i;
 
          int j = i;        // j = 42
   --end example]

n°21799
janoscoder
Posté le 02-04-2001 à 14:33:13  profilanswer
 

l'exemple d'n bas me semble explicite

n°21813
kadreg
profil: Utilisateur
Posté le 02-04-2001 à 14:51:08  profilanswer
 

Merci pour l'addresse déjà. J'avais oublié un niveau de {} dans l'expansion.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°21817
janoscoder
Posté le 02-04-2001 à 14:59:02  profilanswer
 

microsoft aussi, cf leur fichier d'aide

mood
Publicité
Posté le 02-04-2001 à 14:59:02  profilanswer
 

n°21818
janoscoder
Posté le 02-04-2001 à 14:59:46  profilanswer
 

d'ailleurs, j'ai envoyé un mail à msdn. S'ils le lisent un jour, je vous en dirai des nouvelles.

n°21828
BENB
100% Lux.
Posté le 02-04-2001 à 15:41:09  profilanswer
 

janoscoder a écrit a écrit :

Je vois bien qu'on peut "expander" un for en while, mais est-ce la norme?




Oui! ... et non
La derniere norme te donne raison : i est defini uniquement dans la partie interne de la boucle for...
 
Toutes les precedentes de donnent tors, i est defini dans le scope superieur a la boucle.  
 
Il me semble meme que C ce que tu ecrit est interdit
 
Par contre je ne vois trop de probleme : fait  
int i;
 
for (i...
{
}
 
for(i...
{
}

n°21841
SoWhatIn22
Posté le 02-04-2001 à 16:36:07  profilanswer
 

même pb que toi :)
du coup, obligé de reprendre plein de choses écrites avant...
m'enfin si t'as du code qui vient d'autres plateformes ou d'autres compilo, ce n'est que le début...
 
un ex bete? snprintf qui est quand même une instruction utilisée doit s'appelle avec _snprintf sous visual.
Euh, a part être imcompatible avcec les autres compilo, je ne vois pas l'interet...

n°21845
BENB
100% Lux.
Posté le 02-04-2001 à 16:43:35  profilanswer
 

SoWhatIn22 a écrit a écrit :

même pb que toi :)
du coup, obligé de reprendre plein de choses écrites avant...
m'enfin si t'as du code qui vient d'autres plateformes ou d'autres compilo, ce n'est que le début...
 
un ex bete? snprintf qui est quand même une instruction utilisée doit s'appelle avec _snprintf sous visual.
Euh, a part être imcompatible avcec les autres compilo, je ne vois pas l'interet...




 
snprintf ne fait pas parti (ma connaissance) de la norme tu l'utilises donc a tes risques et perils.
 
Le mieux est d'encapsuler ces choses pour n'avoir a changer l'implementation qu'a un seul endroit. et ce pour TOUT ce qui n'est pas de la norme...
 
la norme C++ ne precise-t-elle pas que ce qui depends de l'implementation doit commencer par _ ?
 
C'est donc MS qui a raison (et ca me fait mal de dire cela)...

n°21907
gilou
Modérateur
Modzilla
Posté le 03-04-2001 à 01:04:50  profilanswer
 

SoWhatIn22 a écrit a écrit :

même pb que toi :)
du coup, obligé de reprendre plein de choses écrites avant...
m'enfin si t'as du code qui vient d'autres plateformes ou d'autres compilo, ce n'est que le début...
 
un ex bete? snprintf qui est quand même une instruction utilisée doit s'appelle avec _snprintf sous visual.
Euh, a part être imcompatible avcec les autres compilo, je ne vois pas l'interet...




 
Je pense que le compilo que tu utilises n'est pas a jour vis a vis des dernieres normes.
Il me semble qu'auparavant, la declaration for (int i=qquechose;...;...) {...} etait equivalente a:
int i;
for (i=qquechose;...;...) {...}  
et ca semble etre typiquement ce qui genere ton message d'erreur
(redefinition de i).
 
Le plus simple dans ces cas la pour avoir un code propre c'est d'effectuer la transformation suivante:
for (i=qquechose;...;...) {...}
  |
  |
  V
{ for (i=qquechose;...;...) {...} }
 
Si c'est le VC++, il y a peut etre une option de compilation ou un pragma qui corrige le pb.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  C++ et boucle for : convention

 

Sujets relatifs
VB : Additions de tableaux sans boucleComment connaitre le temp d'éxécution d'une boucle en C++ ?
[ASP] Utilisation de RECORDCOUNT & boucle avec creation de variable 
Plus de sujets relatifs à : C++ et boucle for : convention


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR