Char innerhalb einer Funktion in PROGMEM ablegen

Gast
Hi,

super danke. Habe ich glatt übersehen. Habe folgende Lösung 
implementiert

#define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), 
__a, __b, __c, __d, __e)

void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned 
char fc,unsigned char bc )
{
  char string[40];

  strcpy_P( string, pgmString );

  lcd_print(string,x,y,size,fc,bc);

}

...

lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
...

Wenn einer eine bessere Lösung kennt, immer raus damit.

Wenn nicht schon mal danke

Gruß

Frank
Persönliche Seite
Frank schrieb:
> Hi,
>
> super danke. Habe ich glatt übersehen. Habe folgende Lösung
> implementiert
>
> #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s),
> __a, __b, __c, __d, __e)
>
> void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned
> char fc,unsigned char bc )
> {
>   char string[40];
>
>   strcpy_P( string, pgmString );
>
>   lcd_print(string,x,y,size,fc,bc);
>
> }
>
> ...
>
> lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau);
> ...
>
> Wenn einer eine bessere Lösung kennt, immer raus damit.

Ich fände hier besser, die Ausgabe von Flash-Strings direkt zu 
unterstützen in lcd_print. Die Funktion bräuchte dann allerdings nen 
weiteren Parameter, der angibt, ob die übergebene String-Adresse sich 
auf den RAM bezieht oder auf's Flash. Das würde die Rumkopiererei 
sparen:
1
void lcd_print (const char * str, uint8_t in_flash, ...)
2
{
3
    char c;
4
    ...
5
    if (in_flash)
6
        c = pgm_read_byte (str++);
7
    else
8
        c = *str++;
9
    ...
10
}
Darauf könntest du dann Makros legen, etwa
1
#define LCD_PRINT_RAM(STR,X,Y) lcd_print (STR, 0, X, Y)
2
#define LCD_PRINT_FLASH(STR,X,Y) lcd_print (PSTR(STR), 1, X, Y)

Ist aber auch Geschmackssache.

Schliesslich böte sich noch an, ne eigene, printf-ähnliche Funktion zu 
schreiben, in der per %-Kommando die print-Koordinaten gesetzt werden 
könnten. %K würde z.B. zwei Koordinaten erfordern:
1
lcd_printf ("%KHallo%KBingo", 0, 0, 10, 3);

Johann
Gast
Hallo Johann,

auch nicht schlecht die Idee. Ich muss aber gestehen, ich habe etwas 
gesucht was einfach zu ändern ist. Mir ist einfach der Speicherbedarf zu 
hoch gegangen.

Jetzt suche ich auch noch eine einfache Möglichkeit die folgende 
Struktur ins Progmem zu schieben und wieder drauf zu zu greifen.

typedef void FUNC(void);
typedef FUNC *func;

void MenuSetzeTimer( void )
{
  ....
}

struct stMenu
{
  const char szOut[20];
  func funktion;
};

struct stMenu  PROGMEM stMenuStart[] =
{ {"  ===== Menu =====", NULL},
  {"Timer", MenuSetzeTimer },
  { "" }};


Aufruf :

lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht

Menu[i].funktion(); <--- Geht nicht

Danke und Gruß

Frank
@  Frank (Gast)

>typedef void FUNC(void);
>typedef FUNC *func;


>lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht

>Menu[i].funktion(); <--- Geht nicht

Weil Klammern fehlen.
1
typedef void (*state_func)(void);  // define a function pointer

MfG
Falk

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.