Pointer als Funktionsparameter

Gast #179103
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);
}
Gast #179104
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.
Gast #179105
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'.
Gast #179106
@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.
Gast #179107
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.
Gast #179108
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.