realloc-Problem
-
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
-
@interpreter
hmm also nur f zu nehmen kommt meiner version klar zu gute:Dvoid f(int z){z?f(z>>4),putchar(z%16+48+(z%16>9)*7):0;}
56...
auf das mit dem putchar bin ich übrigens unabhängig von dir gekommen hab ich auch erst bei dir gelesen als ich mein post editiert habe (war vorher bei putc und hab dann stdin verwendet und deswegen auch das kopfklatsch warum ich nicht gleich putchar verwendet habe
-
Windalf schrieb:
@interpreter
hmm also nur f zu nehmen kommt meiner version klar zu gute:DMan muss sparen wo's geht
void f(int z){z?f(z>>4),putchar(z%16+48+(z%16>9)*7):0;}
56...
auf das mit dem putchar bin ich übrigens unabhängig von dir gekommen hab ich auch erst bei dir gelesen als ich mein post editiert habe (war vorher bei putc und hab dann stdin verwendet und deswegen auch das kopfklatsch warum ich nicht gleich putchar verwendet habe
Achso. Dachte du hast abgeschaut ;P
Auf alle Fälle respekt für die Funktion
-
@interpreter
diese wer schreibt die kürzeste funktion spielereien hab ich schon öfter mit Oxdeadbeef (der ist da absoluter Meister drin) auf www.fun-soft.de gespielt...
bei fast allen kleinen aufgaben gewinnt eigentlich fast immer die rekursion wenn man den funktionnamen mit nur einem buchstaben wählt, deshalb hab ich auch hier gleich mit rekursion angefangen...
-
Windalf schrieb:
@interpreter
diese wer schreibt die kürzeste funktion spielereien hab ich schon öfter mit Oxdeadbeef (der ist da absoluter Meister drin) auf www.fun-soft.de gespielt...
bei fast allen kleinen aufgaben gewinnt eigentlich fast immer die rekursion wenn man den funktionnamen mit nur einem buchstaben wählt, deshalb hab ich auch hier gleich mit rekursion angefangen...Ich sehs. Ich mach auch ab und zu mit ein paar anderen Studenten kleine Wettbewerbe, wer die kürzeste Funktion zusammenbringt. Neulich sollten wir ein Programm schreiben, dass vom 1. übergebenen Parameter einen kompletten hexdump (mit fest vorgeschriebenen Formatierungen) ausgibt. Damals konnte ich mit der Fassung noch gewinnen:
#include<cstdio> #define o printf main(int i,char**argv){FILE*f=fopen(argv[1],"r");int p=0;char b[17]={}; while(!feof(f)){fread(b,1,16,f);o("%04x: ",p);p+=16;for(i=0;i<16;i++){if(i==8)o("- ");b[i]==10?b[i]='.',o("10 "):o("%2x ",b[i]);}o("\t%s",b);for(i=0;i<17;b[i++]=0);}}
Aber du hast recht. Werd mich in Zukunft auf rek. Versionen fokusieren
-
woah,
wenn ich gewusst hätte dass diese Geschichte so abgeht wäre ich heute vor 1 aufgestanden.
danke an alle die gepostet haben, hab's jetzt hingekriegt, auch wenn ich mehr als eine zeile zwecks Lesbarkeit gewählt hab.
ja, die Pointer geschichte und C krieg ich nicht immer so unter einen Hut.Thanks a lot
GPC
-
GPC schrieb:
hab's jetzt hingekriegt, auch wenn ich mehr als eine zeile zwecks Lesbarkeit gewählt hab.
Spricht für dich.