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


von Andreas (Gast)


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:
1
void lcd_menu(uint8_t a, uint8_t b)
2
    {
3
        uint8_t y,x;
4
        char Puffer[15];
5
        set_cursor(0,b);
6
        strcpy_P(Puffer,menu[a]);
7
        lcd_string(Puffer);
8
              }
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
1
              uint8_t c;
2
              c=2; 
3
              strcpy_P(Puffer,menu[c]);
4
              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.

von (prx) A. K. (prx)


Lesenswert?

Wie sieht menu[] exakt aus?

von Andreas (Gast)


Lesenswert?

Ups, vergessen!

µ-Controller: ATmega32
1
const char variable0[]PROGMEM = "text";
2
const char variable1[]PROGMEM = "text";
3
const char variable2[]PROGMEM = "text";
4
const char variable3[]PROGMEM = "text";
5
const char variable4[]PROGMEM = "text";
6
7
PGM_P menu[6]PROGMEM=
8
  {
9
  variable0,
10
  variable1,
11
  variable2,
12
  variable3,
13
  variable4
14
  };

von (prx) A. K. (prx)


Lesenswert?

Ahnte ich es doch. menu[] liegt im ROM, GCC kann aber nicht direkt 
darauf zugreifen.
1
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
1
pgm_read_word(&menu[x])
oder so ähnlich.

von Andreas (Gast)


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!

von Stefan E. (sternst)


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.

von Andreas (Gast)


Lesenswert?

So, habs probiert! Funktioniert - danke nochmals :)

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.