www.mikrocontroller.net

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


Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halloechen,

immer wieder stelle ich fest, dass der avrgcc offensichtlich 
String-Konstanten der Form
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

Autor: Peter Dannegger (peda)
Datum:

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

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


Peter

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:

> immer wieder stelle ich fest, dass der avrgcc offensichtlich
> String-Konstanten der Form
>
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?

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  display_string("some string...");


Wobei display_string wie folgt definiert ist:
void display_string(char* string)
{
  while (*string != '\0')
  {
    display_send((uint8_t)*string++, TXT);
  }
}

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

  display_send(buffer);

verwende, funktioniert es wie erwartet.

Wo ist das Problem?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:

> Wo ist das Problem?

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

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo ist das Problem?

char constant[] = "foobar";

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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,
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.

Autor: Stefan Ernst (sternst)
Datum:

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

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
> Und wenn dann wenigstens richtig lesen.

Bitte???

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)
>
>
> void display_string(char* string)
> ...
> display_send((uint8_t)*string++, TXT);
> 
>
> Du denkst, dass du hier einen Pointer an display_send übergibst?

Warum sollte das so sein? display_send erwartet
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.

Autor: Stefan Ernst (sternst)
Datum:

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

Er:
void display_string(char* string)
...
display_send((uint8_t)*string++, TXT);
char buffer[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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  display_string( buffer );
lauten.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
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.

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