Forum: Compiler & IDEs Übergabe String Array hakt


von Manfred L. (manni)


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
  }

von Sebastian (Gast)


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

von Manfred L. (manni)


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

von Mombert H. (mh_mh)


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.

von Manfred L. (manni)


Lesenswert?

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 ?

von Mombert H. (mh_mh)


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)

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.