Für eine ziffer geht immer noch:
char itoax(int input)
{
if (input > 9)
{
input += 0x41;
}
else
{
input += 0x30;
}
return input;
}
aber sowas gibt es doch sicherlich schon fertig, auch für grössere
zahlen oder ?
--
Gruß
Arne
Dafür gibt es (soweit ich weiß) unter C (ich vermute mal du meinst C)
nur s(n)printf. Ansonsten kannst Du deine ziffernweise Lösung auch
einfach erweitern wie:
static char buffer[100];
static char buffer_past_end=buffer+100;
char* uitoa_str(unsigned int zahl)
{
char* str_pos=str_buf;
*str_pos='0';
++str_pos;
*str_pos='x';
++str_pos;
do {
unsigned int rem = zahl%16;
*str_pos = rem < 10 ? rem+'0' : rem-10+'A';
++str_pos;
zahl/=16;
} while (zahl!=0 && str_pos+1<buffer_past_end);
(*str_pos)='\0';
return str_buf;
}
So in etwa, nicht getestet, aber das Prinzip stimmt wenigstens ;-)
Tim
> Dafür gibt es (soweit ich weiß) unter C (ich vermute mal du meinst C)
Ja, sonst hätte ich meine frage nicht in c geschrieben :-)
> static char buffer[100];
> static char buffer_past_end=buffer+100;
> char* uitoa_str(unsigned int zahl)
> {
> char* str_pos=str_buf;
> *str_pos='0';
> ++str_pos;
> *str_pos='x';
> ++str_pos;
> do {
> unsigned int rem = zahl%16;
> *str_pos = rem < 10 ? rem+'0' : rem-10+'A';
> ++str_pos;
> zahl/=16;
> } while (zahl!=0 && str_pos+1<buffer_past_end);
> (*str_pos)='\0';
> return str_buf;
> }
Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
so durchgestiegen bin :-)
Ich denke auch, das das funktionieren sollte, ich probier es mal aus.
warum deklarierst du die buffer statisch ?
--
Gruß
Arne
O.K., aber es hätte ja seien können, daß Du C++ noch in Betracht ziehst.
>> static char buffer[100];
>> static char buffer_past_end=buffer+100;
>> char* uitoa_str(unsigned int zahl)
>> {
>> char* str_pos=str_buf;
^^^^^^^
Oups, sollte natürlich 'buffer' heißen.
>> *str_pos='0';
>> ++str_pos;
>> *str_pos='x';
>> ++str_pos;
>> do {
>> unsigned int rem = zahl%16;
>> *str_pos = rem < 10 ? rem+'0' : rem-10+'A';
>> ++str_pos;
>> zahl/=16;
>> } while (zahl!=0 && str_pos+1<buffer_past_end);
>> (*str_pos)='\0';
>> return str_buf;
>> }
>
> Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
> so durchgestiegen bin :-)
Sorry, war schon spät, sonst hätte ich auch mehr Kommentare geschrieben
(bestimmt ;-).
> Ich denke auch, das das funktionieren sollte, ich probier es mal aus.
> warum deklarierst du die buffer statisch ?
Damit hat der Linker weniger zu tun falls man den Code in
eine dyn. Lib. packt, da dann buffer kein dynamisches Symbol mehr ist,
welches er sonst zu exportieren wäre.
Tim
Rein c ist mir ersmal lieber.
> Sorry, war schon spät, sonst hätte ich auch mehr Kommentare geschrieben
> (bestimmt ;-).
Nein, war ja nicht schlimm, ich habe das mit dem Fragezeichen vorher
noch nie gesehen, deswegen.
> Damit hat der Linker weniger zu tun falls man den Code in
> eine dyn. Lib. packt, da dann buffer kein dynamisches Symbol mehr ist,
> welches er sonst zu exportieren wäre.
Achso,
Sonst programmiere ich haupsächlich kleine Mikrocontroller, und da zählt
jedes byte was man zusätzlich belegt, deswegen bin ich darüber gestollpert.
Auf dem pc mit soundsoviel ram ist es ja fast egal.
--
Gruß
Arne
> Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
> so durchgestiegen bin :-)
Aus diesem Code kann man in der Tat gut lernen, wie man sowas _nicht_
macht.
Obiges API ist scheiße. Zeiger auf statische Puffer zurückliefern ist
iiih-yuck-kotz, wer sowas macht, programmiert auch in Visual Basic.
> Obiges API ist scheiße. Zeiger auf statische Puffer zurückliefern ist
Volle Zustimmung.
Das int itoax(unsigned int, char*, char*) besser ist, ist wohl klar.
> iiih-yuck-kotz, wer sowas macht, programmiert auch in Visual Basic.
Tim
--
Frank
Meine vermutung war ja, das es sowas irgentwo fertig in einer lib
versteckt gibt, und das wollte ich eignetlich nur wissen,
aber sorum ist auch gut, da lerne ich wenigstens was bei.
> Das int itoax(unsigned int, char*, char*) besser ist, ist wohl klar.
Gut, ich habe die routine von dir mal so hingeschrieben, wie es mir mal eben so schnell
am besten gefallen hat bzw. was mir am schnellsten eingefallen ist. Ein
/0 habe ich jetzt am Ende noch nicht in den String geschrieben.
char string[6] = {"0x0000"};
void itoax(unsigned int zahl,char *str_pos,char stellen)
{
unsigned int rem;
*str_pos='0';
++str_pos;
*str_pos='x';
str_pos += stellen;
do {
rem = zahl%16;
*str_pos = rem < 10 ? rem+'0' : rem-10+'A';
--str_pos;
--stellen;
zahl /=16;
} while (stellen > 0);
//(*str_pos )='\0';
//return str_buf;
}
Deine hex zahlen waren hinterher "falsch" herum, deswegen habe ich die
Routine so umgebastelt.
Jetzt seit ihr drann, wieder alles auseinander zu nehmen, und mir zu
sagen, was man besser anders macht, was noch fehlt (Fehlerkennung,
besseres handling usw).
--
Gruß
Arne
> 2. Fehlerhaft
ja ok, +0x31
> 3. Arbeitest Du
> auf einem 40x25
> Bildschirm?
nein, auf einem mikrocontroller zumindest
wo ich das so ähnlich gemacht habe.
Aber was ist in der Routine denn Bildschirmabhängig ?
--
Gruß
Arne
Er meinte vermutlich, daß Du dich auf den verwendeten Zeichensatz (hier
ASCII) festlegst *), deshalb habe ich auch 'A' geschrieben anstatt 65.
Natürlich hat man noch weiterhin angenommen, daß der Zeichensatz
die Buchstaben direkt hintereinander ablegen (zumindest bei EBCDI ist das
auch der Fall).
Tim
*) zumindest C legt den nämlich nicht fest.
--
Frank Klemm
> Natürlich hat man noch weiterhin angenommen, daß der Zeichensatz
> die Buchstaben direkt hintereinander ablegen (zumindest bei EBCDI ist das
> auch der Fall).
Verlassen darf man sich darauf laut C-Standard aber nur für die Ziffern
`0' ... `9'.
Anselm
--
Anselm Lingnau .......................................... ans...@strathspey.org
This `telephone' has too many shortcomings to be seriously considered as a
means of communication. The device is inherently of no value to us.
-- Western Union internal memo, 1876
Tim
--
Frank Klemm
Nimm doch einfach sprintf.