Forum: Mikrocontroller und Digitale Elektronik IOCC Contest


von Confused (Gast)


Lesenswert?

Versteht jemand folgenden code?
http://www.ioccc.org/2004/vik2.c

o_O
Ich krieg den weder compiliert noch versteh ich den zusammenhang mit c 
nicht...

 Features
    ========

    The program  implements an 11-bit ALU in the pre-processor. <--- o_O

http://www.ioccc.org/2004/vik2.hint

Kann wer ansatzweise erklären was da wie defined wird?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Confused schrieb:
> Versteht jemand folgenden code?

Den kann man nicht verstehen, sonst hätte er nicht beim IOCCC
gewonnen. :-)

Der Trick dabei ist, dass der Präprozessor neue Präprozessor-
anweisungen für den zweiten Lauf generiert.  Da dort dann gleich
noch die eigene Datei wiederholt inkludiert wird (mit Conditionals),
wird das natürlich um so verwirrender.  Schau dir einfach mal die
Zwischenergebnisse an.  Wenn du das letzte Zwischenergebnis mal von
allem Ballast befreist, dann kann man zumindest erkennen, wie der
tatsächlich generierte C-Code aussieht:
1
int main()
2
{
3
printf(
4
"%d"
5
"\n"
6
,
7
1
8
+
9
1
10
)
11
;
12
printf(
13
"%d"
14
"\n"
15
,
16
1
17
| 2
18
)
19
;

Das
1
printf("%d" "\n", 1

steht dabei übrigens bereits unmittelbar in vik2.c drin. ;)

von Confused (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> int main()
> {
> printf(
> "%d"
> "\n"
> ,
> 1
> +
> 1
> )
> ;
> printf(
> "%d"
> "\n"
> ,
> 1
> | 2
> )
> ;

Es steht jedoch:
pri\
ntf(
"%d"
"\n"
,
1
G
#  \
inc\
lud\
e<s\
tdi\
o.h>
int\
 ma\
in()
mit all den \ usw. also kein korrekter C code.

Aber wenn wir oben anfangen
Zeile 1: #define O \ <--- ok kann man machen ersetze O mit \
Zeile 2: #ifdef <---- ??? ja ifdef was?? Mein compiler meckert da (aus 
gutem grund) was ifdef was??

usw.

Wie hast du eigentlich nur den preprocessor drübergelassen?

von Karl H. (kbuchegg)


Lesenswert?

Es ist nicht wirklich ungewöhnlich, dass Beiträge vom IOCCC sich nicht 
auf jedem Compiler übersetzen lassen. Des öfteren wurden da auch schon 
mal Eigenheiten vom Compiler bzw. Command Line Switches ausgenutzt, um 
auf einem spezifischen System compilierbar zu sein.

Nimm den IOCCC als das, was er ist: Ein Sammelsurium an Kuriositäten
und erfreu dich daran. Für irgendwelche wie auch immer geartete 
Lernzwecke ist der IOCCC mit 100% Sicherheit nicht zu gebrauchen. 
Höchstens als abschreckendes Beispiel, was man mit viel gutem Willen im 
Extremfall alles treiben kann. Aber selbst da muss man sagen: Selbst für 
diesen Zweck sind die Beispiele für die Katz, weil man derartigen Code 
in freier Wildbahn nicht antrifft.

von Karl H. (kbuchegg)


Lesenswert?

Confused schrieb:

> #  \
> inc\
> lud\
> e<s\
> tdi\
> o.h>
> int\
>  ma\
> in()
> mit all den \ usw. also kein korrekter C code.

Ich mag mich täuschen, aber der Einsatz des Continuation Characters 
beschränkt sich IMHO nicht nur auf den Präprozessor. Von daher: das ist 
gültig.

von max (Gast)


Lesenswert?

Confused schrieb:
> Zeile 1: #define O \ <--- ok kann man machen ersetze O mit \

Nein, das ist nicht die Wirkung. Stichwort: multiline define

von Confused (Gast)


Lesenswert?

Ist mir schon klar, dass das ganze einen mehr akademischen Wert hat als 
wirklich praxisrelevant zu sein.
Dennoch interessiert mich die Funktionsweise, da ich die C Syntax kenne 
und schon mal ifdef mit nix keinen sinn macht. Oder ja wäre ja nach dem 
define mit nix wärs dann true :D

von Confused (Gast)


Lesenswert?

max schrieb:
> Confused schrieb:
>> Zeile 1: #define O \ <--- ok kann man machen ersetze O mit \
>
> Nein, das ist nicht die Wirkung. Stichwort: multiline define

Dann machts ja noch weniger sinn (hab ichs richtig verstanden: \ ist 
indikator, das define auf der nächsten Zeile weiter geht?).
Dann haben wir:

#define O #ifdef
#define Q #undef
#define C #define
#define G #else
#define D #ifndef
#define l #include FNAME
#define I #endif

von Karl H. (kbuchegg)


Lesenswert?

Confused schrieb:
> max schrieb:
>> Confused schrieb:
>>> Zeile 1: #define O \ <--- ok kann man machen ersetze O mit \
>>
>> Nein, das ist nicht die Wirkung. Stichwort: multiline define
>
> Dann machts ja noch weniger sinn (hab ichs richtig verstanden: \ ist
> indikator, das define auf der nächsten Zeile weiter geht?).

Nicht nur #define.
\ mit einem Zeilenvorschub direkt dahinter ist der 'Continuation 
Character' und wirkt so, als ob es hier keinen Zeilenumbruch gäbe.

> Dann haben wir:
>
> #define O #ifdef
> #define Q #undef
> #define C #define
> #define G #else
> #define D #ifndef
> #define l #include FNAME
> #define I #endif

ok.

Und das wendest du jetzt mal auf
1
O  i
2
O  o
3
O  c
4
Q  c
5
I
6
O  d
7
Q  d
8
I
9
O  e
10
Q  e
11
I
12
O  f
13
Q  f
14
I
15
O  g
16
Q  g
17
I
18
O  h
19
Q  h
20
I
21
O  Z
22
Q  Z
23
I
24
O  j
25
Q  j
26
I
27
O  k
28
Q  k
29
I
30
O  m
31
Q  m
32
I
33
....

an. Was kommt da raus?

von max (Gast)


Lesenswert?

Richtig.
Und dann weiter mit den kommenden Zeilen. Wende die nun bekannten 
#define an.

von GTA (Gast)


Lesenswert?

Confused schrieb:
> Ist mir schon klar, dass das ganze einen mehr akademischen Wert hat als
> wirklich praxisrelevant zu sein.

Nein, das hat auch keinerlei akademischen Wert - das ist eine Spielerei 
für Geeks (positiv gemeint), aber nicht mehr und schon gar nicht 
akademisch.

von Confused (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was kommt da raus?

#ifdef  i
#ifdef  o
#ifdef  c
#undef  c
#endif
/* ... */
1
#else
#  \
inc\
lud\
e<s\
tdi\
o.h>
int\
 ma\
in()
#define _N
#define _h
#define _M
#undef  i
{
l
+
1
)
;
#include FNAME
}
#endif
#endif


--- korrekt?

[1000 Zeilen generierter Code inline im Posting ist zuviel, habe ich
eingekürzt.  Jörg]

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Confused schrieb:
> Wie hast du eigentlich nur den preprocessor drübergelassen?

gcc -E

Du hast noch nicht verstanden, dass der Prozess mehrstufig ist.
Der erste Präprozessorlauf erzeugt einen C-Code, den man wiederum
durch den Präprozessor schicken muss.  Zusammen mit den vielen
(absichtlich verwirrenden) #ifdef und #undef etc. ergibt sich dann
ein ellenlanger Spaghetti, von dem nur ein kleiner Teil effektiv
genutzt wird.

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.