Fehlermeldung bei Zugriff auf dynamisches Array
-
Bei array<datentyp, anzahl> muß die anzahl schon zur Kompilierungszeit feststehen (da es ein Template-Parameter ist) - in deinem Programm fragst du aber explizit zur Laufzeit nach der Größe (daher vector<>).
-
Thorsten54 schrieb:
warum sieht man diese neuen arrays nicht so oft in Foren
Weil häufig Fragen in Foren von ***-Programmierern gestellt werden und nicht von solchen, die vernünftige Datenstrukturen kennen.
-
ich habe das jetzt mal mit arays gemacht die ich eine classe abgekapselt habe hier ist die member die die nächste generation berechnet hier müsste der fehler liegen
void berechnen() { for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { zellen = 0; if ((i > 0) && (j > 0) && (Feld[i - 1][j - 1] == 1))zellen++; if ((i > 0)&&(Feld[i - 1][j] == 1))zellen++; if ((i > 0) && (j < (y - 1)) && (Feld[i - 1][j + 1] == 1))zellen++; if ((j > 0) && (Feld[i][j - 1] == 1))zellen++; if ((j < (y - 1)) && (Feld[i][j + 1] == 1))zellen++; if ((i < (x - 1)) && (j > 0) && (Feld[i + 1][j - 1] == 1))zellen++; if ((i < (x - 1)) && (Feld[i + 1][j] == 1))zellen++; if ((i < (x - 1)) && (j < (y - 1)) && (Feld[i + 1][j + 1] == 1))zellen++; if ((zellen < 4) && (zellen > 1) && (Feld[i][j] == 1)) { Temp[i][j] = 1; } if (zellen == 3) { Temp[i][j] = 1; } } return; }
-
Hallo
bist Du sicher, dass Du uns den Code zeigst, der den Fehler produziert? Welcher Fehler tritt den noch auf?
- berechne ist momentan keine Member, sondern eine freie Funktion?
- i, j, und zellen sollten lokale Variblen sein, sind aber globale Variablen, warum?
- x, y, Feld und Temp sind ebenfalls globale Varibale, aber Du schreibst Du hast das in eine Klasse gekapselt?
Die Logik sieht sonst soweit ok aus, wenn man davon ausgeht, dass Feld und Temp jeweils vom richtigen Typ sind und die Größen x,y haben. Außerdem müssen alle Felder von Temp mit 0 vorbelegt sein.
-
nein nein berechnen und alle variablen(außer x,y das sind globale const) sind member der classe field ich habe aber
ich habe jetzt nur den teil hochgeladen in dem ich den Fehler vermute
hier kommt mal alles:#include<iostream> #include<time.h> #include<conio.h> using namespace std; int const y = 2, x = 2; class field { public: bool Feld[x][y]; bool Temp[x][y]; short i, j,zellen,sp; int generation; void ausgeben() { system("cls"); cout << generation++ << ".Generation" << endl; for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { if (Feld[i][j] == 0) { cout << " "; } else { cout << "#"; } } cout << endl; } return; } void berechnen() { for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { zellen = 0; if ((i > 0) && (j > 0) && (Feld[i - 1][j - 1] == 1))zellen++; if ((i > 0)&&(Feld[i - 1][j] == 1))zellen++; if ((i > 0) && (j < (y - 1)) && (Feld[i - 1][j + 1] == 1))zellen++; if ((j > 0) && (Feld[i][j - 1] == 1))zellen++; if ((j < (y - 1)) && (Feld[i][j + 1] == 1))zellen++; if ((i < (x - 1)) && (j > 0) && (Feld[i + 1][j - 1] == 1))zellen++; if ((i < (x - 1)) && (Feld[i + 1][j] == 1))zellen++; if ((i < (x - 1)) && (j < (y - 1)) && (Feld[i + 1][j + 1] == 1))zellen++; if ((zellen < 4) && (zellen > 1) && (Feld[i][j] == 1)) { Temp[i][j] = 1; } if (zellen == 3) { Temp[i][j] = 1; } } return; } } void füllen() { srand((unsigned)time(0)); for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { Feld[i][j] = 0; sp = rand() % 100; //if (sp % 4 == 2) { Feld[i][j] = 1; //} } } return; } void gleichen() { for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { Feld[i][j] = Temp[i][j]; } } return; } void fullen() { for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { Temp[i][j] = 0; } } return; } }; int main(int argc, char**argv[]) { field f; bool kontrolle = 1; short eingabe; f.füllen();//Füllt Feld mit zufälligen true oder false while (kontrolle) { cout << "Start:Enter" << endl << "Verlassen:ESC" << endl << "Optionen:O" << endl << "<<:"; eingabe = _getch(); switch (eingabe) { case 13://Weiter kontrolle = 0; break; case 'O': case 'o': break; case 27://Beenden return 0; break; default: system("cls"); break; } } f.generation = 0; while (true) { if (_kbhit()) { eingabe = _getch(); if (eingabe == 27) return 0; f.ausgeben();//Gibt Feld aus f.fullen();//Füllt Temp mit nullen aus f.berechnen();//Berechnet nächste genation in Temp f.gleichen();//Kopiert Temp in Feld } } return 0; }
-
Hallo,
Du könntest schon noch dazu sagen, welchen Fehler Du in Deinem aktuellen Code beobachtest. Dann ist das Suchen deutlich einfacher. Du kannst auch Deinen Code debuggen und Schritt für durchgehen. Dann siehst Du auch gleich, an welcher Stelle etwas passiert, was Du so nicht erwartet hast.
Das return in Zeile 63, ist an der falschen Stelle. Das gehört in die Zeile unter die nächste schliessende geschweifte Klammer, sonst brichst Du die for(i=...) -Schleife vorzeitig ab. Das return ist sowieso unnötig, Du kannst es gleich ganz weglassen.
-
Nach der 0.Generation gibt es keine lebenden zellen mehr
Thorsten54
-
Du hast in deinem "berechnen" ein return versteckt, das da nicht hingehört. Kompiliere mit Warnungen!
Ich habe den Code nur mal schnell dem Compiler zum Angucken gegeben und schon sehe ich bei deiner Loop
for (i = 0; i < x; i++) {
die Warnung "Loop will run at most once (loop increment never executed) [-Wunreachable-code-loop-increment]"Außerdem sollen deine Loop-Variablen LOKALE Variablen sein. Wie weit deine Loop gerade fortgeschritten ist, ist NICHT ein beschreibendes Element deiner Klasse!
-
Ja vielen dank aber ich weiß nicht wie ich die warnungen in visual c++ 2017 so konfigurie das er mich auf sowas Hinweist ich habe das schon gegoogelt aber da ließ sich nichts finden und die codeanalyse
hab ich auch so eingestellt das alle möglichen fehler angezeigt werden
Vielleicht könnte mir jemand an der aktuellen version beschreiben wie man das einstellt
Thorsten54
-
Schau dir mal https://www.youtube.com/watch?v=zMrP8heIz3g&index=6&list=PLs3KjaCtOwSbij6EOk7K-ZgKKcxH7yVHC (und die Nachfolgende Episode) an. Da wird erklärt, wie man Visual Studio 2017 so einrichtet, dass man gutes Tooling hat.