realloc-Problem
-
Salut,
also ich hab hier folgenden Code der auch funktioniert, aber irgendwie habe ich das Gefühl ich hätte ziemlichen Bockmist gemacht. Um's genauer zu sagen hänge ich ein wenig an der realloc Anweisung.
Also die Funktion liefert korrekte Ergebnisse, trotzdem stimmt doch irgendwas nicht, oder?Schon mal danke für Hilfe im Voraus.
See ya
/*Prints out a given decimal number in hexadecimal format*/ void hex(unsigned long *num) { int i=0, *arr = (int*)malloc(sizeof(int)); do { *arr = realloc(&arr, sizeof(int)*(++i)); *(arr+i) = *num%16, *num/=16; }while (*num!=0); for (;i>0;--i) { if ( *(arr+i)>9) { switch (*(arr+i)) { case 10: printf("%c", 'A'); break; case 11: printf("%c", 'B'); break; case 12: printf("%c", 'C'); break; case 13: printf("%c", 'D'); break; case 14: printf("%c", 'E'); break; case 15: printf("%c", 'F'); break; default: printf("Some strange error occured"); break; } } else printf("%d", *(arr+i)); } free(arr); }
-
*arr ist der geholte speicher, arr ist der zeiger darauf, &arr gibt dir die addy der variable aus.
also überarbeite mal die ganzen Sterne und &-Zeichen.http://fraggle.alkali.org/stuffage/pointers/
probier mal itoa(), wenn du nur die funktion nicht gefunden hast.
Gruß
-
Warum eigentlich nicht einfach printf("%x", num); ?
-
das frag ich mich jetz auch
vielleicht will er mal ausprobieren, ob er so eine funktion hinbekommt.
da fehlt aber noch etwas konzeptwissen über pointer und c strings
-
Hallo,
c.rackwitz schrieb:
probier mal itoa(), wenn du nur die funktion nicht gefunden hast.
bitte nicht itoa im ANSI-C-Forum (->sprintf).
MfG
-
Hm, mir war grad langweilig also hab ich auch mal eine Funktion gehaxx0rt:
void int2hex2(unsigned int zahl) { int i, t; char res[9]={}; for(i=7; i >= 0; zahl>>=4, i--){ t=(zahl & 0xF); res[i]=t==10?'A':t==11?'B':t==12?'C':t==13?'D':t==14?'E':t==15?'F':t+'0'; } printf("%s\n", res); }
-
und die hier ist meine:
void inttohex(char *result, int value, int chars) { char *hexchars="0123456789ABCDEF"; result += chars; *result = 0; // NULL-terminated strings! while (chars-- > 0) { *(--result) = hexchars[value & 0x0F]; value = value >> 4; } }
sorry für das itoa(), da hab ich noch nicht nachgeschaut...
-
Ich hab mal unsere Lösungen kombiniert und konnte den Code nochmal verkürzen:
void int2hex3(unsigned int zahl) { int i; char res[9]={}; for(i=7;i>=0;res[i--]="0123456789ABCDEF"[zahl&0xF],zahl>>=4); printf("%s\n", res); }
-
lol, ich kanns mir nicht verkneifen, sry
void int2hex4(unsigned int z) {for(int i=7;i-->=0;printf("%c","0123456789ABCDEF"[z&0xF]),z>>=4);}
jetz is es ein geiler einzeiler!
-
Aber es ist kein gültiger C Code mehr und die Ausgabe ist verkehrt herum. Das umdrehen ist der einzige Grund, warum ichs auch nicht in eine Zeile gebracht habe. Trotzdem sehr roxx0r
-
ich merks grad und werkel schon
-
klar geht ein einzeiler
void int2hex(unsigned int z){if(z){int2hex(z>>4);printf("%c","0123456789abcdef"[z&15]);}}
-
hier noch meine überarbeitete version
void int2hex5(unsigned int z) {for (int i=0;i++<8;printf("%c","0123456789ABCDEF"[(z & 0xF0000000)>>0x1C]),z<<=4);}
[edit] und wehe, einer versteht das *g*
-
Hier meine neue Version:
void int2hex5(int z){ for(int i=7;i>=0;printf("%c","0123456789ABCDEF"[(z>>i*4)&(0xF)]),i--);}
Die Reihenfolge is jetzt richtig herum. In C müsste man halt das int aus der Schleife rausziehen aber sonst funzt es
@c.rackwitz: Wenn das so weitergeht müssen wir unsere Funktionen in namespaces packen
-
@Windalf: Dass dir du bei so kryptischen Haxx0r-Funktionen mitmachen würdest war mir klar
-
@Windalf: Dass dir du bei so kryptischen Haxx0r-Funktionen mitmachen würdest war mir klar
ja so ein Glück das ich gerade eben vorbeigeschaut habe
aber mein code ist weniger kryptisch als der von euch
-
ich merk grad, ich kann noch was sparen
void int2hex6(int z) {for (int i=0;i++<8;printf("%c","0123456789ABCDEF"[(z&(15<<7))>>0x1C]),z<<=4);}
[edit] aber Windalf hat echt die kürzeste Variante. Ist nur zu hoffen, dass es nicht irgendwann numerische Datentypen gibt, die größer als der Stack sind.
[noch ein edit] was hat das hier eigentlich noch mit realloc zu tun?
-
das frisst mein compiler auch noch weiss aber nicht obs nach ansi-c ist...
void int2hex(unsigned int z){z?int2hex(z>>4),printf("%c",z%16+48+(z%16>9)*7):0;}
[edit]
*kopfklatsch* putchar ist natürlich auch kürzer als printf...
[/edit]
-
Meine aktuelle Fassung:
void f(int z){for(int i=7;i>=0;putchar("0123456789ABCDEF"[z>>i--*4&15]));}
Es sind mit Leerzeichen übrigens 74 Zeichen
-
interpreter schrieb:
Warum eigentlich nicht einfach printf("%x", num); ?
das wär zu einfach *LOL*
-
Windalf schrieb:
[edit]
*kopfklatsch* putchar ist natürlich auch kürzer als printf...
[/edit]Nachmacher