mikrocontroller.net

Forum: PC-Programmierung C ist pervers ;-)


Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
International Obfuscated C Code Contest
http://www.de.ioccc.org/years.html
Schönes Beispiel: gavare.c
X=1024; Y=768; A=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"
"FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/"
"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
)):(E=X);      }H(x){I(x,    _,0);}p;q(        c,x,y,z,k,l,m,a,          b){F(c
);x-=E*M     ;y-=S*M           ;z-=C*M         ;b=x*       x/M+         y*y/M+z
*z/M-D*D    *M;a=-x              *k/M     -y*l/M-z        *m/M;    p=((b=a*a/M-
b)>=0?(I    (b*M,_      ,0),b    =E,      a+(a>b      ?-b:b)):     -1.0);}Z;W;o
(c,x,y,     z,k,l,    m,a){Z=!    c?      -1:Z;c     <44?(q(c,x         ,y,z,k,
l,m,0,0     ),(p>      0&&c!=     a&&        (p<W         ||Z<0)          )?(W=
p,Z=c):     0,o(c+         1,    x,y,z,        k,l,          m,a)):0     ;}Q;T;
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
&&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)
/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/
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
,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))))
,Q+=V&1?b:0,T                +=V&2?b        :0,U+=V    &4?b:0)     :(d==P?(g+=2
,j=g>0?g/8:g/     20):0,j    >0?(U=     j    *j/M,Q      =255-    250*U/M,T=255
-150*U/M,U=255    -100    *U/M):(U    =j*j     /M,U<M           /5?(Q=255-210*U
/M,T=255-435*U           /M,U=255    -720*      U/M):(U       -=M/5,Q=213-110*U
/M,T=168-113*U    /       M,U=111               -85*U/M)      ),d!=P?(Q/=2,T/=2
,U/=2):0);Q=Q<    0?0:      Q>O?     O:          Q;T=T<0?    0:T>O?O:T;U=U<0?0:
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
*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,
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
/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"
"\n",X,Y);s(Y);}

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versagt! Da kommt keine 80 raus ;-)

Autor: blurb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Gott, bitte lass keine Perl Junkies diesen Thread entdecken ;D

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan:
Doch...80 ist korrekt. Wieso sollte das net so sein?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Sigma N. (Gast)
Datum:

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

Sigma n.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mann, da bleib ich lieber gleich bei assembler...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: winne (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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



Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.