Problem bei einer Aufgabe
-
Also hab grad deinen Code getestet, ist wie bei mir. Er bricht ab in Zeile 24 mit der arrayoutofbounceexception ab.
@noobLolo http://swt.informatik.uni-halle.de/lehre/2009ws/oop/
dort sind unten die bisherigen Skripte zu C1 bis C4.
SInd eben einfache Vorsprachen um langsam zu c# heranzuführen.
mit einem C4 compiler kann ich leider nicht diehnen,da es nur dateien gibt, um im Linux terminal zu kompilieren
-
Hab es jetzt nochmal geändert.Mein Code sieht nun so aus:
prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else temparray[i] = a1[p1]; p1=p1+1; i=i+1; } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} while(i>=laenge/2){ helpliste[a]=liste[g]; a=a+1; g=+1;} mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
Leider bricht er mit folgender Fehlermeldung ab:
line 60:27: Error: ArrayIndexOutOfBoundException
Im Skript steht dazu:
Für Indexzugriffe idx auf eine Reihung x muss
0 <= idx < x.Length gelten
+ Ansonsten bricht das Programm mit einer
ArrayIndexOutOfBoundException ab.
Jemand noch eine Idee, erkenne nämlich wirklich nicht warum mein array überläuft...
-
evtl. weil du i nicht änderst und in ne endlos schleife rennst?
while(i>=laenge/2){ helpliste[a]=liste[g]; a=a+1; g=+1; }
-
prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else temparray[i] = a1[p1]; p1=p1+1; i=i+1; } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} if(i==10){ while(i<laenge){ helpliste[a]=liste[g]; a=a+1; g=g+1; i=i+1;} } mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
So jetzt läuft es schonmal im mergesort-Teil,nur im merge-Teil kommt jetzt der Fehler.Langsam verzeifel ich echt.
line 19:32: Error: ArrayIndexOutOfBoundException Aborted
Da läuft nun auch noch ein array über -.-
-
Setz mal den else-Zweig auch in geschweifte Klammern:
void merge(int [] a1, int l1,int [] a2, int l2){ (...) while (i < l1 + l2){ (...) else {temparray[i] = a1[p1]; // <- hier p1=p1+1; i=i+1;} // <- und da }
-
ALso mein Programm zeigt mir jetzt keine Fehler mehr an , aber nach der EIngabe der 20 Zahlen passiert absolut nichts
Das Programm wird einfach beendet...ich krieg echt eine Krise, kann mir bitte einer erklären warum das passiert?Ist doch absolut traurig.prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ a1= new int[20]; a2= new int[20]; int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} if(i==10){ while(i<laenge){ helpliste[a]=liste[g]; a=a+1; g=g+1; i=i+1;} } mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
-
Bau dir eine Funktion printArray(int [] array, int length) mit der du Arrays ausgeben kannst. Dann gebe Zwischenergebnisse aus: Das eingelesene Array, das Array das mergesort bekommt, die Teilarrays die mergesort übergibt, die Arrays die merge bekommt, Zwischenarrays und so weiter. Dann siehst du an welcher Stelle der Fehler auftritt und kannst ihn beheben.
-
BAUKO schrieb:
... aber nach der EIngabe der 20 Zahlen passiert absolut nichts
Das unsortierte "array" wird zwar an "mergesort" übergeben, aber
-> an keiner Stelle im Programm wird nach "array" etwas zurückgeschrieben. Weder direkt noch indirekt via Zeiger o.ä.
-
Hab es versucht gleich nach dem einlesen der 20 Zahlen die wieder auszugeben. das passiert aber schon nicht. sehr merkwürdig...woran kann das liegen?
-
// print(array[g]); printArray(array[g]);
-
ok hab jetzt den fehler erstmal gefunden warum der gar nichts ausgegeben hat,
lag an der Zeile 90: print("\n");
das löscht irgendwie alles oder so
ABer nun wird mir am Ende nur die 20 Zahlen ausgegeben, wie ich sie eingegeben habe???
Liegt das vielleicht daran was mergemann geschrieben hat?:Das unsortierte "array" wird zwar an "mergesort" übergeben, aber
-> an keiner Stelle im Programm wird nach "array" etwas zurückgeschrieben. Weder direkt noch indirekt via Zeiger o.ä.
-
Eigentlich sollte es eine neue Zeile anfangen, also quasi ein Enterzeichen.
Stimmen denn die Arrays innerhalb von merge und mergesort?
-
nwp2 schrieb:
also quasi ein Enter
das hab ich doch schon irgendwann von irgendwem gehört *rofl*
-
hmm nee, hab versucht die helpliste auszugeben noch vor Zeile 68,bekomme aber nix raus.nur 0000000000, also 10 nullen... noch eine idee?
-
Nimm mal das if weg:
void mergesort(int [] liste, int laenge){ (...) // if(i==10){ while(i<laenge){ helpliste[a]=liste[g]; a=a+1; g=g+1; i=i+1;} // } (...) }
Sonst kriegt helpliste nur im allerersten Durchgang etwas zugewiesen.