PROGMEM in C++

OP #5915593
Hallo
Letzte Woche habe ich ein wenig mit PROGMEM und dem Uno herum gespielt 
um Speicher zu sparen. Eine nette Sache die in Pascal so nicht geht.
Heute wollte ich das ganze in eine Klasse verpacken und leider geht das 
nicht so wie ich mir das vorgestellt habe.
Ich erlaube mir das hier zu posten weil es mehr ein Programmier Problem 
ist und kein eigentliches Arduino Problem



 struct tButton {
  uint16_t x;
  uint16_t y;
  uint16_t h;
  uint16_t w;
  uint16_t KeyCol;
  uint16_t Shadow;
  uint16_t SColor;
  uint16_t TColor;
};


 const struct tButton KeyButton[40] PROGMEM = { ........ };

// Die Function mit der ich den Programm Speicher auslese
  tButton KeyboardClass::SetFromPROGMEM(uint8_t Value)
{
  tButton Result;
  Result.x = pgm_read_word(&(KeyButton[Value].x));
  Result.y = pgm_read_word(&(KeyButton[Value].y));
  Result.h = pgm_read_word(&(KeyButton[Value].h));
  Result.w = pgm_read_word(&(KeyButton[Value].w));
  Result.KeyCol = pgm_read_word(&(KeyButton[Value].KeyCol));
  Result.Shadow = pgm_read_word(&(KeyButton[Value].Shadow));
  Result.SColor = pgm_read_word(&(KeyButton[Value].SColor));
  Result.TColor = pgm_read_word(&(KeyButton[Value].TColor));
  return (Result);

}

In der Arduino Routine funktioniert das Wunderbar, leider nicht als 
Klasse. Da wird nur Blödsinn ausgelesen. Wo mache ich meinen Ansatz 
Fehler ????
OP
Hallo
Wenn ich es folgendermaßen mache funktioniert es

tButton KeyboardClass::SetFromPROGMEM(uint8_t Value)
{
  tButton Result;
  Result.x = KeyButton[Value].x; // 
pgm_read_word(&(KeyButton[Value].x));
  Result.y = KeyButton[Value].y;// 
pgm_read_word(&(KeyButton[Value].y));
  Result.h = KeyButton[Value].h; // 
pgm_read_word(&(KeyButton[Value].h));
  Result.w = KeyButton[Value].w; 
//pgm_read_word(&(KeyButton[Value].w));
  Result.KeyCol = KeyButton[Value].KeyCol; // 
pgm_read_word(&(KeyButton[Value].KeyCol));
  Result.Shadow = KeyButton[Value].Shadow; // 
pgm_read_word(&(KeyButton[Value].Shadow));
  Result.SColor = KeyButton[Value].SColor; // 
pgm_read_word(&(KeyButton[Value].SColor));
  Result.TColor = KeyButton[Value].TColor; // 
pgm_read_word(&(KeyButton[Value].TColor));
  return (Result);

}
Sind die Daten im RAM oder Programmspeicher ????

Antwort schreiben

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