Projekt Umstellen: 32 Bit -> 64 Bit, 2 Fragen



  • Hi,

    ich stelle gerade ein Projekt von 32 Bit auf 64 Bit um. Und habe dazu mehrere Fragen:

    1. In meinem Code benutze ich die Boost Graph Library, in meinem Code (32 Bit) habe ich folgende Zeile:

    const unsigned int test1 = boost::in_degree(n1, g);
    

    Nach dem umstellen bekomme ich auf einmal die Warnung:

    warning C4267: 'Initialisierung': Konvertierung von 'size_t' nach 'const unsigned int', Datenverlust möglich
    

    Das verwirrt mich sehr, zum ersten weil ich immer dachte das size_t nur dazu verwendet werden sollte Ergebnise von sizeof() zu representieren und zum zweiten warum gab es die Warnung nicht im 32 Bit Projekt. Weil size_t zu unsigned int kann ja auch nicht richtig sein.

    Da ich C++11 benutze schreibe ich jetzt immer:

    const auto test1 = boost::in_degree(n1, g);
    

    Ist das die beste Loesung?

    2. In meinem Projekt benutze ich mehrere Boost Library Header Dateien, wenn ich das Project umstellen muss man dann auch spezielle 64 Bit Header Dateien verwenden, oder ist das nicht noetig?

    Besten Dank,
    🙂



  • MokuYobi schrieb:

    Das verwirrt mich sehr, zum ersten weil ich immer dachte das size_t nur dazu verwendet werden sollte Ergebnise von sizeof() zu representieren

    Nein, size_t ist einfach ein size-Typ. in_degree gibt ein Ergebnis vom Typ degree_size_type zurück.

    und zum zweiten warum gab es die Warnung nicht im 32 Bit Projekt. Weil size_t zu unsigned int kann ja auch nicht richtig sein.

    Vmtl. weil dort size_t ein typedef für unsigned int ist.

    Da ich C++11 benutze schreibe ich jetzt immer:

    const auto test1 = boost::in_degree(n1, g);
    

    Ist das die beste Loesung?

    Sieht fuer mich ok aus.

    2. In meinem Projekt benutze ich mehrere Boost Library Header Dateien, wenn ich das Project umstellen muss man dann auch spezielle 64 Bit Header Dateien verwenden, oder ist das nicht noetig?

    Nein, eher nicht. Kann höchstens sein, dass du die Libraries selbst für dein 64-Bit-System kompilieren (bzw. herunterladen) musst.



  • Danke fuer die Info. 🙂
    Was genau ist den ein size type? Heisst das ich kann problemlos in meinem Program unsigned int durch size_t ersetzne?



  • MokuYobi schrieb:

    Danke fuer die Info. 🙂
    Was genau ist den ein size type? Heisst das ich kann problemlos in meinem Program unsigned int durch size_t ersetzne?

    mit einem std::size_t kann man die grösse jeder möglichen klasse und jedes möglichen arrays speichern. ausserdem kann man auf vielen plattformen jede nicht-member adresse in einem std::size_t speichern. quelle: http://en.cppreference.com/w/cpp/types/size_t

    ich persönlich schreibe bei all meinen projekten oben hin:

    #include <cstddef>
    namespace xy // Was auch immer es für ein Projekt ist an dem ich arbeite
    {
        typedef ::std::size_t SizeType;
    
        // ...
    }
    

    und ich nutze den typ für alles was ich schreibe, for-zähler, indices, grössen, etc. etc.



  • asfdlol schrieb:

    typedef ::std::size_t SizeType;
    

    Gibts bei euch Leute, die lokale Namensräume namens std definieren, sodass du auf Nummer sicher gehen musst? 😉

    Das :: am Anfang sieht man ab und zu, aber in den wenigsten Fällen ist es nötig. Aber davon abgesehen, gibts einen Grund wieso du nicht direkt std::size_t verwendest? Du kannst ja trotzdem nicht einfach den Typ austauschen, weil du dann an vielen Stellen mit der STL inkompatibel bist. Auf der anderen Seite machst du den Code schwerer zu lesen für andere Programmierer, die dein SizeType nicht kennen. Also... wo liegt der Vorteil?



  • Nexus schrieb:

    asfdlol schrieb:

    typedef ::std::size_t SizeType;
    

    Gibts bei euch Leute, die lokale Namensräume namens std definieren, sodass du auf Nummer sicher gehen musst? 😉

    ach, ich bin nur ein hobby-"programmierer", somit kann ich mit sicherheit sagen, dass das niemand tut. ich schreibe das wenn ich in namespaces auf andere libs zugreife aus gewohnheit und aus konsistenz hin.

    Nexus schrieb:

    Aber davon abgesehen, gibts einen Grund wieso du nicht direkt std::size_t verwendest? Du kannst ja trotzdem nicht einfach den Typ austauschen, weil du dann an vielen Stellen mit der STL inkompatibel bist. Auf der anderen Seite machst du den Code schwerer zu lesen für andere Programmierer, die dein SizeType nicht kennen. Also... wo liegt der Vorteil?

    objektive argumente die mich bekräftigen habe ich dafür nicht, es ist einfach mein persönlicher stil und mir geht SizeType besser von den händen als std::size_t. ausserdem finde ich pascalcase einfach hübsch. ausserdem mache ich typedefs für >90% der typen (die nicht built-in sind (std::size_t ist auch ein typedef auf einen built-in-typen, ich weiss, der name selbst ist aber nicht build-in)) bevor ich sie verwende.

    mich an andere code-konventionen anzupassen (damit ist auch gemeint unnötige führende :: wegzulassen und std::size_t statt ein typedef zu nutzen) kann ich allenfalls auch...



  • Wenn du es für dich selbst machst, ist es natürlich dir überlassen. Ich denke nur, dass solche Konventionen allfällige Mitentwickler (auch hobbymässig) oder Benutzer (im Fall einer Bibliothek) verwirren könnten 😉


Anmelden zum Antworten