Forum: Compiler & IDEs Übergabe String Array hakt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.