Forum: Compiler & IDEs Pointer als Funktionsparameter


von Mike (Gast)


Lesenswert?

Hallo,

ich habe eine Funktion die mir in einem Display den Cursor macht, als
Parameter ist die alte Cursorposition, die Funktion berechnet mir den
Cursor neu (schaut nach ob Drehrad bewegt wurde) und gibt mir dann den
Wert des Cursors wieder zurück, folgender Code funktionert (vereinfacht
dargestellt):

void hauptmenue()
{
 static int cursor_pos=0;
 cursor_pos=calc_curs(&cursor_pos);
}

int calc_curs(int *cursor_pos)
{
 int temp;
 temp=*cursor_pos;
   //vereinfachte berechnung entspricht nicht der wirklichen
berechnung
 temp++;

 return(temp);
}

sobald ich aber in der Funktion direkt mit dem Parameter arbeiten will
funktioniert das Programm nicht mehr, warum?

void hauptmenue()
{
 static int cursor_pos=0;
 cursor_pos=calc_curs(&cursor_pos);
}

int calc_curs(int *cursor_pos)
{

   //vereinfachte berechnung entspricht nicht der wirklichen
berechnung
 *cursor_pos++;

 return(*cursor_pos);
}

von Rufus T. Firefly (Gast)


Lesenswert?

Was heißt "das Programm funktioniert nicht mehr"?

In deiner zweiten Fassung von calc_curs erscheint mir die Zeile

  *cursor_pos++;

möglicherweise problembehaftet. Du solltest Dir die
Operatorenreihenfolge (was wird zuerst ausgewertet) mal näher ansehen
oder von vornherein mit "Angstklammern" arbeiten, um auszudrücken,
was Du erreichen willst:

  (*cursor_pos)++;

Auf den Rückgabewert der Funktion kannst Du komplett verzichten, ebenso
auf das Zuweisen dieses Rückgabewertes in hauptmenue() - verkürzt steht
da nämlich:

  cursor_pos = cursor_pos;

Für ratsam halte ich es noch, Variablennamen etwas sinnvoller zu
vergeben und beispielsweise eine Prefix-Notation zu verwenden, die auf
die Art der Variable verweist. Das muss nicht die microsoft'sche
ungarische Notation sein, aber Du verwendest zwei Variablen namens
cursor_pos, die einmal ein int und das andere ein int* sind ... das ist
beim Sourcelesen unpraktisch.

von Jörg Wunsch (Gast)


Lesenswert?

Ich bin mir aus dem Hut gar nicht mal sicher, ob das überhaupt nach
dem Standard definiertes Verhalten garantiert.  Letztlich manipuliert
sowohl der Funktionsaufrauf als auch die Zuweisung nach der Rückgabe
der Funktion die (hauptmenue-)Variable `cursor_pos'.

von Rufus T. Firefly (Gast)


Lesenswert?

@Jörg: Doch, das ist kein Problem. Der Audruck auf der rechten Seite
wird ausgewertet und erst dann der linken Seite zugewiesen.
Das ist zwar vollkommen nutzlos, aber vollständig legal und
standardkonform.

von Mike (Gast)


Lesenswert?

wollte jetzt eine Antwort schreiben und bin eigentlich draufgekommen,
dass ich der Funktion ja die Adresse der Variable übergebe, d.h. die
ganzen Berechnungen erfolgen ja eh in der Speicherzelle der Variable
also müsste ich den Returnwert ja gar nicht mehr speichern, es müsste
ja auch folgendes reichen:

void hauptmenue()
{
 static int cursor_pos=0;
 calc_curs(&cursor_pos);
}

void calc_curs(int *cursor_pos)
{
   //vereinfachte berechnung entspricht nicht der wirklichen
berechnung
 *cursor_pos++;

}

muss das gleich ausprobieren wenn ich wieder zu Hause bin.

@Rufus:
das *cursor_pos++; war nur eine Vereinfachung ich mache in der Funktion
natürlich mehr als nur 1 dazuzuählen, wäre aber zuviel Sourcecode und an
den einzelnen Operationen liegt es nicht.

von Rufus T. Firefly (Gast)


Lesenswert?

Tja - dann kann Dir, solange Du nicht in der Lage bist, die Frage zu
beantworten, die ich Dir gestellt habe, auch keiner mehr helfen.

  Was heißt "das Programm funktioniert nicht mehr"?


An der von Jörg und mir diskutierten finalen Zuweisung jedenfalls
liegt's nicht, die ist zwar nutzlos, stört aber auch nicht.

von Mike (Gast)


Lesenswert?

Weiß nicht ob die die Antwort:

"cursor_pos bleibt immer auf NULL" soviel geholfen hätte..

von Rufus T. Firefly (Gast)


Lesenswert?

Dann solltest Du Dir Dein Programm mal in einem Debugger ansehen, nicht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.