über die geschweiften Klammern in case-Anweisung im switch
heute, während ich versuchte zu schreiben, ein code, fügen Sie einfach & subtrahieren Sie die zwei 2*2-Matrizen, in denen ich switch-Anweisung, ich bekam eine Fehlermeldung Fall umgehen Initialisierung von lokalen Variablen in der Funktion main()
#include <iostream.h>
#include <conio.h>
#include <string.h>
int
main()
{
int mat1[2][2], mat2[2][2], mat3[2][2];
cout << "Enter the elements in the first matrix";
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cin >> mat1[i][j];
}
}
cout << "\n\nEnter the elements of the second matrix";
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
cin >> mat2[k][l];
}
}
cout << "\n\nsaved......";
int choice;
cout << "\n\n\nFor adding these two matrices,press 1";
cout << "\nFor subtracting these two matrices,press 2";
cin >> choice;
switch (choice) {
case 1:
cout << "The addition of the two matrices will yield";
for (int a = 0; a <= 1; a++) {
for (int b = 0; b <= 1; b++) {
mat3[a][b] = mat1[a][b] + mat2[a][b];
}
}
break;
case 2:
cout << "The subtraction of the two matrices will yield";
for (int c = 0; c <= 1; c++) {
for (int d = 0; d <= 1; d++) {
mat3[c][d] = mat1[c][d] - mat2[c][d];
}
}
break;
}
getch();
return 0;
}
Fand ich auch, dass ich den Fehler beheben indem Sie den code von case(s) ,in Klammern, JETZT,
- meine Verwirrung ist über die
error
... - & das Erfordernis der Klammern in
case
....
(Ich weiß, ich habe nicht die neue Codierung Konventionen, wie <iostream>
, std-namespace etc. etc. wie ich geschrieben habe es in turbo-c++ - compiler, so dass ein bis zu dem Punkt beantworten, ist demütig erbeten)
Können Sie bitte "Einzug" der code? Danke.
Welche Codezeile erzeugt den Fehler?
Dies ist keine Antwort, aber in beiden Zweigen der case-Anweisung hinzufügen, die beiden Matrizen, und nichts druckt Sie wieder aus, danach. Ich vermute, dass ist nicht das, was du meintest.
thompson: Fertig
Bitte fügen Sie die Fehlermeldung.
Welche Codezeile erzeugt den Fehler?
Dies ist keine Antwort, aber in beiden Zweigen der case-Anweisung hinzufügen, die beiden Matrizen, und nichts druckt Sie wieder aus, danach. Ich vermute, dass ist nicht das, was du meintest.
thompson: Fertig
Bitte fügen Sie die Fehlermeldung.
InformationsquelleAutor nobalG | 2011-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer switch-Anweisung wird nur eine Reihe von Etiketten und eine
goto
geschieht durch die compiler-abhängig vom Wert der Sache innerhalb desswitch
test.Wenn Sie eine lokale variable in einer Funktion, überall Vergangenheit der Deklaration dieser Variablen, die Sie verwenden können. Zum Beispiel:
Jedoch in einem
switch
- Anweisung, wenn Sie eine lokale variable:So, wenn Sie haben eine variable in einem
case
die variable existiert incase
s unten, aber die variable wird nicht existieren, da der code, initialisiert es wurde übersprungen, indem die case-Anweisung. Es ist schwer für mich zu erklären, vielleicht kann jemand anders einen besseren job machen.Den Klammern dieses problem zu beheben, weil Sie die lokale variable, so dass es nicht vorhanden ist in den nachfolgenden
case
s. Es wird nur erstellt, wenn, insbesonderecase
eingegeben wird, und wenn Sie vergessen, einebreak
und Kontrolle durch fällt die nächstecase
das Ende}
endet der Anwendungsbereich und bewirkt, dass die variable zerstört werden, so ist es nicht zugänglich von der nächstencase
, und die Initialisierung kann nicht übersprungen werden.Also nur daran erinnern, dass alle
case
s-Aktie Rahmen. Das könnte helfen, Sie verstehen.ja ich weiß, da der Gültigkeitsbereich der Variablen in der
for
Schleife gesteuert wird, aber ich weiß nicht, wie er bekommen konnte, dass die Fehlermeldung ohne, dass die situation, so dass ich davon ausgegangen, dass der code nicht die Quelle des Fehlers, oder es ist nicht real.Weil er mit einem beschissenen alten compiler, die nicht konform zu den standards.
Um fair zu sein, wahrscheinlich angepasst an die de-facto-standard, dass zu der Zeit gab es. Ich denke Stroustrup erwähnt dieses Problem in "The Design and Evolution of C++".
InformationsquelleAutor Seth Carnegie
Nach dem erneuten Einrücken von code und ändern ein paar Dinge, damit es kompiliert auf meinem system, g++ compiliert ohne Warnungen.
Meine beste Vermutung ist, dass es hat etwas zu tun mit den alten Regeln für den Umfang eines Objekts erklärt in einer for-Schleife (es verwendet, um zu Leben bis zum Ende des umschließenden Bereich; in der modernen C++ - es ist beschränkt auf die Schleife selbst), aber ich kann nicht ganz sicher sein.
Uns zu helfen, dies herauszufinden, bitte Einrücken der code richtig, und zeigen Sie uns die genaue Fehlermeldung, inklusive der Zeilennummer. Wenn der Fehler sagt, "Linie 42: ...", fügen Sie einen Kommentar in Ihren Quellcode wie
//this is line 42
.EDIT: ja, ich denke, dass ist das problem. In der modernen C++ - code ist ok, da die Schleife die Variablen stammen aus dem Bereich der Schleifen selbst. Offenbar Turbo implementiert eine sehr alte version der Sprache, also Ihre Variablen
a
ist beispielsweise sichtbar den ganzen Weg auf den Boden derswitch
- Anweisung. Umschließt jedenfor
Schleife in geschweiften Klammern zu vermeiden, sollte die Warnung:EDIT2: Oder noch besser, halt mit Turbo C++ und erhalten Sie einen modernen compiler.
EDIT3: Und der Grund, dass der compiler warnt davor, über dieses ist, dass, obwohl es scheint, dass
i
ist immer initialisiert, bevor Sie verwendet wird, könnten Sie im Prinzip findeni
imcase 2:
Abschnitt, unter Umgehung der Initialisierung. (Auch dies gilt nur unter den alten Regeln.)Einen saubereren Weg, dies zu umgehen ist wohl zu schließen Sie jede
case
Abschnitt in Klammern:(oder, wieder, erhalten einen modernen compiler, es sei denn, Sie haben einen wirklich guten Grund zu halten mit Turbo C++).
Wirklich? Man erhält nur eine Fehlermeldung, ohne zu sagen, welche Zeile in der Quelle beschweren? Oder ist es dump Sie in einen editor mit dem cursor auf die betreffende Zeile? Wenn ja, welche Zeile ist es?
es unterstreicht den text "Fall 1:" nur
Meine +1, Dies ist die richtige Antwort. Bitte link zu dieser, die zeigt, dass es funktioniert mit Standard-konformen compiler wie gcc.
Ah ja, es könnte sein, das alte
for
scoping. Wow, das ist alt.InformationsquelleAutor Keith Thompson
Einen
case
block nicht einen neuen Bereich von selbst. Jede variable, die Sie deklarieren, innerhalb einer sichtbar ist für den rest derswitch
- Anweisung. Aber auch in den anderencase
Blöcke, es ist nicht initialisiert. Durch das hinzufügen der Klammern, erstellen Sie einen neuen Bereich, so dass die anderen Blöcke können es nicht sehen.Beispiel:
Ich sehe nicht eine situation wie diese in den code, den Sie geschrieben, aber das ist, was die Fehlermeldung bedeutet.
Hast du es mal mit -Wall?
Du meinst hier. Das ist der OP-code? Wie gesagt, ich sehe nicht, diese situation in diesem code. Ich glaube nicht, dass wir sehen, dass der code mit dem problem oder mit der geschweiften Klammern, es zu beheben.
Ja, es ist OP-code.
InformationsquelleAutor Fred Larson