www.mikrocontroller.net

Forum: Compiler & IDEs Parameterübergabe bei Funktionsaufruf - Array


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, habe da ne kleine Frage:
Ich hab mit meinem Programm ein Problem:
Wenn ich eine Funktion in C schreibe, in der ich auf ein Array zugreife 
z.B:
void lcd_menu(uint8_t a, uint8_t b)
    {
        uint8_t y,x;
        char Puffer[15];
        set_cursor(0,b);
        strcpy_P(Puffer,menu[a]);
        lcd_string(Puffer);
              }
Habe ich das problem, damit bei der Parameterübergabe im Aufruf der 
Funktion (z.b:)


         void lcd_menu(2,3)

zwar meine Cursor-Position stimmt, jedoch mein Pointer (a) auf's Array 
irgendwie falsch? übergeben wird.

Wenn ich die uint8_t Variable innerhalb der Funktion deklariere
              uint8_t c;
              c=2; 
              strcpy_P(Puffer,menu[c]);
              lcd_string(Puffer);
wird auch der passende Zeilentext ausgegeben.
Bei menu[ ] handelt es sich um
Hat jemand einen Ratschlag? Was ich schon ausprobiert habe: die 
Variablendeklaration von a mit int, uint16_t, char - alles ohne Erfolg.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht menu[] exakt aus?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, vergessen!

µ-Controller: ATmega32
const char variable0[]PROGMEM = "text";
const char variable1[]PROGMEM = "text";
const char variable2[]PROGMEM = "text";
const char variable3[]PROGMEM = "text";
const char variable4[]PROGMEM = "text";

PGM_P menu[6]PROGMEM=
  {
  variable0,
  variable1,
  variable2,
  variable3,
  variable4
  };

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahnte ich es doch. menu[] liegt im ROM, GCC kann aber nicht direkt 
darauf zugreifen.
menu[x]
liest den Pointer nicht aus dem Array menu[], sondern aus einer eher 
zufälligen Stelle im RAM. Den Pointer gibt es korrekt mit
pgm_read_word(&menu[x])
oder so ähnlich.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke - das werd ich mal ausprobieren! Nur irgendwie find ichs 
komisch damit's trozdem ging, sobald ich die Variable x innerhalb der 
Funktion deklariert hatte!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:
> Ok, danke - das werd ich mal ausprobieren! Nur irgendwie find ichs
> komisch damit's trozdem ging, sobald ich die Variable x innerhalb der
> Funktion deklariert hatte!

Das hängt mit der Optimierung zusammen. Wenn der Wert von x bereits zur 
Compilier-Zeit feststeht, kann auch Menu[x] bereits beim Compilieren 
direkt ersetzt werden. Es wird dann gar nicht zur Laufzeit auf das Array 
zugegriffen und der Fehler tritt nicht in Erscheinung.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habs probiert! Funktioniert - danke nochmals :)

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.