Auf dem Weg von DDraw nach OpenGL ..
- 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 ..
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
Auch der Vorteil von #pragma once gegenüber Includeguards beschränkt sich summa-summarum auf nur 2 Zeilen Codeersparnis.
Gruß Kimmi
- 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 ..
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
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.
- 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 ..
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
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
- 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 ..
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.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.
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.
- 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 ..
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?
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.
- 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 ..
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
Gruß Kimmi
- 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 ..
Es geht mir nicht um die compilereigenen Objekte. Ich habe ein paar selbstdefinierte Bereiche
die ich mit 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.
die ich mit
Code: Alles auswählen
#ifdef _DEBUG machwas #else machwasanderes #endif
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.
- 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 ..
Du kannst im Compile-Vorgang gcc mittels der Option -D das Symbol _DEBUG setzen. Dann geht dein Debugcode wie gewohnt.
Gruß Kimmi
Gruß Kimmi
- 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 ..
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);
*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.
- 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 ..
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.
Die letzte Zeile im Beispiel bricht die Aliasing-Regeln.
Code: Alles auswählen
int a, *pa = a, &a;
float* pf = reinterpret_cast<float*>(pa);
*pf = 4.0f;
- 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 ..
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 …
Ü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 …
Re: Auf dem Weg von DDraw nach OpenGL ..
x86-64 bedeutet nicht automatisch, dass unsigned long 64 bit lang ist. Siehe LP64 vs LLP64.
- 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 ..
Die Warnung stammt von GCC und der verwendet für x86-64 LP64.Jörg hat geschrieben:x86-64 bedeutet nicht automatisch, dass unsigned long 64 bit lang ist. Siehe LP64 vs LLP64.
- 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 ..
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.
Im Moment benutze ich gcc mit Code::Blocks und verwende die Standardeinstellungen.
Es ist leichter, einen Sack Flöhe zu hüten.
- 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 ..
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 mitund 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.
Code: Alles auswählen
union {
float asFloat;
unsigned int asUInt;
} const Value = { fWrt };
unsigned int p = (0xbe6f0000 - Value.asUInt) >> 1;
Der Code wird übrigens nur unter GCC optimiert, unter VC ist reinterpret_cast<unsigned int const *>(&fWrt); schneller.
- 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 ..
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.
- 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 ..
Werd's gleich mal ausprobieren .. Danke.
Edit:
Das war natürlich die Antwort auf einen Thread zuvor .. :D
Edit:
Das war natürlich die Antwort auf einen Thread zuvor .. :D
Es ist leichter, einen Sack Flöhe zu hüten.
- 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 ..
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' ..
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.
Re: Auf dem Weg von DDraw nach OpenGL ..
Von Code::Blocks hab ich jetzt keine Ahnung, aber gib mal in einem Terminal "man 3 rand" ein. (Ohne die Anführungszeichen)
- 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 ..
Potenziell dumme Frage, aber ist ::rand() nicht standardisiert?
- 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 ..
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
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.
- 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 ..
Und wo ist da jetzt das Problem? :)RAND_MAX is a constant defined in <cstdlib>. Its default value may vary between implementations but it is granted to be at least 32767.
Re: Auf dem Weg von DDraw nach OpenGL ..
Genau.
Biolunar fragt sich grade was Krishty mit
Biolunar fragt sich grade was Krishty mit
gemeint hat.Krishty hat geschrieben:Potenziell dumme Frage, aber ist ::rand() nicht standardisiert?
- 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 ..
Dass sich die Implementierungen bei sachgemäßer Anwendung identisch verhalten müssten.
- 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 ..
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
Gruß Kimmi
- 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 ..
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.
PS:
Googeln kann ich schon.
Es ist leichter, einen Sack Flöhe zu hüten.
-
- Moderator
- Beiträge: 2138
- Registriert: 25.02.2009, 13:37
Re: Auf dem Weg von DDraw nach OpenGL ..
Nein gibt es nicht wurde dir doch jetzt auch wiederholt gesagt (developia.de)
- 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 ..
Ja, schon, aber nicht so deutlich ;) .
Es ist leichter, einen Sack Flöhe zu hüten.
- 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 ..
Du könntest mal Netbeans ausprobieren. Dort wird Hilfe (sofern vorhanden) so angezeigt: