2D-Array sorgt für Programmcrash - wieso ?
-
Hallo Forengemeinde,
ich versuche ein Programm zu erstellen, dass selbständig an bestimmten Uhrzeiten für mich Arbeiten erledigt.
Dazu erstelle ich grade den Rahmen dafür, indem ich in einem zweidimensionalem Array ( Array[x][3] ) jeweils die Stunde, Minute und Sekunde speichern möchte.
Läuft mein Programm, so soll es nicht mehr beendet werden. Weil es nach 24h erneut Zeiten bekommt, an dem es Arbeiten erledigen soll. Ein Autonomes System quasie
Mein Problem momentan ist, dass das Programm bei mehrmaligen Aufrufens ( >5 ) sich einfach beendet. Nun meine Frage an euch:
Woran liegt das ? Sollte ich lieber mit verketteten Listen arbeiten, anstelle des dynamischen 2D-Arrays ?int Gesamtprogramm(){ clrscr(); float MBetr[31],augen,tmp,sum=0.00; for(int i=0;i<31;i++) { augen = rand()%97; if(i%3==0)cout<<"\n"; tmp=(augen/100)+rand()%7+16; tmp+=0.01; sum+=tmp; MBetr[i]=tmp; } time_t sekunden = time(NULL); tm *uhr = localtime(&sekunden); int TagHeute = uhr->tm_mday, KHeute = MBetr[TagHeute]/0.10; //cout<<"TagHeute: "<<TagHeute<<"\nMBetr-Heute: "<<MBetr[TagHeute]<<"\nKHeute: "<<KHeute; int (*DaylyClickList)[3] = new int [KHeute][3]; for(int i=0;i<KHeute;i++) { DaylyClickList[i][1] = rand()%14+8; //Stunde DaylyClickList[i][2] = rand()%60; //Minute DaylyClickList[i][3] = rand()%60; //Sekunde cout<<"\n"<<i+1<<"| "<<DaylyClickList[i][1]<<":"<<DaylyClickList[i][2]<<":"<<DaylyClickList[i][3]; } //Array sortieren von 00:00 bis 23:59 (...) getchar(); return 0; }
-
Anhang: hier noch meine Menüsteuerung, mit der ich arbeite:
int main() { while(1) {clrscr(); cout<<"\n1 Gesamtprogramm\n2 Beenden"; switch(getch()) { case '1': Gesamtprogramm(); break; case '2': return 0; break; default: cout<<"Fehlerhafte Eingabe!";break; } } }
-
Was für ein C++ benutzt du denn?
Ich habe nämlich so meine Zweifel, ob das hier überhaupt compiliert wird:
int (*DaylyClickList)[3] = new int [KHeute][3];
-
Debian4Ever schrieb:
... DaylyClickList[i][1] = rand()%14+8; //Stunde DaylyClickList[i][2] = rand()%60; //Minute DaylyClickList[i][3] = rand()%60; //Sekunde ...Hab Deinen Code nur kurz überflogen, ein Fehler, du musst es so schreiben:
... DaylyClickList[i][0] = rand()%14+8; //Stunde DaylyClickList[i][1] = rand()%60; //Minute DaylyClickList[i][2] = rand()%60; //Sekunde ...
-
Ich nutze eine Umgebung, die mit dem freien Borland C++ Compiler 5.5 arbeitet.
Danke dir für den Hinweis - immer diese Schusselfehler ...
Daran hat es übrigens gelegen, dass das Programm abgestürzt ist.Aber um nochmal auf deine Frage nach der Version zu sprechen zu kommen. wie würdest du
int (*DaylyClickList)[3] = new int [KHeute][3];anders formulieren ? Ein Zweidimensionales dynamisch erzeugtes Array konnte ich bislang nur so fehlerfrei erstellen.
lg
-
Ich bin ehrlich gesagt ein wenig verwirrt. Aber für mich sieht das
int (*DaylyClickList)[3]aus wie ein Array von Funktionszeigern (auf Funktionen vom typ int f()) der Länge drei. Und die Semantik von new T[][] ist mir gänzlich unbekannt, in C++ kenne ich nur new T[size]. Deswegen hab ich angenommen, dass das nicht kompiliert, was es aber tut.
Vielleicht kann uns einer erhellen?
Ich hätte in C++ einen zweidimensionalen Array als ein std::vector von std::vector definiert
std::vector<std::vector<int> > array(dim1, std::vector<int>(dim2));
-
mmazal schrieb:
Ich hätte in C++ einen zweidimensionalen Array als ein std::vector von std::vector definiert
std::vector<std::vector<int> > array(dim1, std::vector<int>(dim2));Unfug..
std::array<std::array<T, N1>, N2> array;
-
314159265358979 schrieb:
mmazal schrieb:
Ich hätte in C++ einen zweidimensionalen Array als ein std::vector von std::vector definiert
std::vector<std::vector<int> > array(dim1, std::vector<int>(dim2));Unfug..
std::array<std::array<T, N1>, N2> array;D'accord. Funktioniert aber nur wenn die Dimensionen schon zur Compilezeit bekannt sind.
-
mmazal schrieb:
314159265358979 schrieb:
mmazal schrieb:
Ich hätte in C++ einen zweidimensionalen Array als ein std::vector von std::vector definiert
std::vector<std::vector<int> > array(dim1, std::vector<int>(dim2));Unfug..
std::array<std::array<T, N1>, N2> array;D'accord. Funktioniert aber nur wenn die Dimensionen schon zur Compilezeit bekannt sind.
Die innere ist bekannt.
std::vector<std::array<T, 3>> vec;
-
Warum nicht Nägel mit Köpfen machen und vernünftige Datenstrukturen verwenden? Über die Klasse Timestamp kann man sich natürlich noch Gedanken machen, ob da ein time_t nicht auch funktioniert, z.B. für einmalige Aufgaben.
class Timestamp { unsigned char Hour; unsigned char Minute; unsigned char Second; ... }; class Task { Timestamp Timestamp; ... }; std::vector<Task>