Forum: Compiler & IDEs Zeiger auf Strings


von Grübler (Gast)


Lesenswert?

Hallo zusammen

Ich schaue mir gerade die Speicherauslastung
bei dem kleinen Testprogramm an.
Fügt man weitere Aufrufe mit neuen Strings
hinzu, erhöht sich der Platzbedarf im
Programmspeicher. Das ist mir klar.

Aber

Auch der Platzbedarf im RAM (Data-Speicher)
steigt um so viele Zeichen wie man in den
Strings verwendet hat.
Der Compiler kopiert die Zeichen offenbar
erst ins RAM wo sie Platz verbrauchen.

Das erscheint mir verschwenderisch, da die Strings
ja schon im Programmspeicher stehen.

Wie kann man das verhindern?
1
void writeString(char *data);
2
3
int main(void)
4
{
5
 writeString("Hallo");
6
 writeString("hier");
7
 writeString("Tasten");
8
}
9
10
11
void writeString(char *data)
12
{
13
 char m=0;
14
15
 while(*data != '\0')
16
  {
17
   m = *data; //Hier könnte der Aufruf 
18
   data++;    //zum Schreiben in ein LCD stehen
19
  }
20
}

von Stefan E. (sternst)


Lesenswert?


von Grübler (Gast)


Lesenswert?

Hallo Stefan

So habe ich das bis jetzt auch immer gemacht.
Ich habe mit "pgmspace" ein Array der Texte
im Programmspeicher angelegt und sie dann
immer von dort geholt.

z.B. LCD_Text(4);  //"Hallo Welt"

Das ist mir aber zu unübertsichtlich.
Man muss ständig die Nummern nachsehen.

von Stefan E. (sternst)


Lesenswert?

Grübler schrieb:
> So habe ich das bis jetzt auch immer gemacht.
> Ich habe mit "pgmspace" ein Array der Texte
> im Programmspeicher angelegt und sie dann
> immer von dort geholt.
>
> z.B. LCD_Text(4);  //"Hallo Welt"
>
> Das ist mir aber zu unübertsichtlich.
> Man muss ständig die Nummern nachsehen.

Nichts und niemand zwingt dich zu einem "Array der Texte".
Ließ es dir nochmal durch.

von Andree S. (amshh)


Lesenswert?

Moin,

.... und wenn es doch unbedingt so sein soll, dann bitte so einen Aufruf 
nicht mit absoluten Zahlen sondern mit vordefinierten Defines zu machen. 
Dann muss man auch keine "Nummern nachsehen".

#define TEXT_HALLO_WELT  4
(oder so ähnlich, da muss man sich eine anständige Nomenklatur erdenken 
und auch durchhalten)

und dann

LCD_Text(TEXT_HALLO_WELT);

Gruß
Andree

von MWS (Gast)


Lesenswert?

Für so etwas gibt's "Enum".

von Grübler (Gast)


Lesenswert?

An Andree und MWS

Vielen Dank für die wertvollen Tipps.
Ein Trottel bin ich nicht ;-)

von Εrnst B. (ernst)


Lesenswert?

Grübler schrieb:
> Ein Trottel bin ich nicht ;-)

Schade, sonst könnte dich vielleicht die Trottel-Sichere 
(Nummern-Vewechslungs-Sichere) Variante interressieren:
1
void writeString_p(const char *text)
2
{
3
    char Zeichen;
4
 
5
    while (Zeichen = pgm_read_byte(text))
6
    {   /* so lange, wie mittels pgm_read_byte ein Zeichen vom Flash gelesen
7
           werden konnte, welches nicht das "String-Endezeichen" darstellt */
8
 
9
        /* Das gelesene Zeichen über die normalen Kanäle verschicken */
10
        uart_putc(Zeichen);
11
        text++;
12
    }
13
}
14
15
int main(void)
16
{
17
 writeString_p(PSTR("Hallo"));
18
 writeString_p(PSTR("hier"));
19
 writeString_p(PSTR("Tasten"));
20
}

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.