Forum: Compiler & IDEs Verwendung von Stringkostanten mit dem AVR?


von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Halloechen,

immer wieder stelle ich fest, dass der avrgcc offensichtlich 
String-Konstanten der Form
1
char* constant = "foobar";

nicht richtig verwendet. Konkret heisst das dass ich nu garble habe an 
dieser Speicherstelle.

Muss ich da irgendwas besonderes beachten, evt. einen Compiler-Switch 
usw...?


Michael

von Peter D. (peda)


Lesenswert?

Michael G. wrote:
> immer wieder stelle ich fest, dass der avrgcc offensichtlich
> String-Konstanten der Form
>
>
1
> char* constant = "foobar";
2
>
>
> nicht richtig verwendet.

Dazu müßte man erstmal wissen, wie Du sie verwendest.


Peter

von Stefan E. (sternst)


Lesenswert?

Michael G. wrote:

> immer wieder stelle ich fest, dass der avrgcc offensichtlich
> String-Konstanten der Form
>
1
char* constant = "foobar";
>
> nicht richtig verwendet.

Ich habe diesbezüglich noch keine Probleme feststellen können.

> Konkret heisst das dass ich nu garble habe an
> dieser Speicherstelle.

Dass an der Speicherstelle "constant" nicht der Text selber steht, 
sondern ein Pointer auf diesen, ist klar?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Stefan Ernst wrote:

> Dass an der Speicherstelle "constant" nicht der Text selber steht,
> sondern ein Pointer auf diesen, ist klar?

Stefan... ganz so daemlich bin ich dann auch nicht ;)

OK dann mal ein konkretes Beispiel:
1
  display_string("some string...");


Wobei display_string wie folgt definiert ist:
1
void display_string(char* string)
2
{
3
  while (*string != '\0')
4
  {
5
    display_send((uint8_t)*string++, TXT);
6
  }
7
}

Wenn ich Den String in der Art
1
  char buffer[3];
2
  ...
3
  buffer[0] = 'a';
4
  buffer[1] = 'b';
5
  buffer[2] = '\0';
6
7
  display_send(buffer);

verwende, funktioniert es wie erwartet.

Wo ist das Problem?

von Stefan E. (sternst)


Lesenswert?

Michael G. wrote:

> Wo ist das Problem?

In den beiden Beispielen wird "display_send" komplett unterschiedlich 
verwendet. Wie ist denn das definiert?

von dummy (Gast)


Lesenswert?

>Wo ist das Problem?

char constant[] = "foobar";

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Achso ich hatte vergessen: display_send(uint8_t, uint8_t) hatte 
lediglich das zweite Argument vergessen im Beispiel.

dummy: Das ist eine aequivalente Schreibweise.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ich hab das Problem gefunden!
Die Sektion .data wurde von avr-objcopy nicht mit ins Hexfile 
uebernommen, daher waren die Strings undefiniert!

Thx anyway ;)

von Stefan E. (sternst)


Lesenswert?

Michael G. wrote:
> Achso ich hatte vergessen: display_send(uint8_t, uint8_t) hatte
> lediglich das zweite Argument vergessen im Beispiel.

Naja, nicht nur das. Im ersten Beispiel übergibst du ein einzelnes 
Zeichen, im Zweiten einen Pointer.
Aber egal, geht ja jetzt. ;-)

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ne Stefan, das waren in beidem Falle Pointer. Aber egal ich wusst doch 
dass das Problem nicht da liegen kann ;)

von Sven P. (Gast)


Lesenswert?

Michael G. wrote:
> Ich hab das Problem gefunden!
> Die Sektion .data wurde von avr-objcopy nicht mit ins Hexfile
> uebernommen, daher waren die Strings undefiniert!
Die hat doch im Hexfile auch überhaupt nix zu suchen, oder? .data ist 
doch fürs RAM?!

Ich mein,
1
char *konstante = "abc";
ist schon saublöde: Das braucht vier Bytes im Flash (abc\0) und dann 
wirds beim Programmstart ins RAM kopiert und brauch da nochmal vier 
Bytes.
Such lieber mal nach PROGMEM.

von Stefan E. (sternst)


Lesenswert?

Michael G. wrote:
> Ne Stefan, das waren in beidem Falle Pointer. Aber egal ich wusst doch
> dass das Problem nicht da liegen kann ;)
1
void display_string(char* string)
2
...
3
display_send((uint8_t)*string++, TXT);

Du denkst, dass du hier einen Pointer an display_send übergibst?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Oh man Leute... lasst's doch einfach ma gut sein, ok? ;) Und wenn dann 
wenigstens richtig lesen.

von Stefan E. (sternst)


Lesenswert?

Michael G. wrote:
> Und wenn dann wenigstens richtig lesen.

Bitte???

von Simon K. (simon) Benutzerseite


Lesenswert?

Stefan Ernst wrote:
> Michael G. wrote:
>> Ne Stefan, das waren in beidem Falle Pointer. Aber egal ich wusst doch
>> dass das Problem nicht da liegen kann ;)
>
>
1
> void display_string(char* string)
2
> ...
3
> display_send((uint8_t)*string++, TXT);
4
>
>
> Du denkst, dass du hier einen Pointer an display_send übergibst?

Warum sollte das so sein? display_send erwartet
1
display_send(uint8_t, uint8_t)
Um ihn mal von oben zu zitieren. Und ich vermute mal, dass es ein 
einzelnes Zeichen auf das Display schreibt. So würde nämlich auch diese 
while-Schleife Sinn machen, die da nämlich drumherum gebaut ist ;)

Mit "beide Fälle" meint er vermutlich lokale Variable vs. 
Stringkonstante.

von Stefan E. (sternst)


Lesenswert?

Simon K. wrote:
> Stefan Ernst wrote:
>> Michael G. wrote:
>>
1
>> void display_string(char* string)
2
>> ...
3
>> display_send((uint8_t)*string++, TXT);
4
>>
>>
>> Du denkst, dass du hier einen Pointer an display_send übergibst?
>
> Warum sollte das so sein?

Er:
1
void display_string(char* string)
2
...
3
display_send((uint8_t)*string++, TXT);
1
char buffer[3];
2
...
3
display_send(buffer);

Ich:
> In den beiden Beispielen wird "display_send" komplett unterschiedlich
> verwendet. Wie ist denn das definiert?

Er:
> Achso ich hatte vergessen: display_send(uint8_t, uint8_t) hatte
> lediglich das zweite Argument vergessen im Beispiel.

Ich:
> Naja, nicht nur das. Im ersten Beispiel übergibst du ein einzelnes
> Zeichen, im Zweiten einen Pointer.

Er:
> Ne Stefan, das waren in beidem Falle Pointer.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ihr seid schon lustig ;)

Ich hab mir auch mal die Sache mit Progmem reingezogen aber wegen ner 
einzigen Stringkostante sehe ich da keine Notwendigkeit zu. Sollte ich 
mal viele Konstanten speichern muessen werde ich mich daran erinnern.

Das Problem hat sich ja auch auf initalisierungen erstreckt durch die 
fehlende Sektion. Das sorgt dann schon fuer Frust wenn man's nicht 
weiss. Ich finde das ist sparen an der falschen Stelle.

Thx anyway :P

von Karl H. (kbuchegg)


Lesenswert?

Michael G. wrote:
> Ihr seid schon lustig ;)

Nicht wirklich.
Du hast am Anfang einen Tippfehler gemacht und darauf wird
jetzt rumgeritten :-)

Was wieder mal zeigt, dass Code immer per Cut&Paste übernommen
und nicht neu eingetippt werden soll.

Aus einem deiner ersten Postings


> Wenn ich Den String in der Art
>  char buffer[3];
>  ...
>  buffer[0] = 'a';
>  buffer[1] = 'b';
>  buffer[2] = '\0';
>
>  display_send(buffer);

Hier muss es offensichtlich
1
  display_string( buffer );
lauten.

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.