www.mikrocontroller.net

Forum: Compiler & IDEs Call by reference mit Enumeration möglich?


Autor: C-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich beschäftige mich gerade mit Funktionen deren Werte unterschiedlich 
übergeben werden können. Das erste Beispiel wäre den Wert übergeben 
siehe dazu Fall 1). Das erste Beispiel funktioniert wunderbar. Aber wenn 
ichs versuche mit einem Zeiger zu übergeben (Fall 2), dann meckert der 
gcc compiler. Die Fehlermeldung sagt mir, dass "menue_liste" und "int" 
nicht kompatibel ist und ein "lvalue" sein muss, was es auch immer sein 
mag.

Könnte mir ein Erfahrener sagen, woran es hapern könnte? Muss die 
enumeration "menu_liste" ein Zeiger sein? Ich versuchte es auch mit 
einem Zeiger, aber er gibt mir immer die gleiche Meldung.
Ich bedanke mich für eure Antworten schon im voraus!

Fall 1) Funktioniert mit Übergabe
#include <stdio.h>
  typedef enum
    {
      menu1 = (int) 1,
      menu3 = (int) 3,
      menu5 = (int) 5,
    } menu_liste;

void menu_auswahl(menu_liste menux)
  {
    if (menux == 1)
      {
        printf("Menue 1 wurde gewaehlt!");
      }
  }


int main()
{
     menu_auswahl(menu1);
}

Fall 2) geht nicht (Zeiger)
#include <stdio.h>
  typedef enum
    {
      menu1 = (int) 1,
      menu3 = (int) 3,
      menu5 = (int) 5,
    } menu_liste;

void menu_auswahl(menu_liste *menux)
  {
    if (menux == 1)
      {
        printf("Menue 1 wurde gewaehlt!");
      }
  }


int main()
{
     menu_auswahl(&menu1);
}

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst ja auch einen Zeiger auf eine Variable übergeben, Zeiger auf 
Literale gibts nicht.
int main()
{
     menu_liste m = menu1;
     menu_auswahl(&m);
}

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem zweiten Beispiel liegt der Fehler darin, dass menu1 keine 
Variable ist. Also kannst du auch keinen Pointer davon erzeugen. was 
funktionieren würde:
menu_liste menuP = menu1;
menu_auswahl(&menuP);

Autor: C-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas & Markus

Danke für eure Hinweise. Ich dachte die ganze Zeit, dass "menu1, menu_3 
und menu_5" Variablen mit einem konstatem Wert sind.
Eure Codezeilen konnte ich gleich testen und war gleich damit 
erfoglreich.

Thx ihr beiden!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Beginner schrieb:
>       menu1 = (int) 1,

Das (int) ist überflüssig, die Zahl 1 ist genau dies bereits.

Eine "lvalue" ist vom Begriff her etwas, dem man etwas zuweisen kann, 
also was links von einer Zuweisung stehen kann: "left value". Was in 
diesem Fall leider etwas unglücklich gewählt ist, weil es hier eher 
darum geht, davon eine Adresse ermitteln zu können.

Autor: C-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe einen interessanten Artikel über "Enumeration Constants vs. 
Constant Objects" gefunden. Für die Kenner ist er ganz bestimmt ein 
alter Hut. Ich denke halt, dass er für die C-Anfäger - wie mich - 
hilfreich sein kann.

MfG

Link 
http://www.eetimes.com/discussion/programming-poin...

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.