PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann ich einen Integer einfach in einen Char umwandeln



Andun
13.07.2005, 21:37
Moin

Also die Frage ist ganz einfach und ist wahrscheinlich auch mit einem satz beantortet, aber ich weiß die Antwort halt nciht.

Wie kann ich einen Integer einfach in einen Char umwandeln

Ich würde mir nämlich gerne die Werte die der Asuro von den Sensoren liest über die IR-Terminal Verbindungs ausgeben lassen.

Wenn ich aber an SerWrite() einfach nur die Adresse des Wertes übergebe, wird dieser natürlich als ASCII Zeichen interpretiert und nicht als Zeichen.

Also ich will zum Beispiel nicht dass ASCII Zeichen Nr. 1, sonder dass ASCII Zeichen, dass die 1 darstellt. Ich denke ihr wisst was ich meine und dafür muss es doch eine einfache Möglichkeit geben.

Ich hab mir schon mal die stdlib.h angeguckt, aber 1. weiß ich nciht ob man die so einfach auch im Asuro C verwenden kann und 2. bin ich mir nicht sicher ob da die Funktion drin ist die ich brauche.

Danke für die Hilfe

Andun

izaseba
13.07.2005, 22:10
durchsuche Forum nach -> itoa

Andun
13.07.2005, 22:21
achso
ok
danke.

Nachtrag:

Ich hatte diese Funktion schon probiert. Aber ich war zu blöd, dran zu denken einen Header einzubinden. Dann hatte ihc hier in meine C Referenz geguckt, aber natürlich nichts gefunden.

Hier mal die Zusammenfassung, für alle die das hier auch mal finden:


Du musst stdlib.h includieren.
Dann sind die Warnungen weg.



#include <stdlib.h>
char *itoa(int value, char *string, int radix);

PARAMETERS
value:
Is the integer to be converted to string representation.
string:
Points to the buffer that is to hold resulting string. The resulting string aray be as long as seventeen bytes.
radix:
Is the base of the number; must be in the range 2 - 36. [Also normalerweise 10, beim Dezimalsystem]



Übrigens: itoa ist keine Standard-Funktion (=nicht im C-Standard enthalten). Das solltest du immer im Hinterkopf behalten, wenn du itoa einsetzt. Das korrekte Vorgehen in C wäre die Funktion sprintf. Weil die für Mikrocontroller aber häufig überdimensioniert ist, bieten viele Bibliotheken eben (entgegen des Standards) die Funktion itoa an.

SprinterSB
14.07.2005, 10:45
DU meinst int -> char?

int an_int;
char a_char;

a_char = (char) an_int;


Oder String (char*) ?

schamp
14.07.2005, 11:24
Glaub eher er meint, wenn er z.b. dezimal 78 anzeigen will, dann auch 78 angezeigt wird. Und nicht 'N' in diesem Falle.

Das Prob hab ich auch atm. Mein Term interpretiert die Zeichen falsch :|
Hat jemand Lösung bzw. Lösungsansätze für das Prob ??

btw, diese itoa-Funktion gibts bei mir nich inner stdlib, nur die atoi.....

Andun
14.07.2005, 12:43
@schamp: Ich wusste ja auch nichts von der Funktion weil sie ja nicht in den Referenzen auftaucht.

Du kannst auch die sprintf() verwenden aus der stdio.h, aber das Problem ist hier, dass die Datei halt stark größer wird, als man es eigentlich braucht.

voidpointer
14.07.2005, 12:52
Ist die falsche Fragestellung. Hier soll kein int in ein char (die beiden Typen sind equivalent) sondern in einen Hex-String umgewandelt werden. In etwa so:


static const unsigned char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B',' C','D','E','F'};
char a = 'A'; // int a = 65;
printf("%c%c\n", hex[a/16], hex[a%16]);
Das ist allerdings Linux-C. Keine Ahnung, ob es auf dem AVR so kompiliert.

SprinterSB
14.07.2005, 14:59
Also mein avr-gcc (3.4) nimmt nach

#include <stdlib.h>

brav das itoa() ist der libc.a.

Oder selber Hand anlegen:

char buf[6];

void itoa (unsigned short num)
{
char i;

for (i=4; i>=0; i--)
{
char digit = num % 10;
if (i < 4 && num == 0)
digit = ' ';
else
digit += '0';

num /= 10;
buf[i] = digit;
}
}

buf[] enthält danach den ASCII-String mit abschliessender '\0'.
Die '\0' wird schon im startup Code geschrieben. Das geht aber bestimmt noch kürzer und schneller mit der div() Funktion, die gleichzeitig Rest und Quotient liefert.

Falls dein Terminal das nicht darstellt wie gewohnt, musst du eben noch den ASCII nach Terminal-Sonderlocke-Format konvertieren.