Forum: Mikrocontroller und Digitale Elektronik Zeichenkette ausgeben


von Günther (Gast)


Lesenswert?

const static char array[] PROGMEM = "0123456789";
char buffer;
static char help[100];
buffer = array[7];
sprintf_P(help,PSTR(" %d \n") buffer);
uart1_puts(help);


Hallo Leute,

ich sehe glaube ich vor lauter Bäumen den Wald nicht mehr.
In dem kurzen Quellcode oben versuche ich das siebte Element des Arrays 
auszugeben. Leider habe ich keinen erfolg. Sieht jemand den fehler?
Danke schonmal für eure Hilfe

von Peter II (Gast)


Lesenswert?

Günther schrieb:

> uart1_puts(help);

> const static char array[] PROGMEM = "0123456789";
> char buffer;
> buffer = array[7];
das kann schon mal nicht gehen

> sprintf_P(help,PSTR(" %d \n") buffer);
hier fehlt doch erstmal ein , oder nicht?

%d erwartet eine zahl - du übergibst aber ein zeichen.

von Karl H. (kbuchegg)


Lesenswert?

<sieht nach gcc aus>
1
const static char array[] PROGMEM = "0123456789";
2
...
3
buffer = array[7];
4
...

Auf Dinge, die im Flash liegen (erkennbar durch das PROGMEM) kannst du 
nicht einfach so zugreifen. pgm_read_byte benutzen.

AVR-GCC-Tutorial

von Günther (Gast)


Lesenswert?

Ich sag es ja der Wald :-)
Danke

Funktioniert jetzt bis auf einen schönheitsfehler.

 sprintf_P(help,PSTR("%x \r\n"),buffer);

diese zeile gibt mir richtig den hex wert aus.
Aber ich will den dezimalwert, da dachte ich immer %d oder %i wäre das 
richtige. da kommt allerdings Mist raus

von Cyblord -. (cyblord)


Lesenswert?

Günther schrieb:
> Ich sag es ja der Wald :-)
> Danke
>
> Funktioniert jetzt bis auf einen schönheitsfehler.
>
>  sprintf_P(help,PSTR("%x \r\n"),buffer);
>
> diese zeile gibt mir richtig den hex wert aus.
> Aber ich will den dezimalwert, da dachte ich immer %d oder %i wäre das
> richtige. da kommt allerdings Mist raus

sprintf docu zu raten ziehen? müsste ich jetzt auch machen...

von Peter II (Gast)


Lesenswert?

Günther schrieb:
> diese zeile gibt mir richtig den hex wert aus.
> Aber ich will den dezimalwert, da dachte ich immer %d oder %i wäre das
> richtige. da kommt allerdings Mist raus

du hast doch überhaupt keine zahl, du musst nichts umwandeln! Du hast 
schon einen String oder zumindest ein zeichen.

Wenn du unbedingt printf nutzen willst dann so:

sprintf_P(help,PSTR("%c \r\n"),buffer);

von Günther (Gast)


Lesenswert?

:-)
Merci

gegoogled und leider nicht gefunden. ich suche zwar noch weiter, aber 
hoffe das jemand die lösung weiß

von Günther (Gast)


Lesenswert?

Peter II schrieb:
> sprintf_P(help,PSTR("%c \r\n"),buffer);

;-)

mein Gott. Es gibt Tage da steht man besser nicht auf. Heute ist 
eindeutig so ein Tag

danke

von Peter II (Gast)


Lesenswert?


von Günther (Gast)


Lesenswert?

So, leider ahbe ich noch eine weitere Frage.

Natürlich will ich mehrere Arrays anlegen.


     buffer= pgm_read_byte(&array[4]);
     sprintf_P(help,PSTR("%c \r\n"),buffer);
das funktioniert 1A.

So jetzt MUSS ich dieses Programm erweitern. es wird:
array0,array1,...array10000 geben.

und jetzt will ich nicht 10000mal      buffer= pgm_read_byte(&array[4]);
schreiben.
habe ich da eine möglichkeit das abzukürzen?

von Günther (Gast)


Lesenswert?

ich habe nach sprint gegooglet :-(

von Karl H. (kbuchegg)


Lesenswert?

Günther schrieb:
> So, leider ahbe ich noch eine weitere Frage.
>
> Natürlich will ich mehrere Arrays anlegen.
>
>
>      buffer= pgm_read_byte(&array[4]);
>      sprintf_P(help,PSTR("%c \r\n"),buffer);
> das funktioniert 1A.
>
> So jetzt MUSS ich dieses Programm erweitern. es wird:
> array0,array1,...array10000 geben.

Warum willst du das?
Was steht in den anderen Arrays denn so drinnen?

Wie unterscheidest du denn, welches der 1000 Arrays das Richtige ist?

von Günther (Gast)


Lesenswert?

Also da stehen nur zeichen drin. und über eine eingabe über rs232 will 
ich ein bestimmtes zeichen (a) der  zeichenkette ausgeben. z.B. 
array773z4. und dann soll
buffer= pgm_read_byte(&array773[4]);
ausgeführt werden.
Die eingabe steht.
Ich habe die 773 in einer Variablen und die 4 in einer variabelen.
nur kann ich das nicht zusammenfügen zu einem Befehl

von Karl H. (kbuchegg)


Lesenswert?

Günther schrieb:
> Also da stehen nur zeichen drin. und über eine eingabe über rs232 will
> ich ein bestimmtes zeichen (a) der  zeichenkette ausgeben. z.B.
> array773z4. und dann soll
> buffer= pgm_read_byte(&array773[4]);
> ausgeführt werden.
> Die eingabe steht.
> Ich habe die 773 in einer Variablen und die 4 in einer variabelen.
> nur kann ich das nicht zusammenfügen zu einem Befehl

Aber du kannst die 774 genauso wie die 4 als Index in ein und dasselbe 
Array auffassen. Du hast dann halt ein 2-dimensionales Array anstatt 
vieler 1-dimensionaler.

von Günther (Gast)


Lesenswert?

so versuche ich es mal. danke

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.