"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

lustige und interessante code-fragmente

atrox 17.11.2002 - 23:09 3241 10
Posts

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
postet hier (real-world) code-fragmente die euch schon mal untergekommen sind, wo man sich entweder an die stirn greift oder ordentlich ins grübeln kommt.

ein stück lustigen codes aus einer gekauften C library für PIC µController:

Code:
#define FALSE 0
#define TRUE !0

.. und hier ein stück code zum grübeln:
Code:
 register n = (count + 7) / 8;      /* count > 0 assumed */

   switch (count % 8)
   {
   case 0:        do {  *to = *from++;
   case 7:              *to = *from++;
   case 6:              *to = *from++;
   case 5:              *to = *from++;
   case 4:              *to = *from++;
   case 3:              *to = *from++;
   case 2:              *to = *from++;
   case 1:              *to = *from++;
                      } while (--n > 0);
   }
Das ist völlig legaler C-Code!

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
ich check nicht ab was die do-while schleife macht ...

manalishi

tl;dr
Avatar
Registered: Feb 2001
Location: Feldkirch
Posts: 5977
vertipper wie "pirate" statt private sind auch ganz lustig und ein guter indikator dafür, dass man zu wenig kaffee intus hat ;)

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Zitat von atrox
Das ist völlig legaler C-Code!

Unglaublich, aber sowohl GCC als auch MSVC fressen das ohne Warnings...

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Was echtes von mir (den Kommentar hat ein Kollege hinzugefügt :cool:):

Code:
// Get last day of month
UINT XpLastDayOfMonth(int y, int m)
{
  // abandon all hope ye who enters here !!
  return 30 + ((m^(m>>3))&1) - ((m==2) << (XpIsLeapYear(y) ? 1 : 0));
}

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10334
echo("hello world");

;)

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Noch ein nettes (nicht von mir):

Code:
#define   SWAP( x , y )      ((x) ^= (y) ^= (x) ^= (y))

Aus der selben Library (die ultimative Erweiterung für die "for" Schleife ;)):

Code:
#define   ever ( ; ; )

Luki

UNDER CONSTRUCTION
Avatar
Registered: Feb 2002
Location: 127.0.0.1
Posts: 2347
Zitat von atrox
Code:
 register n = (count + 7) / 8;      /* count > 0 assumed */

   switch (count % 8)
   {
   case 0:        do {  *to = *from++;
   case 7:              *to = *from++;
   case 6:              *to = *from++;
   case 5:              *to = *from++;
   case 4:              *to = *from++;
   case 3:              *to = *from++;
   case 2:              *to = *from++;
   case 1:              *to = *from++;
                      } while (--n > 0);
   }
Das ist völlig legaler C-Code!

:bash:

aber sowas hab ich auch noch nie gesehen :D

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
Zitat
Das ist völlig legaler C-Code!
ist nicht von mir - es heißt "Duff's Device" und wurde 1983 erfunden.
dieses spezielle code-beispiel kopiert einfach nur bytes sequentiell auf einen io-port (bzw eine einzelne speicherstelle) - es dient aber zur demonstration, daß man mittels switch/case an jeder beliebigen stelle einer eines anderen c-blocks (in diesem fall while) einsteigen kann. das funktioniert deshalb, weil am ende eines case-blockes in c nicht automatisch ein break; stattfindet.
diese technik läßt sich nicht nur zum erhöhen der geschwindigkeit (wie im fall von Tom Duff @ Lucasarts (daher der name!)) verwenden, aber zb auch für daten die nicht genau ein vielfaches einer blockgröße entsprechen (überhang-bytes).. und sicher vieles mehr.
Zitat Tom Duff: Many people have said that the worst feature of C is that switches don't break automatically before each case label. This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von atrox
ist nicht von mir - es heißt "Duff's Device" und wurde 1983 erfunden.
dieses spezielle code-beispiel kopiert einfach nur bytes sequentiell auf einen io-port (bzw eine einzelne speicherstelle) - es dient aber zur demonstration, daß man mittels switch/case an jeder beliebigen stelle einer eines anderen c-blocks (in diesem fall while) einsteigen kann. das funktioniert deshalb, weil am ende eines case-blockes in c nicht automatisch ein break; stattfindet.
diese technik läßt sich nicht nur zum erhöhen der geschwindigkeit (wie im fall von Tom Duff @ Lucasarts (daher der name!)) verwenden, aber zb auch für daten die nicht genau ein vielfaches einer blockgröße entsprechen (überhang-bytes).. und sicher vieles mehr.
Zitat Tom Duff: Many people have said that the worst feature of C is that switches don't break automatically before each case label. This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.
was ich daran krank finde, ist dass hier nicht wie normal eine verschachtelte struktur ist, sondern eine irgendwie miteinander vermixte - das is krank - einfach nur krank, und jetzt hab ich noch einen grund, warum mir 'c' nicht gefällt, ich mein da wird mir ja schlecht dabei... :rolleyes:

ein bespiel aus php, wo ich mir immer am kopf greifen muss (ich weiss nicht, wie oft ich das schon gesehn hab...):

$var = "$string";

oder die beste variante:

$string = "$string";

FreakyDrOC

Addicted
Avatar
Registered: Feb 2002
Location: Austria
Posts: 418
Zitat von watchout
was ich daran krank finde, ist dass hier nicht wie normal eine verschachtelte struktur ist, sondern eine irgendwie miteinander vermixte - das is krank - einfach nur krank, und jetzt hab ich noch einen grund, warum mir 'c' nicht gefällt, ich mein da wird mir ja schlecht dabei... :rolleyes:

geht in der neuesten version c# auch noch...musst zwar explizit von case zu case hupfen, aber geht :bash:

aber wer in c# ports programmieren will, ist mir auch rätselhaft:rolleyes:
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz