PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : itoa???



chientech
25.04.2007, 15:35
Hi,
ich möchte eine int-Zahl in asci umwandeln -> itoa und mit USART ausgeben.

Wie muss ich diese Funktion anwenden?

unsigned int buffer[];
USART_transmit_s(itoa(22,buffer[0],3));


FEHLER:
Warning passing arg 2 of 'itoa' makes pointer from int without a cast.

Was mach ich falsch? Hat jemand erfahrung damit?
Wäre nett wenn ihr mir weiterhelfen könntet.

robo junior
25.04.2007, 15:47
Hallo

als erstes Argument bekommt itoa die Integervariable, bzw den Integerwert, das zweite Argument ist ein char Array (nicht wie bei dir ein Int-Array) das 3. Argument gibt dann an wie der Integerwert umgewandelt werden soll (z.b. 10 für Dezimalsystem)
sieht dann so aus:



char wert[5];
itoa(variable,wert,10);


'wert' kannst du dann per USART übertragen.

uwegw
25.04.2007, 15:47
Dein Array sollte aus unsigned char bestehen und ein Größenangabe haben.
unsigned char buffer[7];

itoa will nicht den Inhalt der ersten Bufferposition (buffer[0]), sondern einen Zeiger auf den Anfang des buffers.
itoa(22,buffer,3);

und da du wohl Dezimalzahlen haben willst und kein Dreiersystem, wäre 10 statt 3 als Basis wohl besser.
itoa(22,buffer,10);

chientech
26.04.2007, 09:34
Danke für die schnellen Antworten.

ich hab es jetzt hinbekommen.

Phantomix
07.05.2007, 02:31
Falls du eine selbstgeschriebene Funktion willst die das tut, wie wärs damit:




int IntToChars (char* buffer, int value, int spaceonbuffer, int countbase)
{
int workvalue = value;
int i;
int valuetowrite;
int end_i = 0;

if (value < 0)
{
workvalue = -value;
end_i = 1;
buffer[0] = '-';
}

for (i = spaceonbuffer - 1; i >= end_i; i--)
{
valuetowrite = (workvalue % countbase);
if (workvalue == 0)
{
if (i == (spaceonbuffer - 1))
{
buffer[i] = 48; // ASCII 0
} else {
buffer[i] = 32; // ASCII SPACE
}
} else {
if (valuetowrite > 9)
{
buffer[i] = valuetowrite + 55; // ASCII A-Z
} else {
buffer[i] = valuetowrite + 48; // ASCII of that character
}
};
workvalue = (workvalue - valuetowrite) / countbase;
}
return (workvalue); //this should be zero if enough space on buffer!
//otherwise it contains the digits not printed out
}


lustige funktion die während dem robotik praktikum im rahmen meines informatikstudiums entstand ;-) wir haben da asuros rumfahren lassen.

Als ich die funktion fertig hatte hab ich dann festgestellt dass die nix anderes tut als itoa *lol* na wenigstens kann man über countbase einstellen ob man zur basis 2...36
mehr als 36 ist ungünstig wegen dem alphabet mit 26 zeichen ;-)


Edit: Bug gefunden