Parameterübergabe bei Funktionsaufruf - Array

Gast #1349710
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.
Gast #1349740
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
  };
#1349772
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.
Gast #1349786
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!
#1349809
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.