C ist pervers ;-)

Persönliche Seite #463521
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;
}
Gast #463533
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);}
Gast #463734
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/
#463836
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.
#465038
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 :-)
#465247
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.
#465273
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.
Gast #465274
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.
#465276
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?
Gast #465278
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
#465350
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren