Forum: PC-Programmierung C ist pervers ;-)


von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

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;
}

von arc (Gast)


Lesenswert?

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);}

von Stefan (Gast)


Lesenswert?

Versagt! Da kommt keine 80 raus ;-)

von blurb (Gast)


Lesenswert?

Oh Gott, bitte lass keine Perl Junkies diesen Thread entdecken ;D

von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

@Stefan:
Doch...80 ist korrekt. Wieso sollte das net so sein?

von Thomas (Gast)


Lesenswert?

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/

von Sigma N. (Gast)


Lesenswert?

Abartige Syntax :-)
Oh wie schön ist Pascal (und Basic) ;-)

Sigma n.

von mr.chip (Gast)


Lesenswert?

> 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 ^^

von Karl H. (kbuchegg)


Lesenswert?

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.

von mr.chip (Gast)


Lesenswert?

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.)

von tom (Gast)


Lesenswert?

mann, da bleib ich lieber gleich bei assembler...

von Karl H. (kbuchegg)


Lesenswert?

> 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 :-)

von Simon K. (simon) Benutzerseite


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von winne (Gast)


Lesenswert?

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.

von winne (Gast)


Lesenswert?

sorry fürs OT woolte eigentlich eigenes thema machen aber vielleicht 
gehts auch so ;-)

von Karl H. (kbuchegg)


Lesenswert?

> 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?

von winne (Gast)


Lesenswert?

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



von winne (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

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

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

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

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?


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
Noch kein Account? Hier anmelden.