Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 72%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 23%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 21%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 12%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 7%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 7%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 5%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 3%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 306 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

1 Zum Seitenanfang

Dienstag, 31. August 2010, 12:59

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:

  Spoiler 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.
 

Matte

Doppel-As

Dabei seit: 01.01.2009

Beiträge: 147

 

2 Zum Seitenanfang

Dienstag, 31. August 2010, 15:36

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.
 

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

3 Zum Seitenanfang

Dienstag, 31. August 2010, 17:05

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?

  Spoiler 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 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)

 

Matte

Doppel-As

Dabei seit: 01.01.2009

Beiträge: 147

 

4 Zum Seitenanfang

Dienstag, 31. August 2010, 17:29

du meinst das hier?

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)

 

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

5 Zum Seitenanfang

Dienstag, 31. August 2010, 17:34

ich würds gern einfacher machen, nur leider sind wir noch nicht so weit, deshalb versuch ichs so hinzubekommen, das ich erstmal besser verstehen kann was ich da tu oder auch nicht ?( .
 

Matte

Doppel-As

Dabei seit: 01.01.2009

Beiträge: 147

 

6 Zum Seitenanfang

Dienstag, 31. August 2010, 17:50

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Matte« (31. August 2010, 17:50)

 

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

7 Zum Seitenanfang

Dienstag, 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)
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

8 Zum Seitenanfang

Dienstag, 31. August 2010, 18:21

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

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.

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
 

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

9 Zum Seitenanfang

Donnerstag, 2. September 2010, 09:25

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:

  Spoiler 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)

 

stfschaefer

Tripel-As

Dabei seit: 21.08.2010

Beiträge: 202

 

10 Zum Seitenanfang

Freitag, 3. September 2010, 05:15

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!
 

Armour

Tripel-As

Dabei seit: 21.02.2009

Beiträge: 218

 

11 Zum Seitenanfang

Freitag, 3. September 2010, 07:59

ja das stimmt mit ein bischen rumprobieren hab ichs nicht hinbekommen, er müßte ja einen weiter zählen als vorhanden ist stimmt´s? mal schauen wo ich das reinsetzen mus, bei der ausgabe hats nicht geklappt, dann kann´s ja nur bei der rechnung sein.
 

stfschaefer

Tripel-As

Dabei seit: 21.08.2010

Beiträge: 202

 

12 Zum Seitenanfang

Freitag, 3. September 2010, 14:11

Ist doch recht einfach. Nach der For-Schleife wird der Übertrag, der eventuell vorhanden ist in die nächste Stelle der Ausgabe geschrieben.

Das wars schon.