Forum: Mikrocontroller und Digitale Elektronik uint8_t in char*


von Sam .. (sam1994)


Lesenswert?

Hallo

Das ist für viele sicher eine leichte Frage - ich weiß es aber trotzdem 
nicht. Ich möchte den uint8_t Wert als ASCII-Wert in den char* bekommen.
Also hat der char immer 2 Zeichen: den uint8_t Wert + \0.
Macht man das dann so?
1
uint8_t i = 34;
2
char test[2];
3
test[0] = i;
4
test[1] = '\0';
5
char* result = &test;

Ich glaub zwar nicht, dass das stimmt, aber das wäre mein Ansatz.

von Peter (Gast)


Lesenswert?

ja so ist es erstmal drin, aber die frage ist in welcher form es rein 
soll.

du willst ja bestimmt das es so drin ist oder?

'3', '4', '\0'

dann merkst du aber schon das man dafür 3 zeichen braucht.

auch das ist sehr böse

char* result = &test;

das result darf man nur verwenden solange man noch im kontext ist wo 
test noch gültig ist.

von Karl H. (kbuchegg)


Lesenswert?

Samuel K. schrieb:

> nicht. Ich möchte den uint8_t Wert als ASCII-Wert

Da muss man jetzt nachhaken.

Wenn dein uint8_t Wert 34 ist, welchen Text soll das ergeben?
Soll das "34" sein, oder soll das " sein. Denn der ASCII Code von " ist 
34

>
1
> uint8_t i = 34;
2
> char test[2];
3
> test[0] = i;
4
> test[1] = '\0';
5
> char* result = &test;
6
>
>
> Ich glaub zwar nicht, dass das stimmt, aber das wäre mein Ansatz.

Prinzipiell kann man das so machen. Aber wie gesagt, die Frage ist, ob 
das das Ergebnis liefert welches du haben willst.

von Achim M. (minifloat)


Lesenswert?

Hallo

Samuel K. schrieb:
> uint8_t i = 34;
> char test[2];
> test[0] = i;
> test[1] = '\0';
> char* result = &test;
                 ^hier nicht
<test> ist schon ein Zeiger, der auf den Arrrayanfang zeigt

Für einstellige Zahlen geht das hier:
1
uint8_t i = 4;
2
uint8_t result[2];
3
4
result[0] = i + '0';
5
result[1] = '\0';

Für mehrstellige Zahlen:
1
#include <stdlib.h>
2
3
uint8_t Buffer[20];
4
int16_t i = 25;
5
itoa( i, Buffer, 10 );

Benutzung:
itoa(zahl, zielstring, Basis des Zahlensystems);

mfg mf

PS: irgendwo hier im Wiki gab es eine Platzsaprende itoa variante, die 
nur Dezimal kann, dafür Codegrößenoptimiert für AVR ist.

von Sam .. (sam1994)


Lesenswert?

Ich möchte das bei 34 der char nicht "34" heißt sondern [mal nach 
ASCII Tabelle suchen...] "\"" (warum muss 34 auch grad " sein).

Der ASCII - Zeichensatz geht ja von 0-255 (8bit). Nun sollen alle 
Zeichen durchgegangen werden (ASCII-Tabelle: 
http://www.torsten-horn.de/techdocs/ascii.htm).


Es geht beim ganzen darum, alle ASCII Werte als Test zu senden.

Peter schrieb:
> das result darf man nur verwenden solange man noch im kontext ist wo
> test noch gültig ist.

Irgendwie muss ich doch aus dem char-array ein Zeiger machen.
Danach kommt außerdem sofort die Senderoutine.

von Karl H. (kbuchegg)


Lesenswert?

Samuel K. schrieb:
> Ich möchte das bei 34 der char nicht "34" heißt sondern [mal nach
> ASCII Tabelle suchen...] "\"" (warum muss 34 auch grad " sein).
>
> Es geht beim ganzen darum, alle ASCII Werte als Test zu senden.

Dann passt das so. Allerdings ohne den &
Der Name eines Arrays ohne Indizierung degeneriert automatisch zu einem 
Pointer auf das erste Array Element.

> Peter schrieb:
>> das result darf man nur verwenden solange man noch im kontext ist wo
>> test noch gültig ist.
>
> Irgendwie muss ich doch aus dem char-array ein Zeiger machen.
> Danach kommt außerdem sofort die Senderoutine.


Dazu brauchst du aber keinen extra Pointer.
In eine Funktion, die einen Pointer übernimmt, kann man genausgut auch 
ein Array reinstopfen. Ein Array degeneriert in diesem Fall automatisch 
zu einem Pointer auf sein erstes Element.


Allerdings:
Eine übliche Funktion, die einen String versendet (denn genau das hast 
du ja gebaut), stützt sich normalerweise auf eine Funktion, die einen 
einzelnen char verschickt. Wenn du diese Funktion benutzt, kannst du dir 
den ganzen Aufwand einen String zu bauen überhaupt sparen.

von Sam .. (sam1994)


Lesenswert?

Karl heinz Buchegger schrieb:
> Eine übliche Funktion, die einen String versendet (denn genau das hast
> du ja gebaut), stützt sich normalerweise auf eine Funktion, die einen
> einzelnen char verschickt. Wenn du diese Funktion benutzt, kannst du dir
> den ganzen Aufwand einen String zu bauen überhaupt sparen.

Danke, durch dich hab ich meinen Irrtum bemerkt.
Ich habe die ganze Zeit ein const char* gesehen. Jetzt sehe ich das da 
eigentlich nur const char* steht. Deswegen kommt auch nur Murks an wenn 
ich einen char* sende.

von Achim M. (minifloat)


Lesenswert?

Samuel K. schrieb:
> Irgendwie muss ich doch aus dem char-array ein Zeiger machen.

nein, musst du nicht.

hier zum selber probieren:
1
uint8_t buffer[2];
2
3
buffer[0] = 11;
4
buffer[1] = 22;
5
6
printf("%d\n" buffer[0]);     //liefert 11<newline> 
7
8
printf("%d\n" *buffer);       //liefert 11<newline>
9
10
printf("%d\n" *(buffer + 0)); //liefert 11<newline>
11
12
printf("%d\n" buffer[1]);     //liefert 22<newline>
13
14
printf("%d\n" *(buffer + 1)); //liefert 22<newline>

Grund: buffer ist ein Zeiger auf den Arrayanfang, also auf das erste 
Element. Mit *buffer bekomme ich den ersten Speicherzelleninhalt meines 
Arrays.

mfg mf

von Sam .. (sam1994)


Lesenswert?

Samuel K. schrieb:
> const char* steht.

Da steht natürlich const char ohne *.

Jo K. schrieb:
> Grund: buffer ist ein Zeiger auf den Arrayanfang, also auf das erste
> Element. Mit *buffer bekomme ich den ersten Speicherzelleninhalt meines
> Arrays.

Danke, das wusste ich noch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Samuel K. schrieb:

> Jo K. schrieb:
>> Grund: buffer ist ein Zeiger auf den Arrayanfang, also auf das erste
>> Element. Mit *buffer bekomme ich den ersten Speicherzelleninhalt meines
>> Arrays.
>
> Danke, das wusste ich noch nicht.

Es ist auch etwas missverständlich ausgedrückt.

buffer an sich ist kein Zeiger. buffer ist ein Array.
Aber in bestimmten Situationen degeneiert buffer ohne dein Zutun 
automatisch zu einem Zeiger auf das erste Arrayelement. buffer ist 
daher kein Zeiger. Aber es verhält sich so, wenn man den Namen des 
Arrays in bestimmten Situationen ohne eine Indexoperation benutzt.

zb kann man an einen Pointer einen neuen Wert, eine andere Adresse 
zuweisen. An buffer kann man das natürlich nicht.
Immer dann, wenn man sich mit einer extern Deklaration auf ein Array 
bezieht, kann man nicht einfach sagen: Och das ist ja eh nur ein 
Pointer. etc.
Daher ist die Aussage: Das Array xyz ist eigentlich ein Pointer nur sehr 
eingeschränkt gültig. Ein Array ist nun mal kein Pointer und ein Pointer 
ist kein Array.

von Achim M. (minifloat)


Lesenswert?

Wobei man bei meinem printf-Gefummel die enge Verwandtschaft von Pointer 
und Array sieht. Man könnte doch sagen es ist ein konstanter Zeiger. mfg 
mf

von Bastel (Gast)


Lesenswert?

Könnte man nicht sagen ein Array ist ein Pointer mit reserviertem 
Speicherplatz dahinter? (oder so ähnlich?)

von Karl H. (kbuchegg)


Lesenswert?

Jo K. schrieb:
> Wobei man bei meinem printf-Gefummel die enge Verwandtschaft von Pointer
> und Array sieht. Man könnte doch sagen es ist ein konstanter Zeiger. mfg
> mf

Nicht wirklich.
Ansonsten nehm ich dich nämlich beim Wort:

a.c
***
1
uint8_t  buffer[20];

b.c
***
1
extern uint8_t * const buffer;

Und kabooom.

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.