mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uint8_t in char*


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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?
uint8_t i = 34;
char test[2];
test[0] = i;
test[1] = '\0';
char* result = &test;

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

Autor: Peter (Gast)
Datum:

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

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

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

>
> uint8_t i = 34;
> char test[2];
> test[0] = i;
> test[1] = '\0';
> char* result = &test;
> 
>
> 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.

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t i = 4;
uint8_t result[2];

result[0] = i + '0';
result[1] = '\0';

Für mehrstellige Zahlen:
#include <stdlib.h>

uint8_t Buffer[20];
int16_t i = 25;
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.

Autor: Sam .. (sam1994)
Datum:

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

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

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

Autor: Sam .. (sam1994)
Datum:

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

Autor: Joachim K. (minifloat)
Datum:

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

nein, musst du nicht.

hier zum selber probieren:
uint8_t buffer[2];

buffer[0] = 11;
buffer[1] = 22;

printf("%d\n" buffer[0]);     //liefert 11<newline> 

printf("%d\n" *buffer);       //liefert 11<newline>

printf("%d\n" *(buffer + 0)); //liefert 11<newline>

printf("%d\n" buffer[1]);     //liefert 22<newline>

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

Autor: Sam .. (sam1994)
Datum:

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

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

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

Autor: Joachim K. (minifloat)
Datum:

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

Autor: Bastel (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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
***
uint8_t  buffer[20];

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

Und kabooom.

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.