www.mikrocontroller.net

Forum: Compiler & IDEs Pointer als Funktionsparameter


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß nicht ob die die Antwort:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.