Datenstruktur für Matrizen



  • Die letzte Variante, aber mit einem normalen Array (keine Ahnung, was std::tr1::array ist). Alles andere ist zu langsam. Höchstens im Debug-Build den Index checken (z.B. mit assert).


  • Mod

    Pyr0kar schrieb:

    rapso schrieb:

    Pyr0kar schrieb:

    rapso schrieb:

    Pyr0kar schrieb:

    Darf man mal fragen ob ihr auch Color<N> oder sogar Color<T, N> habt ? 😉

    wieso nicht vector<T> dafuer nehmen?

    Ganz einfach, weil man bei einer eigenen Klasse so schöne dinge machen kann wie:

    static const Color3 White = Color3(255, 255, 255);
    static const Color3 Red= Color3(255, 0, 0);
    

    was sollen diese zwei zeilen beweisen?

    Mir fällt leider jetzt erst auf dass die zwei Codezeilen wirklich nicht zeigen was ich meinte 😉 ^^
    Ich wollte eigentlich ausdrücken dass man das ganze der Klasse als Membervariable einbauen kann.
    So dass dann möglich ist:

    Color c = Color::White // eben noch mit templates etc.
    driver->clear(Color::White);
    

    bei c++ versucht man mit kapselung die member nicht direkt zugreifbar zu machen, das zu brechen mit static const ist zum einen nicht schoen, zum anderen musst du die definition noch ausserhalb schreiben... doppelt unschoen.

    auch aus diesem grund gibt es namespaces, so musst du grundlegende oop dinge nicht brechen und darfst sogar trotzdem ein packet schoen abkapseln... kanns ein dass es nur meine ansicht ist 🙂

    rapso schrieb:

    Niemand wird außerversehen eine Position als Farbwert behandeln u. andersrum 😉

    der zusammenhang entgeht mir.

    Na der zusammenhang ist, dass bei z.b.

    Driver::clear(Color& color)
    

    Auch nur ein Color-Wert angegeben werden kann, wenn jemand da ein Vector reinhaut gibts ein netten compile-time-error. In Scott Meyers Effective C++ gibts einen Tipp der empfielt für sowas immer eigene Klassen zu schreiben damit der compiler schon zu compile-time weiß ob die Typen stimmen.
    Typedefs sind in C++ einfach nicht sicher.

    dann scheint dir ziemlich viel in letzten paar jahren entgangen zu sein, sprachen wie cg/hlsl nutzen vectoren/colors als nur einen datentypen und beim normalen rechnen tag fuer tag macht man auch keinen unterschied, du kannst farben oder normalen in buffer stopfen und sie dann wieder auf der graphikkarten interpretieren wie du moechtest.

    ich hab zuhause meinen color4 von vector4 abgeleitet, sharen das meiste aber manches wie z.b. operator* ist dann anders.
    aber grundsaetzlich spricht aus meiner sicht nicht dagegen das meiste zu sharen.



  • Pyr0kar schrieb:

    union
    			{
    				struct
    				{
    					T X;
    					T Y;
    				};
    				struct
    				{
    					std::tr1::array<T, 2> Elements;
    				};
    			};
    

    Du kannst nur PODs in unions benutzen ⚠

    btw. ist das kein ISO-C++ aber die meisten Compiler unterstützen anonyme structs und unions.



  • lolz schrieb:

    btw. ist das kein ISO-C++ aber die meisten Compiler unterstützen anonyme structs und unions.

    weis eigentlich wer warum das so is!? mir fällt auf die schnelle eigentlich nix ein was gegen anonyme structs sprechen würd...


  • Mod

    ich dachte annonyme structs kaemen in den neuen c++ standard.



  • rapso schrieb:

    ich dachte annonyme structs kaemen in den neuen c++ standard.

    🙂 wunderbar


  • Mod

    das war keine feststellung, sonder wirklich was ich glaube mal gelesen zu haben (irgendwo in nem artikel der non-standard unterschiede in VC++ und g++ auf listete). waere schoen wenn das wirklich in den standard kaeme.



  • anonyme structs ala

    struct {
      // ...
    } instanz;
    

    sind doch erlaubt.

    Aber die union geht auch wenn anonyme Typen erlaubt sind nicht, da die zweite Struktur definitiv und je nach dem was T ist auch die erste Struktur kein POD mehr sind 🙂



  • Hab mich von std::tr1::array getrennt.

    template<class T>
    		class Vector<T, 2>
    		{
    		public:
    			enum { Dimension = 2 };
    			typedef T ValueType;
    			typedef T ArrayType[2];
    
    		public:
    			union
    			{
    				struct
    				{
    					T X;
    					T Y;
    				};
    				struct
    				{
    					ArrayType Elements;
    				};
    			};
    			...
    

    Kann mir jemand jetzt konkret einen Compiler nennen der das nicht frisst?


  • Mod

    ich glaube VC5, irgend ein codewarrior und symantec wollten das nicht... ist aber ewig her dass ich die benutzt habe.


Anmelden zum Antworten