Hallo, es ist schon pervers was mit C alles machbar ist. Ich hab da mal den folgenden Code zusammengebastelt und der läuft unter dem Dev-C++ Compiler. Nur blickt doch kein Schwein mehr sowas ;-) Für i sollte übrigens am Ende 80 rauskommen. Was habt ihr noch für Ideen wie man den Code noch "unverständlicher" hinkriegt? ;-) Gruß, Thomas #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { unsigned int* b,i=0,z=2,v=1; unsigned int a[3][3]={0,8,6,4,2,9,7,3,5}; a[-10,3.141,2][-0.5486954E+12,1,1]=8; b=&i; i=5,9,5.5896410,6.59452,6,1,i++,i=i<=5<=7,i++,*b=char(-0xF8)+(unsigned int)(~0xDE&(char)((*b+v[z[a]])<<2)),*b+='\'',i++; printf("\ni=%i\n\n",i); system("PAUSE"); return EXIT_SUCCESS; }
International Obfuscated C Code Contest http://www.de.ioccc.org/years.html Schönes Beispiel: gavare.c
1 | X=1024; Y=768; A=3; |
2 | |
3 | J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:??AAF" |
4 | "FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/" |
5 | "31/531/53"[b ]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0, I (x,Y/2,X |
6 | )):(E=X); }H(x){I(x, _,0);}p;q( c,x,y,z,k,l,m,a, b){F(c |
7 | );x-=E*M ;y-=S*M ;z-=C*M ;b=x* x/M+ y*y/M+z |
8 | *z/M-D*D *M;a=-x *k/M -y*l/M-z *m/M; p=((b=a*a/M- |
9 | b)>=0?(I (b*M,_ ,0),b =E, a+(a>b ?-b:b)): -1.0);}Z;W;o |
10 | (c,x,y, z,k,l, m,a){Z=! c? -1:Z;c <44?(q(c,x ,y,z,k, |
11 | l,m,0,0 ),(p> 0&&c!= a&& (p<W ||Z<0) )?(W= |
12 | p,Z=c): 0,o(c+ 1, x,y,z, k,l, m,a)):0 ;}Q;T; |
13 | U;u;v;w ;n(e,f,g, h,i,j,d,a, b,V){o(0 ,e,f,g,h,i,j,a);d>0 |
14 | &&Z>=0? (e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Z),u=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w) |
15 | /3,H(u*u+v*v+w*w),b/=D,b*=b,b*=200,b/=(M*M),V=Z,E!=0?(u=-u*M/E,v=-v*M/E,w=-w*M/ |
16 | E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2),i-=v*E/(M/2),j-=w*E/(M/2),n(e,f,g,h,i,j,d-1 |
17 | ,Z,0,0),Q/=2,T/=2, U/=2,V=V<22?7: (V<30?1:(V<38?2:(V<44?4:(V==44?6:3)))) |
18 | ,Q+=V&1?b:0,T +=V&2?b :0,U+=V &4?b:0) :(d==P?(g+=2 |
19 | ,j=g>0?g/8:g/ 20):0,j >0?(U= j *j/M,Q =255- 250*U/M,T=255 |
20 | -150*U/M,U=255 -100 *U/M):(U =j*j /M,U<M /5?(Q=255-210*U |
21 | /M,T=255-435*U /M,U=255 -720* U/M):(U -=M/5,Q=213-110*U |
22 | /M,T=168-113*U / M,U=111 -85*U/M) ),d!=P?(Q/=2,T/=2 |
23 | ,U/=2):0);Q=Q< 0?0: Q>O? O: Q;T=T<0? 0:T>O?O:T;U=U<0?0: |
24 | U>O?O:U;}R;G;B ;t(x,y ,a, b){n(M*J+M *40*(A*x +a)/X/A-M*20,M*K,M |
25 | *L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P, -1,0,0);R+=Q ;G+=T;B +=U;++a<A?t(x,y,a, |
26 | b):(++b<A?t(x,y,0,b):0);}r(x,y){R=G=B=0;t(x,y,0,0);x<X?(printf("%c%c%c",R/A/A,G |
27 | /A/A,B/A/A),r(x+1,y)):0;}s(y){r(0,--y?s(y),y:y);}main(){printf("P6\n%i %i\n255" |
28 | "\n",X,Y);s(Y);} |
Was ist denn mit Perl? ;-) $a= "cpuu \bmft p \bg cff \bs";$b ="po ui \bf xbm \bm";$c=" Ypv ublf p \bof epxo qb \btt ju bspvoe"; $a =~ s/\n//;$a =~ s/\s+/ /g; $b =~ s/\n// ; $b =~ s/\s+/ /g;$c =~ s/\n// ; $c =~ s/\s+/ /g;$a =~ y/b-z/a-z/;$b =~ tr/b-z/a-z/;$c =~ tr/b-z/a-z/ ; for( $d=100;$d>0;$d--){ print"$d $a $b $d" ;print" $a,\n$c, " ;print($d-1);print " $a $b.\n";} $x = "cjc"; $y="dobbz"; $z="com";print"\n" ;print "- $x\@$y." ;print"$z \n\n"; http://www.99-bottles-of-beer.net/
> i=5,9,5.5896410,6.59452,6,1,i++,i=i<=5<=7,i++,*b=char(-0xF8)+(unsigned
int)(~0xDE&(char)((*b+v[z[a]])<<2)),*b+='\'',i++;
Was bewirkt denn diese Komma-Schreibweise? Noch nie gesehen ^^
Stink normaler Komma-Operator Der Komma Operator wertet alle Teilasudrücke aus. Das Ergebnis des Komma Operators ist der am weitesten rechts stehende Ausdruck i = 5, 9, 5.589; ist also identisch mit i = 5.589; Die dazwischenliegenden Ausdrücke sind nur aufgrund ihrer Nebeneffekte (wenn überhaupt) interessant. Findest du in jedem C Buch.
Hehe...seltsam, noch nie gesehen! Macht IMHO aber auch kaum jemals Sinn bzw. gibt gefährlich unübersichtlichen Code. (Ausser für Variabelndeklarationen, dort kenne ich es.)
> Hehe...seltsam, noch nie gesehen! Macht IMHO aber auch kaum > jemals Sinn bzw. gibt gefährlich unübersichtlichen Code. Ganz genau. Die einzige Stelle wo man sowas unter Umständen benutzt ist hier: for( i = 0, j = 5, k = 8; i < 12; ++i, j = 2 * j ) > (Ausser für Variabelndeklarationen, dort kenne ich es.) Dort ist das Komma aber kein Kommaoperator :-)
Interessant, aber >Der Komma Operator wertet alle Teilasudrücke aus. Das Ergebnis >des Komma Operators ist der am weitesten rechts stehende Ausdruck wofür brauch man sowas?
> wofür brauch man sowas?
Wenn du mehrere Ausdrücke brauchst, aber nur eine
Expression zulässig ist.
for( i = 0, j = 5, k = 8; i < 12; ++i, j = 2 * j )
j = Relation ? j = 0, i = 5, k : 2 * m;
Aber wie Mr. Chip schon so treffend sagte:
gibt gefährlich unübersichtlichen Code.
Besonders lustig wird das Ganze in C++. Dort kann man den
Komma Operator auch noch überladen :-) Macht aber nicht
wirklich Sinn und es wird ausdrücklich eindringlich davor
gewarnt das jemals zu tun.
Aaaaah, ich verstehe. Das Komma da in deiner for-anweisung ist tatsächlich der gleiche Operator. Also der Operator führt alle Ausdrücke aus und gibt das Ergebnis des letzten Operators zurück (was bei deiner Anwendung mit dieser for-anweisung aber nebensächlich ist). Klingt logisch :-) Ma wieder wat jelernt.
Simon Küppers wrote: > Also der Operator führt alle Ausdrücke aus und gibt das Ergebnis des > letzten Operators zurück (was bei deiner Anwendung mit dieser > for-anweisung aber nebensächlich ist) Exakt. Bei dem ?: ist es dann allerdings nicht mehr nebensächlich > Ma wieder wat jelernt. Wie gesagt: Das for-Beispiel kommt manchmal vor. Vor allem im Inkrementteil sieht man das manchmal. Seltener, aber doch, im Initialisierungsteil. Das ?: Beispiel ist etwas konstruiert. In realem Code habe ich das so noch nie gesehen.
Hilfe ich stehe aufm Schlauch und das nicht undezent Problem: CVAVR using intern EEprom (Atmega32) Ich bekomme die Strings zwar ins Eeprom aber auslesen gelingt mir zur laufzeit nicht. Irgend wie klappt das mit den Zeigern auch nicht und mein Schatz ist schon sauer weil ich nicht auf die Matratze finde. Aber wie das so ist ein ungelöstes Dillemma läßt mich nicht schlafen ;-) assembler wäre ein Ausweg aber wintutrial und gvcc helfen mir nicht weiter. es muss mit CVAVR compatibel werden. Ziel String von Eeprom an UART bringen.
sorry fürs OT woolte eigentlich eigenes thema machen aber vielleicht gehts auch so ;-)
> Ich bekomme die Strings zwar ins Eeprom aber auslesen gelingt mir zur > laufzeit nicht. Irgend wie klappt das mit den Zeigern Zeig doch mal etwas Code her. Laut Handbuch sollte das recht einfach gehen. eeprom Variablen müssen globale Variablen sein. Du holst dir dann Zeichen für Zeichen vom EEprom in eine Zwischenvariable und von dort gehts weiter zur UART. Ich hab keinen CVAVR da, kann also nur nach dem gehen was ich im Handbuch sehe. Also: Was hast du konkret programmiert?
sorry den rechner musste ich schon schlafen schicken, da in dem zimmer unser weinachtsgasteinquartier ist. bin jetzt in Wz ausgewichen und da ist das nicht drauf
speichern geht per Compiler mit eeprom char dummy[]="Test" das funktioniert problemlos aber wiedesehen kann ichs nur wenn ich per ISP in EEprom schaue putchar, printf, sprintf etc können nur variablen aus flach und sram verarbeiten der versuch mit strcpy scheiterte ebenso wie die übergabe *str=*dummy
winne wrote: > > putchar, printf, sprintf etc können nur variablen aus flach und sram > verarbeiten der versuch mit strcpy scheiterte ebenso wie die übergabe > > > *str=*dummy# Das glaub ich. EEprom wird nun mal anders angesprochen als SRAM. Das kann strcpy aber nicht wissen. Daher sagte ich doch: du musst über Zwischenvariablen gehen, bzw. viele Funktionen selbst machen, wenn es von CVAVR dafür keine Unterstützung gibt. Für strcpy() könnte ich mir vorstellen, dass es eine eigene Variante dafür gibt, für printf() und sprintf() könnte es ein eigenes Formatier- zeichen dafür geben (Ist aber nur Spekulation). Als Beispiel mal ein Replacement für strcpy() eeprom char dummy[] = "Test"; void eeprom_strcpy( char* dest, eeprom char* src ) { while( *src ) { *dest = *src; dest++; src++; } *dest = '\0'; } Der entscheidende Unterschied besteht darin, dass src explizit als eeprom Pointer definiert ist. Damit kann dann die Funktion intern auf den richtigen Speicher zugreifen. Bevor du mit den Strings aus dem EEProm irgendwas machen kannst, musst du sie erst mal aus dem EEprom in das normale SRAM holen. > der versuch mit strcpy scheiterte ebenso wie die übergabe > *str=*dummy Letzters ist mir nicht klar. Was hast du da konkret gemacht?
Hallo Karl Heinz, erst einmal Danke für deine Antwort leider kam ich nicht früher dazu. Ich werde Deine Tips gleich testen und dann berichten. Eventuell hatt es ja tatsächlich mit verschiedenen pointerformaten zu tun da könnte mir deine Methode heraushelfen. Mfg Winne
Hallo K.H. leider mochte er auch diese Variante der Pointerverbiegerei nicht Hier die Lösung meines Rätsels aus den examples von CVAVR der Wald und die Bäume Beitrag "eeprom beispiele für cvavr" an alle anderen Nochmals Entschuldigung für's oT
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.