C ist pervers ;-)

OP Persönliche Seite #463521
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
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
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/
Gast #463788
> 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 ^^
#463836
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.
Gast #463965
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.)
#465038
> 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
> 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.
Persönliche Seite #465270
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.
#465273
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
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
> 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 #465277
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


Gast #465278
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.