Fehlermeldung: stack around variable 'a' was coruupted:Bitte um Hilfe
Hallo zusammen, ich hab da mal ein Problem, wir haben aufgaben aus der Schule bekommen, bin auch grad dabei diese zu lösen, allerdings kommt bei mir immer die Fehlermeldung "Run-Time Check failure #2 - Stack around variable 'a' was corupted", die zahlen waren mit in der Aufgabe angegeben und hab sie so 1 zu 1 übernommen, da ich noch alle anderen aufgaben machen muss, bitte ich euch mit zu den anderen keine lösungsvorschläge zu geben.
hier mal der code:
Richtig rechnet er ja nur die Fehlermeldung stört
Ich danke schonmal für die Hilfe.
hier mal der code:
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include<iostream> using namespace std; void addiere (int zahl1[],int zahl2[], int ergebnis[], int größe){ int übertrag=0; for (int i=0;i<=größe;i++){ if(zahl1[i]<0||zahl1[i]>9){ zahl1[i]=0; } if (übertrag==1){ ergebnis[i]=zahl1[i]+zahl2[i]+übertrag; }else { ergebnis[i]=zahl1[i]+zahl2[i]; } if (ergebnis[i]>=10){ ergebnis[i]=ergebnis[i]-10; übertrag=1; } else { übertrag=0; } } } void subtrahiere (int zahl1[],int zahl2[], int ergebnis[]){ } void multipliziere (int zahl1[],int zahl2[], int ergebnis[]){ } void dividiere (int zahl1[],int zahl2[], int ergebnis[]){ } void gibaus (int zahl[],int anzahlstellen){ for(int i=anzahlstellen;i>=0;i--){ if(zahl[i]>=0&&zahl[i]<10){ cout << zahl[i]; if(i%3==0&&i>0){ cout << "."; } } } } void main(){ int a[]={7,2,4,4,6,1,9,0,2,5,4}; int b[]={3,6,6,9,1,3,1,0,0,8,7,2,7,5,5,2}; int länge=sizeof(b)/sizeof(int); int c[200]; addiere(a,b,c,länge); gibaus(c,länge); }
Richtig rechnet er ja nur die Fehlermeldung stört

Ich danke schonmal für die Hilfe.
Array a[] hat weniger stellen als array b[] du gibst aber in der while schleife die berechnung der länge von b als anzahl der durchläufe an. dadurch versucht er auf eine ungültige position von a zu zugreifen, da du ja weiter rechnest.
Btw. die abfrage zwecks deines übertrags ist sinnlos denn a+b+0 == a+b.
Btw. die abfrage zwecks deines übertrags ist sinnlos denn a+b+0 == a+b.
ja das hab ich mitbekommen, deshalb geb ich ihm ja 0 als werte wenn nichts drin steht, scheint aber nicht zu reichen.
hab da auch noch ein anderes problem wo ich grad auf dem schlauch stehe und zwar macht er mir bei der addition einen zu vie im letzten array und bei subtraktion einen zu wenig?
also bei der addition bekommt zahl1 im letzten array den wert 1 deshalb die falsche rechnung, wie kann ich das verhindern?
ich hab da mal ein paar sachen auskommentiert dann klappts und auch die array´s auf gleicher größe gebracht, aber kann man die leeren arrays nicht so als nullen nachdeklarieren? weil wenn man selber zahlen eingibt hab ich ja das selbe problem?
hab da auch noch ein anderes problem wo ich grad auf dem schlauch stehe und zwar macht er mir bei der addition einen zu vie im letzten array und bei subtraktion einen zu wenig?
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #include<iostream> using namespace std; void addiere (int zahl1[],int zahl2[], int ergebnis[], int größe){ int übertrag=0; for (int i=0;i<größe;i++){ if(zahl1[i]<0||zahl1[i]>9){ zahl1[i]=0; } ergebnis[i]=zahl1[i]+zahl2[i]+übertrag; if (ergebnis[i]>=10){ ergebnis[i]=ergebnis[i]-10; übertrag=1; } else { übertrag=0; } } } void subtrahiere (int zahl1[],int zahl2[], int ergebnis[],int größe){ int übertrag=0; for (int i=0;i<größe;i++){ if(zahl1[i]<0||zahl1[i]>9){ zahl1[i]=0; } if (übertrag==1){ zahl1[i]++; } if(zahl2[i]<zahl1[i]){ zahl2[i]=zahl2[i]+10; übertrag=1; } else { übertrag=0; } ergebnis[i]=zahl2[i]-zahl1[i]; } } void multipliziere (int zahl1[],int zahl2[], int ergebnis[]){ } void dividiere (int zahl1[],int zahl2[], int ergebnis[]){ } void gibaus (int zahl[],int anzahlstellen){ for(int i=anzahlstellen;i>=0;i--){ if(zahl[i]>=0&&zahl[i]<10){ cout << zahl[i]; if(i%3==0&&i>0){ cout << "."; } } } } void main(){ int a[]={7,2,4,4,6,1,9,0,2,5,4}; int b[]={3,6,6,9,1,3,1,0,0,8,7,2,7,5,5,2}; int länge=sizeof(b)/sizeof(int); int c[200]; addiere(a,b,c,länge); gibaus(c,länge); cout << endl; subtrahiere(a,b,c,länge); gibaus(c,länge); }
also bei der addition bekommt zahl1 im letzten array den wert 1 deshalb die falsche rechnung, wie kann ich das verhindern?
ich hab da mal ein paar sachen auskommentiert dann klappts und auch die array´s auf gleicher größe gebracht, aber kann man die leeren arrays nicht so als nullen nachdeklarieren? weil wenn man selber zahlen eingibt hab ich ja das selbe problem?
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #include<iostream> using namespace std; void addiere (int zahl1[],int zahl2[], int ergebnis[], int größe){ int übertrag=0; for (int i=0;i<größe;i++){ //if(zahl1[i]<0||zahl1[i]>9){ // zahl1[i]=0; //} ergebnis[i]=zahl1[i]+zahl2[i]+übertrag; if (ergebnis[i]>=10){ ergebnis[i]=ergebnis[i]-10; übertrag=1; } else { übertrag=0; } } } void subtrahiere (int zahl1[],int zahl2[], int ergebnis[],int größe){ int übertrag=0; for (int i=0;i<größe;i++){ //if(zahl1[i]<0||zahl1[i]>9){ // zahl1[i]=0; //} if (übertrag==1){ zahl1[i]++; } if(zahl2[i]<zahl1[i]){ zahl2[i]=zahl2[i]+10; übertrag=1; } else { übertrag=0; } ergebnis[i]=zahl2[i]-zahl1[i]; } } void multipliziere (int zahl1[],int zahl2[], int ergebnis[]){ } void dividiere (int zahl1[],int zahl2[], int ergebnis[]){ } void gibaus (int zahl[],int anzahlstellen){ for(int i=anzahlstellen;i>=0;i--){ if(zahl[i]>=0&&zahl[i]<10){ cout << zahl[i]; if(i%3==0&&i>0){ cout << "."; } } } } void main(){ int a[]={7,2,4,4,6,1,9,0,2,5,4,0,0,0,0,0}; int b[]={3,6,6,9,1,3,1,0,0,8,7,2,7,5,5,2}; int länge=sizeof(b)/sizeof(int); int c[200]; addiere(a,b,c,länge); gibaus(c,länge); cout << endl; subtrahiere(a,b,c,länge); gibaus(c,länge); }
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Armour« (31. August 2010, 17:05)
du meinst das hier?
das funktioniert so nicht. wenn du dein array an die funktion übergibst macht diese automatisch eine kopie, diese kopie wird jetz irgendwo in deinem speicher abgelegt wo grad platz ist. ob jetz dahinter oder davor daten stehn die das bs oder sonst ein programm braucht interessiert sie erst mal nich. du versuchst nun auf nicht allokierten speicher zu zugreifen. nochmal zur erinnerung. alles was du so im programm anlegst kommt auf den stack, wenn du was mit new oder malloc anlegst auf dem heap. normalerweise ist das bei c compilern so, dass er einträge von arrays hintereinander anlegt und wenn er das bei dieser variable nicht kann, kommt ein stack fehler.
überprüf mal mit dem debugger ob das stimmt:
ist nur ne ahnung. kann auch richtig sein. Dennoch würde ich dass so nicht schreiben. Ist meiner Meinung nach unübersichtlich, da du nicht sofort siehst was du eigentlich machst.
Mal ne frage, muss das so umständlich programmiert sein? Oder wärs nicht einfacher eine stringToInt-Funktion zu schreiben und die arrays erst in int-werte zu konvertieren und dann ganz normal zu rechnen?
Edit: dass mit der Frage zum schluss wird eher zu ner verwunderung, da du reine ganzzahl-arithmetik machst und dabei nur die 10^1 stelle berücksichtigst und im ergebniss-array speicherst
|
|
C/C++-Quelltext |
1 2 3 |
if(zahl1[i]<0||zahl1[i]>9){ zahl1[i]=0; } |
das funktioniert so nicht. wenn du dein array an die funktion übergibst macht diese automatisch eine kopie, diese kopie wird jetz irgendwo in deinem speicher abgelegt wo grad platz ist. ob jetz dahinter oder davor daten stehn die das bs oder sonst ein programm braucht interessiert sie erst mal nich. du versuchst nun auf nicht allokierten speicher zu zugreifen. nochmal zur erinnerung. alles was du so im programm anlegst kommt auf den stack, wenn du was mit new oder malloc anlegst auf dem heap. normalerweise ist das bei c compilern so, dass er einträge von arrays hintereinander anlegt und wenn er das bei dieser variable nicht kann, kommt ein stack fehler.
überprüf mal mit dem debugger ob das stimmt:
|
|
C/C++-Quelltext |
1 |
zahl1[i]++;
|
ist nur ne ahnung. kann auch richtig sein. Dennoch würde ich dass so nicht schreiben. Ist meiner Meinung nach unübersichtlich, da du nicht sofort siehst was du eigentlich machst.
Mal ne frage, muss das so umständlich programmiert sein? Oder wärs nicht einfacher eine stringToInt-Funktion zu schreiben und die arrays erst in int-werte zu konvertieren und dann ganz normal zu rechnen?
Edit: dass mit der Frage zum schluss wird eher zu ner verwunderung, da du reine ganzzahl-arithmetik machst und dabei nur die 10^1 stelle berücksichtigst und im ergebniss-array speicherst
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Matte« (31. August 2010, 17:36)
was ist überhaupt deine aufgabenstellung?
Edit: weil ichs grad mit der stelle zu viel les. du berechnest natürlich die anzahl der stellen des arrays im programm, dass array beginnt aber bei 0. Du fängst auch bei 0 an, musst dann aber 1 von der länge abziehn
Edit: weil ichs grad mit der stelle zu viel les. du berechnest natürlich die anzahl der stellen des arrays im programm, dass array beginnt aber bei 0. Du fängst auch bei 0 an, musst dann aber 1 von der länge abziehn
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Matte« (31. August 2010, 17:50)
Bei diesem Project soll ein Datentyp "decimal" erstellt werden, der es ermöglicht, mit (im Prinzip) beliebig großen Zahlen zu rechnen (mit mehr stellen, als es selbst "double" erlaubt)
Vorgaben:
void addiere(int zahl1[],int zahl2[],int ergebnis[]{
// hier sind sie am zug
}
-> Das selbe mit den anderen!
->Dann die Zahlenvorgabe und gib aus war komplett vorgegeben(zumindest größten teils)
Vorgaben:
void addiere(int zahl1[],int zahl2[],int ergebnis[]{
// hier sind sie am zug
}
-> Das selbe mit den anderen!
->Dann die Zahlenvorgabe und gib aus war komplett vorgegeben(zumindest größten teils)
du meinst das hier?
das funktioniert so nicht. wenn du dein array an die funktion übergibst macht diese automatisch eine kopie, diese kopie wird jetz irgendwo in deinem speicher abgelegt wo grad platz ist. ob jetz dahinter oder davor daten stehn die das bs oder sonst ein programm braucht interessiert sie erst mal nich. du versuchst nun auf nicht allokierten speicher zu zugreifen. nochmal zur erinnerung. alles was du so im programm anlegst kommt auf den stack, wenn du was mit new oder malloc anlegst auf dem heap. normalerweise ist das bei c compilern so, dass er einträge von arrays hintereinander anlegt und wenn er das bei dieser variable nicht kann, kommt ein stack fehler.
Im obrigen Code wird das Array nicht kopiert, sondern beim Aufruf nur der Zeiger auf das erste Element des Arrays auf den Stack gepusht.
Übrigens wird niemals "wo grad Platz ist" ist etwas geschrieben. Es ist auch nicht normalerweise so das Arrays am Stück im Speicher stehen, sondern immer. Da der Indexoperator nur ein Offset zum Basiszeiger ist, würde bei im Speicher verteilten Elementen der Zugriff nicht mehr Funktionieren.
Und der Stack Fehler rührt daher, das es im Debug Modus nach jedem Funktionsaufruf einen Check gibt ob der Stack noch sane ist (z.B. indem man prüft ob ESP nach dem Aufruf derselbe ist wie vor dem Aufruf). Ist er das nicht, gibt es die besagte Fehlermeldung.
Zitat
überprüf mal mit dem debugger ob das stimmt:
![]()
C/C++-Quelltext
1zahl1[i]++;
ist nur ne ahnung. kann auch richtig sein. Dennoch würde ich dass so nicht schreiben. Ist meiner Meinung nach unübersichtlich, da du nicht sofort siehst was du eigentlich machst.
Das Statement ist richtig und auch gängige Praxis es so zu machen.
@Armour: Wenn ich deinen Code sehe, und den der Vorgabe, so hast du die Vorgabe schon angepasst - dürft ihr das?
Eigentlich fehlt dir ein sinnvoller Algorithmus um dein Problem zu lösen - die gibt es aber schon im Internet zuhauf in Pseudocode, was du anschließen machen müsstest wäre ihm zu implementieren.
Sogar auf wikipedia findet mein einen für die Addition zweier beliebig großer Zahlen.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
erstmal danke, ich geh davon aus das wir die so anpassen dürfen, zumindest wurde nichts anderes gesagt, muss auch erstmal ne pause machen mir qualmt schon der kopf, ich werd aber nicht aufgeben.
Hier mal die Lösung aus der Schule zur addition:
Hier mal die Lösung aus der Schule zur addition:
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #include<iostream> using namespace std; void addiere(int zahl1[],int zahl2[],int ergebnis[],int länge1,int länge2){ int übertrag=0; int min=0,max=0; if(länge1>länge2){ max=länge1; min=länge2; } else { max=länge2; min=länge1; } for(int i=0;i<max;i++){ if(i>=min){ if (länge1>länge2){ ergebnis[i]=zahl1[i]+übertrag; } else { ergebnis[i]=zahl2[i]+übertrag; } } else { ergebnis[i]=zahl1[i]+zahl2[i]+übertrag; } if(ergebnis[i]>9){ ergebnis[i]-=10; übertrag=1; } else { übertrag=0; } } } void gibaus(int zahl[], int anzahlstellen){ for(int i=anzahlstellen;i>=0;i--){ if(zahl[i]>=0&&zahl[i]<10){ cout << zahl[i]; if(i%3==0&&i>0){ cout << "."; } } } } void main(){ int a[]={7,2,4,4,6,1,9,0,2,5,4}; int b[]={3,6,6,9,1,3,1,0,0,8,7,2,7,5,5,2}; int c[200]; addiere(a,b,c,sizeof(a)/sizeof(int),sizeof(b)/sizeof(int)); gibaus(c,sizeof(b)/sizeof(int)); }
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Armour« (2. September 2010, 09:25)
Ich habe es nicht getestet, aber ich denke die Schullösung enthält einen anderen Fehler!
Man probiere mal die Addition von:
55555555555+
55555555555
Also eine Zahl, bei der als Ergebnis die Anzahl der Stellen wegen des Übertrages um eins erhöht wird.
Ich sehe keine Behandlung des letzten Übertrages!
Man probiere mal die Addition von:
55555555555+
55555555555
Also eine Zahl, bei der als Ergebnis die Anzahl der Stellen wegen des Übertrages um eins erhöht wird.
Ich sehe keine Behandlung des letzten Übertrages!
Ähnliche Themen
-
PHP »-
Pagebreak: Erklärung zu Snippet?
(2. Januar 2006, 14:34)
-
PHP »-
Slash vor Apostroph (\')
(14. Dezember 2004, 14:59)
-
PHP »-
HILFE eifaches GB-coding klappt nicht, obwohl ich den code aus buch hab'
(29. Oktober 2003, 16:15)
-
Archiv: Software »-
Fehlermeldung. Bitte um Hilfe
(11. August 2003, 23:55)
-
Foren-, Blog- und Content-Managementsysteme »-
Variable !?
(22. Januar 2003, 08:41)



.