Zum Inhalt springen

Zeiger in Rekursionen


Zakum

Empfohlene Beiträge

Hallo :)

Ich hab (mal wieder :( ) einen kleinen Disput mit meinem Compiler und bin etwas ratlos.

Und zwar geht es darum, dass ich ein Programm, das vorher mit lauter globalen Variablen (fehlerfrei) lief jetzt modularisieren möchte...

Also weg mit dem ganzen globalen zeug, dachte ich mir.

Ging auch ganz gut, bis es dazu kam, dass ich in einer rekursiven Funktion Zeiger übergeben wollte:

void lokalisieren(int x, int y, int *count, double grauwert[256][256]) {

	tmp[*count].x=x;		tmp[*count].y=y;			//Koordinaten des schwarzen Punktes speichern

	grauwert[x][y]=50;							//schwarzen Punkt löschen, damit nicht doppel gezählt wird ++ Farbänderun, später weg

	++count;

	if (grauwert[x][y+1]==0) lokalisieren(x,y+1,&count,grauwert);  						

	if (grauwert[x][y-1]==0) lokalisieren(x,y-1,&count,grauwert); 

	if (grauwert[x-1][y+1]==0) lokalisieren(x-1,y+1,&count,grauwert);  

	if (grauwert[x-1][y]==0) lokalisieren(x-1,y,&count,grauwert);  

	if (grauwert[x-1][y-1]==0) lokalisieren(x-1,y-1,&count,grauwert);  

	if (grauwert[x+1][y+1]==0) lokalisieren(x+1,y+1,&count,grauwert); 

	if (grauwert[x+1][y]==0) lokalisieren(x+1,y,&count,grauwert);  

	if (grauwert[x+1][y-1]==0)  lokalisieren(x+1,y-1,&count,grauwert);  

}

sowie natürlich der Aufruf:
lokalisieren(x,y,&count,grauwert);

So wie das ganze jetzt aussieht, liefert mir der Compiler für jede der if-Zeilen folgende Warnung:

Übergabe von Argument 3 von lokalisieren von inkompatiblen Zeigertyp

Was beim ausführen natürlich auch einen Segmentation-faul verursacht.

Als ich testweise das & weggelassen habe, war der compiler wieder still...

Gab allerdings wieder einen Segmentation-fault (was ja auch logisch ist, ich will ja schlieslich die Adresse übergeben).

Weiß vlt. jemand, was das alles zu bedeuten hat? :eek

Link zu diesem Kommentar
Auf anderen Seiten teilen

Übergabe von Argument 3 von lokalisieren von inkompatiblen Zeigertyp

Du hast einen Zeiger auf eine Integer-Variable:

int *count;

Wenn Du nun an eine Funktion &count übergibst, wäre dies ein Zeiger auf einen Zeiger, der auf eine Integer-Variable zeigt. Das entspricht nicht der Parametervereinbarung im Funktionskopf, daher beschwert sich der Compiler.

In Deinem Fall darfst Du nur "count" übergeben, denn das ist bereits ein Zeiger.

Zeigt count bei Dir auf ein angemessen großes Array oder nur auf eine einzelne Zählvariable? Falls letzteres, ist "++count;" die Ursache der Abstürze, da Du hier den Zeiger erhöhst, der dann auf eine unbekannte Speicherstelle zeigt. Falls Du den Inhalt der Variablen, auf die count zeigt, erhöhen möchtest, dann schreibe "(*count)++;". (Zuerst den Zeiger dereferenzieren und dann den Inhalt der eigentlichen Variable/Speicherstelle erhöhen.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...