The MSVC Experience



  • Disclaimer: Persoenliche Meinungen werden als Fakten dargestellt und wild mit diesen vermischt.

    Mein 1337er Post, und diesen verwende ich fuer einen Rant. Wer seinen 1337en Post dafuer verwendet, muss es schliesslich ernst meinen.

    Ich schreibe gerade ein wenig OpenGL, weil mich Grafikprogrammierung grundsaetzlich interessiert. Leider bin ich gerade zu MSVC gezwungen, da mein OS X den Geist aufgegeben hat und ich keine Lust auf neu installieren hab. GCC und damit MinGW lehne ich aus religioesen Gruenden ab, Clang fuer Windows ist im Moment unbenutzbar.

    Also erstmal ein gecracktes VS Ultimate heruntergeladen, installiert und dabei alle optionalen Features abgedreht - ich bin schliesslich kein Web/Windows Phone-App Nazi. Aber was ist denn das hier? Microsoft SQL Server 2012? Wer hat denn den bestellt?! Gut zu wissen, dass Microsoft gleich mal was mit installiert, obwohl ich es explizit abgewaehlt habe. Und nicht nur, dass es ein Programmeintrag ist - nein, es sind gleich 14 - darunter auch Silverlight und irgendein nutzloser Help Viewer. http://i.gyazo.com/7731c671f625515c89e8adc674ff0de9.png
    Faengt ja schon mal gut an, aber seis drum.

    Schwarzes VS UI Design ausgewaehlt. Hm, sieht ja eigentlich ziemlich cool aus. Auch der IntelliNonSense ist wesentlich besser geworden, scheint ja jetzt ganz brauchbar zu sein. Wenn der Compiler jetzt auch nicht noch im Jahr 2000 stehen geblieben waere, ware das Gesamtpaket ja gar nicht so schlecht. Fuer den Debugger ist MSVC bekannt, aber so ueberragend wie seinen Ruf finde ich den jetzt auch nicht - vielleicht irgendwelche geheimen Bonus Features, die ich noch nicht unlocked habe?

    Wie auch immer, Projekt angelegt und angefangen zu coden. OpenGL ist ja leider ohne Wrapper ziemlich ekelhaft, also erstmal diese gebaut - wir wollen schliesslich von RAII profitieren und uns nicht mit OpenGL Calls rumschlagen.

    struct Texture
    {
    	typedef gluint Handle;
    
    	Texture();
    	Texture(Texture&& other);
    	explicit Texture(Image const& image);
    	Texture& operator = (Texture other);
    	~Texture();
    
    	void swap(Texture& other);
    
    	unsigned width() const;
    	unsigned height() const;
    
    	void bind(glenum target) const;
    
    	Handle handle();
    
    private:
    	Handle handle_;
    	unsigned width_, height_;
    };
    

    Ja, das sieht doch gut aus. Man koennte jetzt natuerlich noch ein "echtes" Enum fuer bind() bauen und Support fuer andere Arten von Texturen als 2D, aber irgendwo muss man schliesslich anfangen.

    Geil, jetzt hab ich meine Texture Klasse und muss mich um nichts mehr kuemmern. Gerade rechtzeitig, damit ich meinen Font Loader bauen kann:

    Font loadFontFromFile(std::string const& filename)
    {
    	FontProperties properties;
    	std::map<UInt32, GlyphInfo> glyphs;
    	Texture texture;
    
    	if(!parseFontFile(filename, properties, glyphs, texture))
    		throw std::runtime_error("failed to load font!");
    
    	return Font(properties, std::move(glyphs), texture);
    }
    

    Leider wird mein Font aber nicht gerendert. Komisch, im OpenGL Debugger wird die Textur auch gar nicht angezeigt. Was ist da los?
    (Sieht es an dieser Stelle schon jemand? Nein? Ich empfehle, hier das Lesen zu pausieren und den Bug zu suchen.)

    Ein bisschen Leerraum fuer diejenigen, die auf Bugsuche sind und die Loesung nicht gleich sehen wollen:
    ---

    ---

    Zwei Tage vergehen - Fehler immer noch nicht gefunden. Was zur Hoelle? Ist mein OpenGL Code falsch? Vielleicht liegt der Fehler ja irgendwo in den Shadern? Oder sinds die Bilddaten der Textur selbst? Hmmm ...

    Ich weiss nicht mehr, was mich dazu getrieben hat, aber irgendwann hab ichs einfach mal probiert:

    Texture(Texture const&) = delete;
    

    1>Font.cpp(274): error C2280: 'Texture::Texture(const Texture &)' : attempting to reference a deleted function
    1> c:\users\leme\documents\visual studio 2013\projects\mysolution\myproject\Texture.hpp(11) : see declaration of 'Texture::Texture'

    Heureka! Beim return in loadFontFromFile fehlte also ein std::move(), weshalb die Textur und damit das Handle kopiert wurde. Die lokale Variable wurde zerstoert, wodurch die Textur in OpenGL wieder freigegeben wurde. Deshalb wurde sie also auch nicht im OpenGL Debugger angezeigt! OpenGL hat natuerlich - beschissen wie es ist - nichts gemeldet, als ich versucht habe, die Textur mit einem ungueltigen Handle zu rendern. Stattdessen habe ich also erstmal an 10 verschiedenen anderen Stellen gesucht, wo ich den Fehler fuer moeglich gehalten habe.

    Aber warum wurde hier ueberhaupt ein Copy-Ctor generiert? In meiner (selbstverstaendlich ganz legal gekauften) Version des Standards steht, dass in diesem Fall keiner generiert werden sollte. Ideone gibt mir Recht: http://ideone.com/UNwC5z
    Sollte. Die Betonung liegt auf *sollte*. S.O.L.L.T.E

    MSVC scheisst (natuerlich, wie immer - siehe typename) auf den Standard und generiert trotzdem einen, nur um Devs kraeftig in den A**** f***** zu koennen. Ich weiss ja nicht wie's euch geht, aber benutzerfreundlich sieht fuer mich anders aus. Vielen Dank an die VS Devs fuer zwei komplett sinnlos verschwendete Tage. Was zu viel ist, ist zu viel. OS X neu installiert und Eclipse + Clang drauf. Da krieg ich auch wenigstens keine retardeden int->bool Warnungen, die mich zwingen, hirnrissige Konstrukte wie

    myint ? true : false
    

    zu schreiben. Dort haelt sich mein Compiler an den Standard und verursacht nicht UB. Endlich constexpr, ich fuehle mich wieder zurueck im Jahre 2014.

    Vielen Dank an das Clang-Team fuer einen guten Compiler. Vielen Dank an das Eclipse Team fuer eine brauchbare IDE. Vielen Dank an Apple fuer ein gutes und dabei noch dazu ausgesprochen schoenes und praktisches Betriebssystem.

    M$ kann mich mal sonstwo.

    Der Kellerautomat

    Edit: Link + Typo gefixt.



  • Kellerautomat schrieb:

    hirnrissige Konstrukte wie

    myint ? true : false
    

    Ihgitt!
    Das schreibt man als

    !!myint
    

    damit weiß dann jeder, daß es genau nur um die MS-Warnung geht.



  • Also ich schreibe immer myint != 0. 🤡



  • Ich hab's gesehen! 😃
    Hab' mir gleich gedacht dass es an der Temporary liegt, da schnuppert man beim MSVC sowas einfach.



  • Kellerautomat schrieb:

    MSVC scheisst (natuerlich, wie immer - siehe typename) auf den Standard und generiert trotzdem einen, nur um Devs kraeftig in den A**** f***** zu koennen.

    Vielleich solltest du es doch mal mit einer legalen und aktuellen Version versuchen...

    #include <iostream>
    using namespace std;
    
    struct X
    {
    	X()
    	{}
    
    	X(X&&)
    	{}
    };
    
    int main()
    {
    	X a;
    	X b = a;
    }
    
    1>  main.cpp
    1>main.cpp(19): error C2280: 'X::X(const X &)' : attempting to reference a deleted function
    1>          main.cpp(14) : compiler has generated 'X::X' here
    

    Kellerautomat schrieb:

    OpenGL hat natuerlich - beschissen wie es ist - nichts gemeldet, als ich versucht habe, die Textur mit einem ungueltigen Handle zu rendern.

    Vermutlich hast du auch nicht danach gefragt, i.e., glGetError() aufgerufen...



  • dot schrieb:

    Vielleich solltest du es doch mal mit einer legalen und aktuellen Version versuchen...

    Vielleicht solltest du es doch mal ohne CTP versuchen.

    dot schrieb:

    Vermutlich hast du auch nicht danach gefragt, i.e., glGetError() aufgerufen...

    Selbstverstaendlich rufe ich glGetError() auf und das hat nichts geliefert.



  • Kellerautomat schrieb:

    dot schrieb:

    Vielleich solltest du es doch mal mit einer legalen und aktuellen Version versuchen...

    Vielleicht solltest du es doch mal ohne CTP versuchen.

    Hattest du in den Projekteinstellungen die Compiler-Extensions abgeschaltent (Ze und Za oder wie die heißen)?



  • out schrieb:

    Kellerautomat schrieb:

    dot schrieb:

    Vielleich solltest du es doch mal mit einer legalen und aktuellen Version versuchen...

    Vielleicht solltest du es doch mal ohne CTP versuchen.

    Hattest du in den Projekteinstellungen die Compiler-Extensions abgeschaltent (Ze und Za oder wie die heißen)?

    Ich hab an solchen Settings nicht herumgedreht, also default Werte. Was auch immer das jetzt heisst.


Anmelden zum Antworten