Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeiger in Rekursionen

Empfohlene Antworten

Veröffentlicht

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

Ü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.)

:upps

Manchmal ist man aber auch wie vernagelt!

Hab dieses ++count einfach jedes mal übersehen, war natürlich das, was ich gesucht hatte.

Vielen Dank, bubble! :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.