Warning: Statement with no effect pour une boucle for(i; i
ClicCool
Membre
Bonjour,
Je me retrouve avec un warning que je pige pas :-\\
Au Build And Analyse j'ai le warning "[tt]Statement with no effect[/tt]" sur la ligne for(...) ci dessous:
Elle est pas belle ma boucle ? ???
Je me retrouve avec un warning que je pige pas :-\\
Au Build And Analyse j'ai le warning "[tt]Statement with no effect[/tt]" sur la ligne for(...) ci dessous:
UInt whatToImport = 0;<br />for (whatToImport; whatToImport<11; whatToImport++) {<br />.../...<br />}
Elle est pas belle ma boucle ? ???
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bon, en fait, rien qu'en lisant le titre j'aurais dit "toi, t'as mis un point-virgule à la fin de ton "for(...,...,...);" du coup il te signale que t'as une boucle vide !"... et raté, c'était même pas ça ;D
En fait le warning me semble clair : tu as, dans ta ligne de ta boucle for, une instruction qui ne sert à rien, car n'a aucun effet. Et cette instruction, c'est évidemment le "whatToImport" que tu as mis tout seul au début et qui ne sert à rien car il ne définit pas de variable ni d'affecte de valeur...
Si ça te permet d'y voir plus clair, n'oublies pas que est équivalent à C'est à dire que la première instruction [tt]<a>[/tt] sert à initialiser tes variables, [tt]<b>[/tt] au test, [tt]<c>[/tt] à l'instruction à exécuter juste avant de reboucler (typiquement une incrémentation), et [tt]<d>[/tt] est le corps de ta boucle.
Là ton instruction [tt]<a>[/tt] ne fait rien, c'est juste comme si tu écrivais, sur une ligne toute seule, un qui ne fait rien !
Donc soit tu initialises ton whatToImport dans le for quitte à déclarer whatToImport dans l'instruction d'initialisation du for aussi : comme ça au moins la première instruction sert à qqch... soit tu ne mets rien comme première instruction dans ton for puisque tu l'as déjà initialisé plus haut :
Eh Oh, si t'avais lu l'auteur aussi t'aurais jamais pensé ça ! :P
Si ? :-\\
Ah bon ! :P
Ah MERCI!Â
Comme un ballot je pensais 'statement' comme la ligne entière et non pas pensé à chacun des 3 'statements' inclus !
Bon alors OK, elle est fonctionnelle mais elle est pas belle ma boucleÂ
Pourtant je trouve plus clair à la lecture d'écrire ainsi.
C'est grave docteur ?
ça ralenti l'exécution ?
PS, de toutes façon je vais faire comme t'as dit pour plus avoir ce warning qui fait tache, j'aime mieux voir le rassurant bandeau vert "No Issue" dans mes Build ResultsÂ
C'est pour ça que j'utilise une des deux autres que je t'ai proposées, déclarer ta variable avant ton for et l'initialiser dans ton for, ou déclarer et initialiser tout dans ton for.
Enfin après à toi de voir... tu mets à l'intérieur de ton for ou pas, comme tu le sens... dans ton for(t) intérieur ;D
J'savais même pô qu'on pouvait déclarer des variables dans un For ... ou alors j'ai oublié ... j'ai jamais tué d'chat ... Ou i sentait pas bon ...
[EDIT](reminiscences de Jacques Brel ...)
Un peu trop tordu pour moi, mais bon à savoir.
Merci
En tout cas en déclarant ma variable directement dans le "for" dans mes projets Xcode en Objective-C, je n'ai jamais eu de soucis et aucune gueulante du compilateur.
Par contre si je code en C ANSI (comme il m'arrive de temps en temps de faire un ".c" via vi et de le compiler via le terminal pvia gcc ensuite), là oui en effet cette syntaxe n'est pas autorisée et l'on est obligés de déclarer toutes nos variables en début de bloc et pas n'importe où, boucle for ou pas.
Mais bon je fais quand même 1000x plus d'Objective-C que je ne fais du C ANSI ;D
Pas jusqu'à Leopard en tout cas:
[EDIT]
en fait je crois que c'est C89 pour les compilos <=4.0 et C99 au dessus (Xcode 3)
Ou alors c'est une tolérance de l'Objective-C, tolérance empruntée au C99 donc, que d'accepter ces déclarations dans le for ?
par contre, dans un switch sans bloc d'accolades, là c'est interdit (et qd ça m'est arrivé j'ai mis du temps à capter) :
Non les variables en début de bloc ne sont plus obligatoires depuis le C95. Heureusement d'ailleurs.
Pour autoriser la syntaxe for(int ...), il faut effectivement demander le C99, et là souvent il faut mettre -std=C99 comme option de compilation.
Quand au C ANSI, il y a vraiment des pros qui utilisent encore ce vieux truc ?
Oui il y a une option de cochée par défaut dans les Infos pour que le C99 soit opérationnel.
Il y a une certaine logique dans cette obligation du compilateur : en effet on peut très bien ne pas mettre de break à la fin d'un case, auquel cas les lignes de code du case suivant sont exécutées. Dès lors la portée de la variable créée est imprécise.