Aujourd'hui, alors que j'essayais d'écrire du code pour simplement ajouter et soustrayez les deux matrices 2 * 2, dans lesquelles j'ai utilisé une déclaration commutateur em>, j'ai eu une erreur: Initialisation du bypass de cas de la variable locale en fonction principale () p>
blockQuote> J'ai également constaté que je peux prendre le débarras de cette erreur en plaçant le code de cas (s) des cas (s), maintenant, p> (Je sais que je n'ai pas utilisé les nouvelles conventions de codage, telles que
code h3>
code> ... li>
Case Code> .... Li>
ol>
3 Réponses :
Après avoir repoussé votre code et modifier quelques éléments de sorte qu'il compile sur mon système, g ++ compile-le sans avertissements.
Ma meilleure estimation est que cela a quelque chose à voir avec les anciennes règles pour la portée d'un objet déclaré en une boucle pour la boucle (elle vivait jusqu'à la fin de la portée entourant; dans le C ++ moderne, il est limité à la boucle elle-même), mais je ne peux pas vraiment être sûr. P>
Pour nous aider à comprendre cette Out, veuillez indenter le code correctement et vous montrer le message d'erreur exact, y compris le numéro de ligne. Si l'erreur indique "Line 42: ...", ajoutez un commentaire dans votre source comme EDIT: Oui, je pense que c'est le problème . Dans Modern C ++, votre code est correct, car les variables de boucle sont scopées aux boucles elles-mêmes. Apparemment, Turbo implémente une version très ancienne de la langue, de sorte que votre variable edit2: ou mieux encore, arrêtez d'utiliser Turbo C ++ et obtenez un compilateur moderne. p> Edit3: Et la raison pour laquelle le compilateur met en garde à ce sujet est que même s'il semble que Un moyen plus propre de travailler autour de cela est probablement de plonger chaque // ceci est la ligne 42 code>. P>
A code>, par exemple, est visible jusqu'au bas de l'instruction code> (code>. Englobant chaque
pour code> La boucle dans les accolades bouclées doit éviter l'avertissement: p>
i code> est toujours initialisé avant utilisation, vous pouvez en principe référence à
i Code> dans le cas
2: code> section, contourner l'initialisation. (Encore une fois, cela ne s'applique que sous les anciennes règles.) P>
case code> section dans les accolades: p>
switch (choice) {
case 1: {
...
break;
}
case 2: {
...
break;
}
}
Respecté Monsieur, en fait, il n'ya aucun moyen de le faire dans Turbo C ++, et le message d'erreur est identique tel que montré par moi dans le texte en gras, dans la question
Ah bon? Cela vous donne simplement un message d'erreur sans vous dire quelle ligne dans la source à laquelle il se plaint? Ou est-ce qu'il vous vaut dans un éditeur avec le curseur de la ligne offensante? Si oui, quelle ligne est-ce?
Il met en évidence le texte "Case 1:" Seulement
Mon +1, c'est la bonne réponse. Veuillez créer un lien vers Ceci , qui montre qu'il fonctionnera avec le compilateur compilateur standard tel que GCC.
Ah oui, cela pourrait être l'ancien pour code> Scoping. Wow, c'est vieux.
Il y a une vieille astuce macro pour ce problème. Strictement illégal mais ça marche #define pour if (0); sinon pour code>. Mettez cela au début de votre code et chaque boucle est placée dans un bloc d'autre et que les règles de décomposition appropriées s'appliquent. M'a sauvé des jours de travail une fois et je me suis souvenu depuis.
Turbo C ++ (à partir des années 1990) est Obligatoire i> par de nombreuses écoles d'ingénieurs indiennes (ou requises i> au lieu de stages obligatoire i> pour les étudiants). C'est toujours i> l'affaire en 2020, comme documenté dans plusieurs Vidéos de Joshua Fluke (Je ne trouve pas de référence exacte, mais c'est au cours de la dernière année ou plus).
A Par exemple: P> case code> N'EST PAS une nouvelle portée par elle-même. Toute variable que vous déclarez dans l'une quelconque est visible pour le reste de l'instruction code> commutateur code>. Mais dans l'autre
case code>, il est ininitialisé. En ajoutant les accolades, vous créez une nouvelle portée afin que les autres blocs ne puissent pas le voir.
switch (choice)
{
case 0:
int a = 42;
break;
case 1:
std::cout << a << std::endl; // 'a' is uninitialized here
break;
}
switch (choice)
{
case 0:
{
int a = 42;
break;
}
case 1:
std::cout << a << std::endl; // error -- 'a' is not declared here
break;
}
Vous voudrez peut-être créer un lien vers (this) [ ideone.com/tgput] GCC-4.3.4 ne montre aucune erreur.
@Als: L'avez-vous essayé avec -wall?
@Als: Vous voulez dire ici . C'est le code de l'OP? Comme je l'ai dit, je ne vois pas cette situation dans ce code. Je ne pense pas que nous voyons le code avec le problème ou avec les accolades qui le corrigent.
Un relevé de commutation est juste un tas d'étiquettes et un Toutefois, dans une instruction code> Switch code>, si vous avez une variable locale: p> goto code> effectué par le compilateur en fonction de la valeur de la chose à l'intérieur du commutateur code> test p> quand vous Avoir une variable locale dans une fonction, n'importe où après la déclaration de cette variable, vous pouvez l'utiliser. Par exemple: p>
case a:
int a;
break;
case b:
// we can use a here because these cases are just labels used in a goto
// i.e. the cases do *not* create a new scope
Je ne vois pas une situation similaire dans le code posté. Infact Il compile joyeusement sur GCC, Ideone.com/tgput
@Als oui je sais, car la portée des variables dans la boucle pour code> est contrôlée, mais je ne sais pas comment il pourrait obtenir ce message d'erreur sans cette situation, donc j'ai supposé que le code n'est donc pas " t la source de l'erreur, ou ce n'est pas réel.
Parce qu'il utilise un ancien compilateur de merde qui ne se conforme pas aux normes.
@Als: être juste, il est probablement conforme à la norme de facto qui existait à l'époque. Je pense que STROSTRUP mentionne ce problème dans "la conception et l'évolution de C ++".
Quelle ligne de code génère cette erreur?
Ce n'est pas une réponse, mais les deux branches de la déclaration de cas ajoutent les deux matrices, et rien ne les imprime ensuite. Je suppose que ce n'est pas ce que tu voulais dire.
Le texte audacieux ne nous dit pas quelle ligne il fait référence à; voir ma réponse.