Auf dem Weg von DDraw nach OpenGL ..

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Wenn du unter mehreren Betriebssystemen entwickeln willst, mußt du dich beim C++-Code halt an den Standard halten. Das macht der MSVC-Compiler leider nicht überall, weswegen solche Dinge wie #pragma once entstanden sind. Hüte dich einfach vor MS-spezifischen Konstrukten. Die machen beim Portieren mehr Ärger und bringen dafür meist nicht viel Nutzen.
Auch der Vorteil von #pragma once gegenüber Includeguards beschränkt sich summa-summarum auf nur 2 Zeilen Codeersparnis.

Gruß Kimmi
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Du hast Recht, für alle Projekte die ab jetzt entworfen werden.
Aber w.s.w.g. ich habe bisher nur unter VS entwickelt und da ist nun mal 'tonnenweise' Material vorhanden.
Das umzuarbeiten macht eben viel Arbeit (reine 'Handarbeit') und ich wollte doch meine Ideen programmieren und
nicht die Vergangenheit überarbeiten. :!:

Edit:
Eigentlich finde ich #pragma once einfacher und leichter zu handhaben als die 'GUARD'-Methode und
für die weltoffenen Linux- und gcc-Entwickler dürfte es kein Problem sein, diese Funktionalität
mit einzubauen. Ich bin ja mit diesem Problem nicht allein auf dieser Welt (siehe GOOGLE).
Es hat den Standard noch nie gestört, wenn mehr als vordefiniert möglich ist. Im Gegenteil, die Entwicklung soll
ja durch Standards nicht behindert werden, oder?

PS:
w.s.o.g: wieschonwiederholtgesagt
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Zur Zeit wird es aber nicht unterstützt und dementsprechend wirst du es wohl anpassen müssen, wenn du deinen Code portieren willst. Da führt kein Weg daran vorbei.
Das ist der Grund, warum ich bei neuem Code immer gern auf Portabilität achtgebe. Wer weiß schon, ob man den irgendwann einmal portieren darf. Auch ich habe da schon ordentlich Handarbeit investieren müssen.

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

HeinzK hat geschrieben:Eigentlich finde ich #pragma once einfacher und leichter zu handhaben als die 'GUARD'-Methode und
für die weltoffenen Linux- und gcc-Entwickler dürfte es kein Problem sein, diese Funktionalität
mit einzubauen.
Das Standardkommitte verfolgt die (sinnvolle) Taktik, Funktionalität durch Recycling bestehender Sprachfeatures einzubauen anstatt dauernd neue Schlüsselwörter einzubauen. Das bedeutet auf diesen Fall übertragen: #ifdef #ifndef #elif #endif #define an sich machen 85 % der Präprozessor-Funktionalität aus. Würde #pragma once standardisiert, würde der Umfang der Sprache um 15 % wachsen um 0 % mehr Funktionalität zu erlauben als eh schon möglich ist und hier und da zwei Zeilen zu sparen. Indiskutabel.

Darüber hinaus ist #pragma afaik schon standardisiert als: „Was jetzt kommt, bestimmt der Compiler. Wenn er nichts damit anzufangen weiß, soll er schlucken statt kotzen.“ Und afaik war das auch eine der Entscheidungen, die im Großen und Ganzen als falsch angesehen wird.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Soweit, so gut. Warnen ist ja OK, aber man sollte diese Warnung dann auch gezielt abschalten können.
Nächste Frage: Unter VS ist beim Debuggen ein Symbol _DEBUG gesetzt.
Das schein bei gcc nicht der Fall zu sein. Ich habe es in den 'Build-Options' nun nachträglich gesetzt.
Jetzt funktioniert alles wie gewollt. Frage, wie erkennt gcc Debug und Release?
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Beim gcc werden die Debuginfos in die Objects miteinkompiliert ( -g meine ich ). Wenn du -g setzt, kannst du im Makefile mittels -D_DEBUG ( -d oder -D, such mal nach der richtigen Option ) dir die entsprechenden Debug-Präprozessoranweisungen selber vom gcc setzen lassen. Der gcc an sich kennt halt nur Sourcefiles und keine Workspaces.

Gruß Kimmi
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Es geht mir nicht um die compilereigenen Objekte. Ich habe ein paar selbstdefinierte Bereiche
die ich mit

Code: Alles auswählen

#ifdef _DEBUG machwas #else machwasanderes #endif
abwickle. Das _DEBUG ist
mit so in Fleisch und Blut, das ich gar nicht auf die Idee komme, irgenwo anders könnte es wirklich anders sein!
Will eigentlich nur wissen, ob _DEBUG nicht vordefiniert ist, oder ob ich etwas falsch gemacht habe.
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Du kannst im Compile-Vorgang gcc mittels der Option -D das Symbol _DEBUG setzen. Dann geht dein Debugcode wie gewohnt.

Gruß Kimmi
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Code: Alles auswählen

double KFlinkWurzelExB(const double &dWert)
{
    double dWrt = fabs(dWert);
    if (dWrt < FLT_MAX)
    {
      float fWrt = (float)dWert;
      if (!(fWrt > 0.0))
      {
        return 0.0;
      }
      double dWu1 = (0.5 * dWrt);

      unsigned long *p = (unsigned long *)&fWrt;
      *p = (0xbe6f0000 - *p) >> 1;

      double dWu2 = (double)(fWrt);
      dWu2 *= (1.5 - (dWu2 * dWu2 * dWu1));
      dWu2 *= (1.5 - (dWu2 * dWu2 * dWu1));
      dWrt *= dWu2;
    } else
    {
      dWrt = KWurzel(dWrt);
    }
    return dWrt;
 }
double dX = 4.0;
dX = KFlinkWurzelExB(dX);
unsigned long *p = (unsigned long *)&fWrt;
*p = (0xbe6f0000 - *p) >> 1;

warnung dereferencing pointer 'p' does break strict-aliasing rules
Zuerst mal, dies ist eine alte nicht mehr benutzte Routine. Sie rechnete früher die ungefähre Wurzel viel schneller als sqrt().
Also die Routine ist im Quellcode noch enthalten, aber wird nicht mehr benutzt. Deshalb ist das Problem nicht so wichtig.
gcc: Im Debug-Modus wird alles ohne Warnung kompiliert, aber im Release-Modus kommt die o.a. Warnung.
Kann mir jemand den Grund der Warnung erklären (rein interessehalber).
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Aramis »

Es ist undefiniert auf die gleiche Speicherstelle von 2 Pointern unterschiedlichen Typs aus zuzugreifen - der Sprachstandard trifft diese Regelung um Optimizern die Arbeit zu erleichtern (vom Prinzip her verwandt mit restrict). Da nahezu jede Bithackerei in dieses Problem rennt, geht GCC natuerlich korrekt damit um, sprich der Code laeuft allenfalls langsamer als er koennte, aber nicht anders oder falsch. Dennoch ist die Warnung berechtigt.

Code: Alles auswählen

int a, *pa = a, &a;

float* pf = reinterpret_cast<float*>(pa);
*pf = 4.0f; 
Die letzte Zeile im Beispiel bricht die Aliasing-Regeln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

Aliasing nennt man es, wenn zwei Zeiger einen unterschiedlichen Typ für dieselbe Speicheradresse angeben. In deinem Beispiel bedeutet es, dass der Compiler fWrt gleichzeitig als float und als unsigned long interpretieren muss, was alle Optimierungen zerstört weil die normalerweise vollkommen unterschiedlich behandelt werden.

Übrigens kracht der Code auch unter x86-64, weil unsigned long dort 64 Bits groß ist und fWrt nur 32.

Schade, dass es hier keine Sekundenanzeige gibt – sonst könnte ich ausrechnen, wieviele -Tags ich in Zukunft weglassen muss um Aramis zuvor zu kommen …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Jörg »

x86-64 bedeutet nicht automatisch, dass unsigned long 64 bit lang ist. Siehe LP64 vs LLP64.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

Jörg hat geschrieben:x86-64 bedeutet nicht automatisch, dass unsigned long 64 bit lang ist. Siehe LP64 vs LLP64.
Die Warnung stammt von GCC und der verwendet für x86-64 LP64.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Was mich noch interessieren würde ist, warum kommt die Warnung nur im Release-Modus?
Im Moment benutze ich gcc mit Code::Blocks und verwende die Standardeinstellungen.
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

Weil GCC nur im Release-Modus Optimierungen anwendet, die von den Aliasing-Regeln Gebrauch machen. Falls du den Code übrigens doch behalten willst, versuch es mal mit

Code: Alles auswählen

union {
    float asFloat;
    unsigned int asUInt;
} const Value = { fWrt };
unsigned int p = (0xbe6f0000 - Value.asUInt) >> 1;
und benutz für die Integers nach Möglichkeit Plattformunabhängige typedefs.

Der Code wird übrigens nur unter GCC optimiert, unter VC ist reinterpret_cast<unsigned int const *>(&fWrt); schneller.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Aramis »

Allerdings ist auch die union–Loesung streng genommen Undefined Behaviour :-) An dieser Stelle wird klar dass es eigentlich nicht moeglich ist 100% wohldefinierten C++-Code zu schreiben.
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Werd's gleich mal ausprobieren .. Danke.
Edit:
Das war natürlich die Antwort auf einen Thread zuvor .. :D
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Allgemeine Frage zu Code::Blocks/Ubuntu:
Der Befehl 'rand()' funktioniert anscheinend anders als gewohnt (Win32).
Wenn ich unter VS Informationen über diesen Befehl haben will, dann
lege ich die Maus darauf und drücke F1. Wie mache ich dass unter gcc/Code::Blocks?
Ich habe bisher noch keine Möglichkeit entdeckt, außer 'Search at Koders' ..
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Biolunar »

Von Code::Blocks hab ich jetzt keine Ahnung, aber gib mal in einem Terminal "man 3 rand" ein. (Ohne die Anführungszeichen)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Bei sowas ist auch www.google.de sehr nützlich ;).

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

Potenziell dumme Frage, aber ist ::rand() nicht standardisiert?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Hab' ich auch gedacht, aber:
Ubuntu(stdlib.h):
/* The largest number rand will return (same as INT_MAX). */
#define RAND_MAX 2147483647
Win32(Hilfe):
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX (32767).
Win32(stdlib.h)
/* Maximum value that can be returned by the rand function. */
#define RAND_MAX 0x7fff
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

RAND_MAX is a constant defined in <cstdlib>. Its default value may vary between implementations but it is granted to be at least 32767.
Und wo ist da jetzt das Problem? :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Biolunar »

Genau.

Biolunar fragt sich grade was Krishty mit
Krishty hat geschrieben:Potenziell dumme Frage, aber ist ::rand() nicht standardisiert?
gemeint hat.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Krishty »

Dass sich die Implementierungen bei sachgemäßer Anwendung identisch verhalten müssten.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von kimmi »

Du kannst natürlich auch deinen eigenen Rand-Algorithmus nehmen. Such mal nach "Numerical Recipes" bei Google und schau dort nach den entsprechenden Algo's. Die sollten sich dann gleich verhalten.

Gruß Kimmi
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Danke für die Infos. Meine Frage war eigentlich, gibt es keinen 'Klick' auf einen Befehl .. und Hilfe ist unterwegs?
PS:
Googeln kann ich schon.
Es ist leichter, einen Sack Flöhe zu hüten.
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Alexander Kornrumpf »

Nein gibt es nicht wurde dir doch jetzt auch wiederholt gesagt (developia.de)
Benutzeravatar
HeinzK
Establishment
Beiträge: 234
Registriert: 05.11.2009, 08:37
Benutzertext: ZwiAner
Echter Name: Heinz Kempter
Wohnort: Wald
Kontaktdaten:

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von HeinzK »

Ja, schon, aber nicht so deutlich ;) .
Es ist leichter, einen Sack Flöhe zu hüten.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4273
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Auf dem Weg von DDraw nach OpenGL ..

Beitrag von Chromanoid »

Du könntest mal Netbeans ausprobieren. Dort wird Hilfe (sofern vorhanden) so angezeigt:
Bild
Antworten