uint8_t in char*

OP #1933704
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.
Gast #1933717
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.
#1933718
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.
#1933724
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.
OP #1933728
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.
#1933734
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.
OP #1933743
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.
#1933745
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
#1933794
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren