Speicherzugriffsfehler in C wieso?


01.11.2022, 11:23

hab n fehler, hab potenz mit pot verwechsel

2 Antworten

Hier mal ein Vorschlag, wie Du potenz etwas einfacher halten kannst:

int potenz( int zahl, int pot){
    if (pot==0) return 1;
    return zahl*potenz(zahl,pot-1);
}

Was natürlich noch zu bedenken wäre: Was wenn pot negativ ist?


Irrwegnutzer 
Fragesteller
 01.11.2022, 20:26

Pot negativ ist wie Reibung im Physikunterricht damals in der Schule: kann man vernachlässigen

0

Es muss heißen

if (pot != 0)

Aber selbst dann ist das Ergebnis falsch, denn Du musst ergebnis standardmäßig auf 1 setzen. Irgendwas hoch 0 ist immer 1.


Irrwegnutzer 
Fragesteller
 01.11.2022, 11:31

ók danke, es funktioniert, ich verstehe aber nicht, ich dachte wenn ich da sowieso was reinspeichere ist es egal was ich in dieses ergebnis speichere oder ? also das ist mein neuer code:

#include <stdio.h>


int potenz(int zahl, int pot){
	int ergebnis = 1;
	if (pot != 0 ){
	return  ergebnis = zahl * potenz(zahl, pot-1);
} else return ergebnis;
}


int main(){
	int ergebnis = 0;
	int u = potenz(2,10);
	printf("%d", u);
}
0
ohwehohach  01.11.2022, 11:33
@Irrwegnutzer

Die Zeile int ergebnis = 0; in main kannst Du streichen.

Die Sache ist: In der Funktion potenz bekommt ergebnis nur dann einen Wert, wenn pot != 0 ist. Wenn pot aber 0 ist, wird ergebnis geliefert.

Da das aber 0 ist, wenn Du nicht explizit 1 zuweist, wird das komplette Ergebnis auch 0, denn 0 * irgendwas ist 0.

Sprich: potenz(2, 2) wäre ausgewertet worden zu 2 * potenz(2, 1) = 2 * 2 * potenz(2, 0) = 2 * 2 * 0.

Und potenz(2, 0) würde 0 liefern, was nicht stimmt.

0
Irrwegnutzer 
Fragesteller
 01.11.2022, 11:42
@ohwehohach

ahhh jetzt hab ich es, die rekursion geht ja solange weiter bis pot = 0 dann gehts in den else zweig und ergebnis = 0 wird an die vorherige instanz zurückgegeben, was beudetet dass eben alles 0 wird. danke für die hilfe, dass mit 2, 0 mach ich nochmal extra mit ner if anweisung

1
Irrwegnutzer 
Fragesteller
 01.11.2022, 11:43
@ohwehohach

achso ne das ist ja schon automatisch weil ich jetzt else return 1; gemacht habe

1