Initialisierung Bool Array?



  • Hi!
    Anscheinend bin ich zu blöd ein Bool Array zu initialisieren. Ich habe eine globale Variable inkl. initialisierung:

    bool set_target_sockets[10] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 };
    

    Und im Hauptcode möchte ich einerseits die Werte in einer Schleife anbfragen, und andererseits ändern.

    Aber immer wenn ich eine Überprüfung mache:

    for (int i = 0; i <= 9; i++)
    	{
    		if (set_target_sockets[i] == true)
    		{
    			cout << "Test" << "\n";	
    		}
    	}
    

    Wird nichts ausgegeben. Beim Debuggen wird das cout nicht erreicht. Und wenn ich mit der Maus
    über die Variable fahre zeigt er nur "set_target_sockets{}". Ich nutze Visual Studio 2013.

    Was mache ich falsch?



  • SchlitzInDaHaus schrieb:

    Was mache ich falsch?

    Du benutzt eine globale Variable.

    Bitte zeig ein kompilierbares Minimalbeispiel, dein hier gezeigter Code funktioniert.
    http://ideone.com/jSBvz9



  • Bei mir funktioniert der Code:

    #include <iostream> 
    
    bool set_target_sockets[10] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 };
    
    int main() {
      const std::size_t num_of_socket_elements = sizeof(set_target_sockets) / sizeof(bool); // oder einfach nur sizeof(set_target_sockets), da bool = 1 byte
      for (std::size_t i = 0; i < num_of_socket_elements; ++i) {
        if (set_target_sockets[i]) {
          std::cout << "Hello World!" << std::endl;
        }
      }
    }
    

    Getestet mit MS VS 2013 (debug)



  • jb schrieb:

    // oder einfach nur sizeof(set_target_sockets), da bool = 1 byte
    

    Nö, das ist nicht garantiert.



  • TyRoXx schrieb:

    jb schrieb:

    // oder einfach nur sizeof(set_target_sockets), da bool = 1 byte
    

    Nö, das ist nicht garantiert.

    Ist Dir ein Compiler/-konfiguration bekannt, wo ein bool mehr als ein Byte hat?

    Mit dem MS VS 2013 Compiler ist es auf jeden Fall so. Einen noch größeren Speicherbedarf um zwei Zustände abzubilden macht doch keinen Sinn.



  • jb schrieb:

    Ist Dir ein Compiler/-konfiguration bekannt, wo ein bool mehr als ein Byte hat?

    Scheinbar Visual C++ 4.2 wo sizeof(bool) == 4 ist (http://stackoverflow.com/questions/4897844/is-sizeofbool-defined). Ist zwar Uralt aber sizeof(bool) zu schreiben kostet auch nicht so viel Platz/Zeit.


  • Mod

    jb schrieb:

    Ist Dir ein Compiler/-konfiguration bekannt, wo ein bool mehr als ein Byte hat?

    Was für einen Unterschied macht das?



  • Eins vorweg: Man sollte überhaupt nicht sizeof(set_target_sockets) / sizeof(bool) schreiben, sondern ein std::array benutzen. Wenn das nicht möglich ist, möge man eine solche Funktion benutzen:

    template <class T, std::size_t N>
    std::size_t size_of_array(T (&)[N])
    {
        return N;
    }
    

    Wenn es trotzdem sizeof sein muss, sollte man so konsistent wie möglich sein. Das Muster muss offensichtlich erkennbar sein. sizeof .. / sizeof .. ist allgemein bekannt als Ausdruck, um eine Array-Länge zu ermitteln. Die Division durch eins wegzulassen, weil man so super schlau ist, verringert die Lesbarkeit. Außerdem muss man jedes Mal - bewusst oder unbewusst - darüber nachdenken, ob hier die Größe in Bytes oder die Länge gemeint ist. Selbst, wenn der Wert derselbe ist, macht es semantisch einen Unterschied.



  • Arcoth schrieb:

    jb schrieb:

    Ist Dir ein Compiler/-konfiguration bekannt, wo ein bool mehr als ein Byte hat?

    Was für einen Unterschied macht das?

    Keinen. Ich wollte nur wissen, ob hier was bekannt ist. Mir war es nicht. Einfach nur als Randinformation. Bisschen Wissen ansammeln, was welcher Compiler so macht, kann ja nicht schaden 🙂

    sebi707 schrieb:

    Scheinbar Visual C++ 4.2 wo sizeof(bool) == 4 ist (http://stackoverflow.com/questions/4897844/is-sizeofbool-defined). Ist zwar Uralt aber sizeof(bool) zu schreiben kostet auch nicht so viel Platz/Zeit.

    Danke Dir, auf die Idee - es zu suchen - bin ich nicht gekommen.

    @TyRoXx:
    Danke Dir. Die Syntax kannte ich noch nicht. Ich programmiere noch mit dem alten Standard, daher sind mir die Möglichkeiten und die STL noch nicht so vertraut.



  • Ok. Danke an alle. Ich weiß nicht, was ich falsch gemacht habe, aber jetzt gehts...


Anmelden zum Antworten