Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Tut mir leid aber nur fehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
30.09.2003, 20:25 Uhr
~(un)wissender
Gast



Zitat:
[...]so dass man im Endeffekt nur ein Achtel der Sprunganweisungen hat.


Das sieht nur so aus, man hat immer gleich viele Sprunganweisungen (im Machinencode).

Schließlich muss die switch-Anweisung mittels Sprungsanweisungen abfragen welchen Wert denn n % 8 hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
30.09.2003, 20:30 Uhr
Pablo
Supertux
(Operator)


Windalf muss ich auch zustimmen, das ist ja krank
Naja, als darf man auch Menschen quälen Das sieht auf den ersten Blick so unlogisch, aber wenn man ein bisschen überlegt, ist der Code schon logisch.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.09.2003 um 20:31 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
30.09.2003, 20:30 Uhr
~(un)wissender
Gast


@beefy
Oh, jetzt habe ich verstanden was du meinst!
Ist aber echt undurchsichtig, da hätte ao sicherlich was zu meckern
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
30.09.2003, 21:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:
0xdeadbeef postete
ACHTUNG, fortgeschrittener Code. Als Anfänger muss man das nicht verstehen. Das hier ist ein Duff's Device:

C++:
#include <stdio.h>

int main() {
  int n, i = 0, cnt;
  
  scanf("%d", &n);
  cnt = n/8;

  switch(n % 8) {
    do {
      printf("%d\n", ++i);
    case 7:
      printf("%d\n", ++i);
    case 6:
      printf("%d\n", ++i);
    case 5:
      printf("%d\n", ++i);
    case 4:
      printf("%d\n", ++i);
    case 3:
      printf("%d\n", ++i);
    case 2:
      printf("%d\n", ++i);
    case 1:
      printf("%d\n", ++i);
    case 0:
    } while(cnt--);
  }
}


Das ist gültiges ANSI-C, und es macht in diesem Fall sogar Sinn. Durch das switch springt man [i]in die Schleife
rein, an der passenden Stelle, so dass man im Endeffekt nur ein Achtel der Sprunganweisungen hat.[/i]

Auch wenn ich in diesem Fall den sinn des kompletten switchblockes anzweifel für 8mal "++i" auszugeben gibt es denk ich auch bessere und kürzere lösungen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
30.09.2003, 21:21 Uhr
~Fat-Tiger
Gast


Da funzt net wie der zweite Quellcode geschrieben ist
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
30.09.2003, 21:27 Uhr
0xdeadbeef
Gott
(Operator)


Der Code stammt aus der Zeit, als Sprünge noch richtig Rechenzeit kosteten. Heutzutage würde niemand mehr sowas schreiben, aber damals war eine einfache while-Schleife halt ein Flaschenhals, den es irgendwie zu umgehen galt. Naja, für optimierende Compiler mag das noch von Interesse sein, aber in normalem Code gilt ja schon ein einfaches Fall-Through (zu recht, wie ich finde) als unschön.

Ich wollte auch nicht sagen, dass es sinnvoll ist, zwischen switch und das erste case-label eine Anweisung zu schreiben, aber es ist möglich, und macht sogar ab und zu einen Unterschied.

--edit: OK, ich habe tatsächlich gesagt, es mache "Sinn". Das ist natürlich nicht der Fall, aber es macht einen Unterschied.

@Fat-Tiger: Meinst du jetzt den Duff's Device-Code oder den Beispiel-Rechner, den ich geschrieben habe?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.09.2003 um 21:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
01.10.2003, 13:13 Uhr
ao

(Operator)



Zitat:
~(un)wissender postete
@beefy
Oh, jetzt habe ich verstanden was du meinst!
Ist aber echt undurchsichtig, da hätte ao sicherlich was zu meckern




Das entscheidende Kriterium ist für mich immer: Gibt es einen triftigen Grund, "hardcore-optimierten" Code einzusetzen?

Wenn ja, dann mach es so, setz einen Kommentar daneben, der erklärt, was du da machst und warum, und gut is. Ein Stichwort "Duff's Device zur Sprungoptimierung" würde ja schon genügen.

Wenn nein, mach es auf die konventionelle Weise, die jeder versteht, und deine Nachfolger werden dir dankbar sein.

Die genannten triftigen Gründe werden immer seltener. Die Optimizer-Funktionen der modernen Compiler optimieren ja nicht auf Quellcode-, sondern auf Zwischencode- und Maschinencode-Ebene, und da gibts einiges mehr zu reißen.

So ne kleine lokale Quelltext-Optimierung bringt da normalerweise wenig bis gar nichts (es sei denn, sie wird millionenmal ausgeführt). Der Preis, den man zahlt (schwer lesbarer Code), darf nicht unterschätzt werden.

Es gibt vergleichsweise wenig Code, der einmal geschrieben und nie wieder angeguckt wird. Jeder, der über einen längeren Zeitraum ernsthaft programmiert, kommt irgendwann dahin, dass er oder andere Leute seinen Code wiederverwenden.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
01.10.2003, 16:18 Uhr
~Fat-Tiger
Gast


Wenn ich vom weiter rechnen wieder ins menu will schmeißt er mich raus
warum
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
01.10.2003, 16:38 Uhr
~(un)wissender
Gast


@Fat~Tiger
Die Leute können dir nicht programmieren beibringen, sondern nur bei *konkreten* Problemen helfen.
Als poste vielleicht deine neuste Version des Code, wenn es geht formatiert, und markiere die Stelle(n) mit exakter Fehlerangabe.

Genereller Tipp: Schleifen sind zum benutzen da und goto label sollte eigentlich nicht benutzt werden (Außer um aus tief verschachtelten Scheifen zu springen)!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
01.10.2003, 16:46 Uhr
~Fat-Tiger
Gast


Hi könnt ihr mir die Acsk-key codes für:
+
-
*
/
und Enter sagen

THX

-=[Lok]=-@Fat-Tiger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: