Krishty hat geschrieben:Ich benutze wieder #define für Konstanten. Mit einer const-Variable hat man entweder unzählige Duplikate oder das Static Initialization Order Fiasco. C++ kriegt nicht einmal die einfachsten Dinge hin. So ein Sauhaufen; es ist echt zum Heulen.
Für non-strings würden es doch Enums auch tun oder?
Re: Jammer-Thread
Verfasst: 11.10.2013, 11:49
von Krishty
Ja; aber nicht für float oder double.
Re: Jammer-Thread
Verfasst: 11.10.2013, 17:05
von B.G.Michi
Dann nimm Macros. Ich versteh das ganze Anti-Macro-Gebashe nicht so ganz... sie sind ein Teil der Sprache C++ und wenn sie der bester/einfachste/schnellste Weg sind um ein Ziel zu erreichen, warum sie nicht verwenden? Alles andere hält nur unnötig auf. Und wenn dir in 2 Jahren was besseres einfällt, oder MSVC constexpr vernünftig unterstützt kannst du das immer noch ändern.
Re: Jammer-Thread
Verfasst: 11.10.2013, 17:19
von dot
B.G.Michi hat geschrieben:[...] sie sind ein Teil der Sprache C++ und wenn sie der bester/einfachste/schnellste Weg sind um ein Ziel zu erreichen, warum sie nicht verwenden?[...]
Sie mögen Teil der Sprache C++ sein, aber sie sind nunmal nur sehr sehr selten eine gute Lösung und noch viel seltener der beste Weg, um ein Ziel zu erreichen. Gerade float und double Konstanten sind ein schönes Beispiel: Makros sind nicht typsensitiv. Natürlich kannst du einfach pro Konstante ein Makro für jeden verschiedenen Typ anbieten. Von den üblichen Problemen, wie beispielsweise der Tatsache, dass der Präprozessor Dinge wie Scope völlig ignoriert, abgesehen, funktioniert das aber z.B. überhaupt nicht, sobald templates ins Spiel kommen. Und einfach nur eine allgemeine Konstante vom Typ double führt schnell ineffizientem Code, sobald sie zusammen mit floats benutzt wird da der Compiler alles mit Konvertierungsoperationen pflastern muss...
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:18
von Krishty
dot, ich weiß von dir noch aus einem Optimierungs-Thread, dass du Konstanten wie INF und NaN für double und float anlegst. Sagen wir also, du hast eine Konstante Constants<float>::nan.
Die wirst du, gerade wenn du mit Template-Spezialisierungen arbeitest (um alle Konstanten generisch abstrahiert ansprechen zu können), nicht im Header definieren können, sondern in einer einzigen Übersetzungseinheit (landläufig in einer .cpp).
Falls du jetzt eine andere Konstante haben willst, die auf diesen Werten aufbaut, rennst du ins Fiasco. Ich brauche z.B. ständig einen zu NaN initialisierten Vec3D, aber wenn ich die Konstante
anlege, und das in einer anderen Übersetzungseinheit (selbstverständlich!), ist die Initialisierungsreihenfolge undefiniert. Obwohl es POD ist. Obwohl der Compiler es statisch auflöst. Obwohl alles direkt ins Read-Only Data Segment wandert (außer bei Visual C++ ohne Optimierungen; da löst sogar POD-Initialisierung mit statischen Parametern eine Laufzeitinitialisierung aus).
Wenn du Glück hast, ist nanVec voll Nullen und du bemerkst den Fehler sofort. Wenn du Pech hast, steht wirklich NAN drin, aber nur, so lange der Compiler in der richtigen Reihenfolge kompiliert. Und eines Tages geht dein Programm kaputt weil in allem, das eigentlich mit NAN und INF gefüllt sein sollte, plötzlich 0 steht. Ohne Warnung oder Verdacht.
Was nutzt mir Typsicherheit wenn in meinen Konstanten nicht einmal die Werte stehen, die ich eigenhändig in aller Deutlichkeit zugewiesen habe? Ein Ausweg wäre, die Konstanten static zu deklarieren. Dann bekommt jede Übersetzungseinheit eine eigene Kopie, und die wird in der #include-Reihenfolge initialisiert. Geht aber nicht mit Templates. Und eben dieser jeder Einheit ihre eigene Kopie-Effekt ist aber bei nicht-Konstanten völlig irreführend und ebenso gefährlich. („Ich habe dieser Variable eben 3 zugewiesen. Warum steht immernoch 0 drin?!“)
Dann kommen noch Compiler-spezifische Erweiterungen wie __declspec(selectany). Aber wie viele hier wissen denn schon, was die machen und wofür die da sind? Und hat die andere Plattform sowas auch?
Diese Fehler finde ich kein Bisschen weniger widerlich als die, die einem mit Makros drohen. Aber ich kann jedem in zwei Minuten erklären, wie Makros funktionieren und was an ihnen gefährlich ist – bis jemand C++’ Modulsystem und die resultierenden Randfälle bei globalen Variablen und Templates verstanden hat, vergeht meist mindestens ein Tag. Darum jetzt eben Makros.
P.S.: Auch constexpr wird daran nichts ändern. Das ist einfach ein Aspekt, in dem C++ fubar ist.
wird nicht funktionieren, und du nennst Makros heimtückisch.
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:34
von CodingCat
Aktuell ist die landläufige C++-Lösung, aus den Konstanten Funktionen mit entsprechendem Rückgabewert zu machen. constexpr wird hier den Auswertungszeitpunkt festlegen. Die Tatsache, dass man dann Funktionen mit vollkommen unsinniger Bloat-Aufrufnotation hat, ärgert mich mindestens so sehr wie die Makroalternative, aber immerhin funktioniert es dann zuverlässig.
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:37
von Krishty
Ah; danke – dann tut sich ja doch noch was :-) Trotzdem hasse ich Datenzugriffe durch Text. Wenn ich an b von a will, schreibe ich a.b, und nicht a.b(). Konstanten sind Daten, kein Code. Aber bitte; wenn es funktioniert, muss es nicht schön sein.
(Ich halte mich hier der Diskussion zuliebe mit allem Compiler-Misstrauen gegenüber Datenfaltung, Auflösung statischer Initialisierungen, usw. zurück. Also geht bitte nicht darauf ein, dass ich nicht glaube, dass irgendein Compiler constexpr vor 2020 so effizient umsetzt wie Makros.)
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:40
von CodingCat
Krishty hat geschrieben:Aber bitte; wenn es funktioniert, muss es nicht schön sein.
Doch, eigentlich muss es das. Aber die Tatsache, dass so vieles in der richtigen Form unvergleichlich hässlicher und unintitiver ist als in der falschen Form (und deshalb die falsche Form im allgemeinen Code-Körper konsequent vorherrscht), zieht sich ja schon länger wie ein roter Faden durch die Sprache.
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:41
von dot
Und in C++14 gibt's dann variable templates... ;)
Re: Jammer-Thread
Verfasst: 11.10.2013, 21:53
von CodingCat
dot hat geschrieben:Und in C++14 gibt's dann variable templates... ;)
Wetten wir, dass deren Initialisierung unordered ist? :twisted:
Nachträgliche Anmerkung: Bisher finde ich nichts dergleichen im aktuellen Draft; weder zur Auswertungsreihenfolge von globalen constexpr-Variablen, noch zur Initialisierungsreihenfolge von Variable Templates.
Re: Jammer-Thread
Verfasst: 12.10.2013, 09:41
von Artificial Mind
Der VS 2013 Optimizer stürzt bei Code ab der wie folgt aussieht:
Was betrifft das? Etliche Funktionen aus Qt 5.1.1 was ich gerade für VS12 kompilieren will.
Mehr Jammer: Leute die ihre Fragen mit Visual Studio 2012 taggen und dann Fehlermeldungen haben die 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\...' beinhalten.
Re: Jammer-Thread
Verfasst: 12.10.2013, 10:54
von Krishty
Krishty hat geschrieben:Visual Studio 2010 installiert. Benötigt .NET Framework.
Oh.
Ich musste während der Installation drei Mal neu starten. Danach musste ich 60 Sicherheitsupdates mit 330 MiB Größe installieren. Ich warte jetzt seit einer Stunde, dass das fertig wird. Und wozu? Wo ist Visual C++’ Benutzeroberfläche .NET?
Verfickte Bloatware
Visual Studio 2012 installiert. Benötigt .NET Framework 4.5.
Oh.
Diesmal ohne Neustart, aber dafür mit 253 MiB Sicherheitsupdates. FUCK MY LIFE
Artificial Mind hat geschrieben:Mehr Jammer: Leute die ihre Fragen mit Visual Studio 2012 taggen und dann Fehlermeldungen haben die 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\...' beinhalten.
Die Versionsnummer nicht durch die Jahreszahl zu ersetzen war die bescheuerteste Entscheidung von MS überhaupt. Es war absehbar, dass das jeder verwechseln wird. „Das 2010er Produkt ist Version 10; das 2012er Produkt ist Version 11; und das 2013er Produkt ist Version 12.“ Sind das Autisten im Marketing?!
Ich liefere meine Software übrigens schon lange nicht mehr mit Versionsnummern aus, sondern mit dem Erstelldatum.
Re: Jammer-Thread
Verfasst: 12.10.2013, 14:43
von kaiserludi
Artificial Mind hat geschrieben:Der VS 2013 Optimizer stürzt bei Code ab der wie folgt aussieht:
Was betrifft das? Etliche Funktionen aus Qt 5.1.1 was ich gerade für VS12 kompilieren will.
Mehr Jammer: Leute die ihre Fragen mit Visual Studio 2012 taggen und dann Fehlermeldungen haben die 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\...' beinhalten.
Wäre ich VS2013, ich würde da genauso abstürzen, weil mir als Compiler speiübel werden würde bei der Klammersetzung :twisted:
Re: Jammer-Thread
Verfasst: 12.10.2013, 16:43
von eXile
Da wir gerade bei Bug-O-Rama sind: Hat jemand schon mal diesen Bug gesehen oder gemeldet?
template <typename Type, Type>
class MyClass {};
template <template <typename Type, Type> class TemplateClass>
void test() {}
int main(int argc, char * argv[])
{
test<MyClass>();
return 0;
}
Wie man sieht, gar keine Besonderheiten (keine variadic templates, keine decltypes, nichts besonderes). Das ist definitiv eine Regression und funktioniert mit Visual Studio 2012 ohne Probleme. Im November CTP stürzt es bereits ab. In der Visual Studio 2013 RC stürzt es auch ab. Fehlermeldung ist ein standardmäßiger internal compiler error, sowohl auf x86 wie auch x64:
1>------ Build started: Project: test, Configuration: Debug x64 ------
1> main.cpp
1>main.cpp(10): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file 'msc1.cpp', line 1468)
1> To work around this problem, try simplifying or changing the program near the locations listed above.
1> Please choose the Technical Support command on the Visual C++
1> Help menu, or open the Technical Support help file for more information
1> INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\AMD64\CL.exe'
1> Please choose the Technical Support command on the Visual C++
1> Help menu, or open the Technical Support help file for more information
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Kann mir gerade jemand sagen, ob
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.20617.1 for x64
der aktuellste Compiler ist, den man testen kann?
Ich habe mal nach „(compiler file 'msc1.cpp', line 1468)“ gesucht, und von den fünf Ergebnissen sind zwei Fehlermeldungen zu variadic templates (hier nicht benutzt), eine Fehlermeldung zu decltype (hier auch nicht benutzt) und zwei vollkommen unrelatierte Fehlermeldungen. Irgendjemand wird das doch schon gemeldet haben?
#pragma optimize( "", off )
// Problematische Funktion
#pragma optimize( "", on )
Danke für den Tipp, das wird für die Zukunft bestimmt noch einmal nützlich sein. In diesem Falle trat der von mir beschriebene Bug aber mit so ziemlich allen Einstellungen (x86, x64; Debug, Release) auf. Noch vor der code generation schmeißt der einen internal compiler error.
Re: Jammer-Thread
Verfasst: 14.10.2013, 09:12
von Schrompf
Es ist deprimierend, hier mitzulesen. Es ist noch deprimierender, wenn ich das heimlich vom Arbeitsrechner aus tun muss, weil meine Hardware letzte Woche gestorben ist. Der neue Rechner ist unterwegs, aber genau genommen kann ich mir den gar nicht leisten... Indie-Entwicklung stinkt.
Re: Jammer-Thread
Verfasst: 15.10.2013, 17:42
von antisteo
Im Heise-Forum behauptet jemand, der GLSL-Compiler säße auf der Grafikkarte.
Re: Jammer-Thread
Verfasst: 15.10.2013, 19:48
von eXile
Fassen wir mal zusammen:
PC/Windows: OpenGL soll alle Mantle-Features als OpenGL-Extensions bekommen, und zwar mit gleicher Geschwindigkeit (Quelle).
PC/Linux: Wohl dito. Zumindest von Nvidia bin ich es gewohnt, alle Extensions auch unter Linux zu haben. Wie sieht es da mit AMD aus?
Und nun? Die erste Frage ist, worauf sich Johan Andersson dann in seiner Präsentation bezogen hat, als er „cross platform“ gesagt und geschrieben hat. Da er direkt davor von Konsolen gesprochen hat, bin ich davon ausgegangen, dass er die Platformen PC/Windows, XBox One und PlayStation 4 damit meinte. Da letztere beiden jetzt wohl weg sind, bleibt nur noch die Interpretation von „cross platform“ als PC/Windows und PC/Linux. Auf welchen es auch OpenGL gibt. Mit allen Mantle-Extensions. Mit zumindest versprochen gleicher Performance.
Und jetzt erklärt mir bitte mal einer, warum man Mantle braucht.
Re: Jammer-Thread
Verfasst: 15.10.2013, 23:02
von glassbear
eXile hat geschrieben:Fassen wir mal zusammen:
PC/Windows: OpenGL soll alle Mantle-Features als OpenGL-Extensions bekommen, und zwar mit gleicher Geschwindigkeit (Quelle).
PC/Linux: Wohl dito. Zumindest von Nvidia bin ich es gewohnt, alle Extensions auch unter Linux zu haben. Wie sieht es da mit AMD aus?
AMD unter Linux mit dem Catalyst ist eine Katastrophe.
OpenGL mit AMD ist ... suboptimal.
Vielleicht pushen die Mantle, damit der OpenGL-Treiber nicht auf Vordermann gebracht werden braucht :lol:
Setting* mSetting;
// und die Funktion getSetting() hat folgende Deklaration
Setting getSetting()
Re: Jammer-Thread
Verfasst: 16.10.2013, 16:32
von Florian Keßeler
Solang mSetting irgendwo zwischdurch initialisiert wird und auf ein gültiges Setting-Objekt zeigt ist da kein Problem.
Re: Jammer-Thread
Verfasst: 16.10.2013, 16:49
von joggel
Ja, stimmt. Es wurde vorher initialisiert.
War irgendwie ein Denkfehler. Die Funktion gibt ja eine Kopie zurück, und diese Kopie wird eben nochmal Kopiert, und überschreibt den Inhalt der originals welches sich vorher bei <mSetting> befand...
Gut-gut-guuuuut
Nein, das Baby ist mit dem langen Namen (ohne Punkte) so in der JRE zu finden. Ich nehme an, das hat evt. etwas mit sehr strengen Benamungsregeln, Generierung oder Maschinenlesbarkeit zu tun.
Danke :-) Die seriösest anmutende Quelle, die ich gefunden hatte, war die hier :(
Re: Jammer-Thread
Verfasst: 16.10.2013, 19:28
von Chromanoid
Achso, ja ich hab hier Eclipse (Java) offen, da musste ich nur kurz einmal CTRL+SHIFT+T drücken...
PS: So gestört so lange Namen aussehen, ich finde lange Namen besser als kryptische Kürzel oder ähnliches.
Gestern kam meine schicke neue Hardware an. Seit etwa 10 Jahren bin ich eigentlich nur noch Datennomade, indem ich Festplatten auf neue Hardware oder lebende Betriebssysteme auf neue Festplatten umpflanze. Aber hier geht das nicht... irgendeiner der alten Mainboard-Treiber crasht beim Booten auf der neuen Hardware. Irgendjemand eine Idee, was ich da tun könnte, ohne das OS neu zu installieren?