Übergabe String Array hakt

OP #7172230
Lesenswert?
• ▲
▼
Hallo,

ich will das string array tText[] an die Funktion Menu_Set4LinesX() 
übergeben, die die einzelnen strings dann aus dem PROGMEM lesen und via 
printf() ausgeben soll.

Der Compiler meckert zwar nicht, aber es funktioniert leider nicht, da 
das Programm nur kryptische chars ausdruckt. Irgendwo habe ich mich mit 
den string pointern wohl verhaspelt.

Ich würde mich freuen, wenn ihr mir weiter helfen könnt.

Grüße
Manni

P.S.: ich verwende das Atmel Studio 7
1
/*
2
** CPU ist ATmega644
3
*/
4

5
#define SYSCLOCK    20000000  // Crystal Frequency in Hz
6
#define F_CPU      SYSCLOCK  // Crystal Frequency in Hz
7
#define PROGMEM_MAXLEN  20
8

9
#include <stdio.h>
10
#include <avr/io.h>
11
#include <string.h>
12
#include <avr/pgmspace.h>
13
#include <util/delay.h>
14

15

16
void Menu_Set4LinesX (char** cString);
17
void Menu_SetStringFromProgMemX (char* str);
18
char *Menu_ProgMem_GetTextX (char* str);
19

20
const char tText1[]          PROGMEM = "Text1";
21
const char tText2[]          PROGMEM = "Text2";
22
const char tText3[]          PROGMEM = "Text3";
23
const char tText4[]          PROGMEM = "Text3";
24
const char* const tText[]      PROGMEM = {tText1, tText2, tText3, tText4};
25

26

27
int main (void)
28
  {
29
  while (1)
30
    {
31
    Menu_Set4LinesX ((char**) tText);
32
    _delay_ms (2000);
33
    }
34
  }
35

36

37
void Menu_Set4LinesX (char** cString)
38
  {
39
  Menu_SetStringFromProgMemX (cString[0]);
40
  Menu_SetStringFromProgMemX (cString[1]);
41
  Menu_SetStringFromProgMemX (cString[2]);
42
  Menu_SetStringFromProgMemX (cString[3]);
43
  return;
44
  }
45

46
void Menu_SetStringFromProgMemX (char* str)
47
  {
48
  char *Text;
49
  Text = Menu_ProgMem_GetTextX (str);
50
  printf ("%s\n", Text);
51
  return;
52
  }
53

54
char *Menu_ProgMem_GetTextX (char* str)
55
  {
56
  static char    Text[PROGMEM_MAXLEN];
57
  char      *pText;
58
  uint8_t      len = 0;
59

60
  pText = Text;
61
  while (1)
62
    {
63
    *pText = pgm_read_byte (str++);
64
    if (*pText == '\0')  return Text;
65
    if (len == (PROGMEM_MAXLEN-1))
66
      {
67
      *pText = '\0';
68
      return Text;
69
      }
70
    len++;
71
    pText++;
72
    }
73
  }
Gast #7172343
Lesenswert?
• ▲
▼
Bei dir sind nicht nur die einzelnen Strings in PROGMEM, sondern auch 
das Array mit den Zeigern auf die Strings. Also musst du auch den 
Zugriff auf die Zeiger über pgm_get_... laufen lassen, und nicht einfach 
nur Menu_SetStringFromProgMemX (cString[0]) ...

LG, Sebastian
OP #7172425
Lesenswert?
• ▲
▼
Sebastian schrieb:
> Bei dir sind nicht nur die einzelnen Strings in PROGMEM, sondern auch
> das Array mit den Zeigern auf die Strings.

Ich danke Dir vielmals für diesen hilfreichen Hinweis.
Das ist mir einfach durchgerutscht :-( Es war einfach mal wieder zu heiß 
heute.

Ich habe es der Einfachheit halber geändert auf:
1
const char* const tText[] = {tText1, tText2, tText3, tText4};
und damit funktionierte es sofort.

Nochmals vielen Dank !

Grüße Manni
#7172432
Lesenswert?
• ▲
▼
Manfred L. schrieb:
> und damit funktionierte es sofort.

Super! Dann kannst du dich als nächstes um diesen Cast kümmern.
Manfred L. schrieb:
> Menu_Set4LinesX ((char**) tText);
Immer wenn du ein const wegcastest, machst du wahrscheinlich etwas 
falsch, oder handelst grob fahrlässig. Um den Cast los zu werden, musst 
du die aktuell fehlenden const in deinen Funktionsparametern hinzufügen.
#7172464
Lesenswert?
• ▲
▼
Manfred L. schrieb:
> Mombert H. schrieb:
>> oder handelst grob fahrlässig
>
> Ja, Du hast vollkommen recht. Mit den const casts stehe ich sowieso
> immer auf Kriegsfüßen. Hast Du eine Idee, wie ich das C-mäßig "sauberer"
> hinkriege ?

Ja, füge die fehlenden consts in deinen Funktionsparametern hinzu, also 
z.B. hier:
1
void Menu_SetStringFromProgMemX (hier char oder hier* str)

Antwort schreiben

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.

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.