Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.



  • Hallo, könnte mir jemand folgedes Phänomen erklären?
    Ich möchte ein Array mit Nullen füllen.
    Eigentlich kein Ding, jedoch folgendes gleiches Problem tritt bei zwei verschiedenen Compilern auf.

    int a=7, b=7;
    int c=0;
    int matrix[a][b]={c};
    for(int i=0; i<a; i++)
    {
        cout << endl;
        for(int j=0; j<b; j++)
        {
            cout << "[" << i << "|" << j << "] " << matrix[i][j] << ";";
        }
    }
    

    Das Array wird von [0][2] bis [0][5] nicht mit Nullen gefüllt.
    Ansonsten ist alles Null. Egal wie groß ich die Matrix mache.

    Schreibe ich jedoch
    int matrix[7][7]={0};
    so bekomme ich eine Nullmatrix.

    Warum ist das so?


  • Mod

    @guibrush sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    Eigentlich kein Ding, jedoch folgendes gleiches Problem tritt bei zwei verschiedenen Compilern auf.

    Welche? Benutzt mit welchen Einstellungen?

    int a=7, b=7;
    int c=0;
    int matrix[a][b]={c};
    

    Das ist kein standardkonformes C++.



  • Du hast hier eine Nicht-Standard-Erweiterung (variabel lange arrays) verwendet. Lösung: verwende keine VLAs .

    Mögliche Lösung: füge bei ein const in Zeile 1 ein: const int a=7, b=7.

    Es ist bei VLAs nicht vorgesehen, dass diese wie "normale" Arrays mit 0 gefüllt werden.

    Ich habe eben ergooglt, dass dies im C-Standard (dies ist kein C++!) wohl in §6.7.8 steht (ungeprüft von Stackoverflow übernommen, falls es nicht passt):
    The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.



  • @camper sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    st kein standardkonf

    CodeBlocks und Dev-C++
    Stadardkonformes C++? Hmmm... ich bin im 1. Semester.
    Aufgabe war, eine Matrix zu generieren, die einem Nutzer die Möglichkeit gibt, seine Matrixgröße selbst zu bestimmen. Einfachhaltshalber hahbe ich hier a und b gleich 7 gesetzt.
    Sonst ist die Eingabe per cin gedacht, was gleiches Resultat liefert.
    Zudem sollte der Nutzer auch selbst bestimmen, mit welchem Wert die ganze Matrix gefüllt sein soll.



  • @wob sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    §6.7.8

    Hmm. Ok.
    Dann verstehe ich die Aufgabenstellung nicht. (Ich bin im 1.Semester)
    Wir sollen ein Programm schreiben, dass dem Nutzer die Möglichkeit bietet die größer einer Matrix zu bestimmen. Als nächstes hat er die Wahl einen Wert einzugeben womit die Matrix gefüllt werden soll.
    In weiteret Schritten (hier unwichtig) soll der Nutzer einzelne Einträge änder.



  • @guibrush sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    CodeBlocks und Dev-C++

    Sind beides keine Compiler sondern Entwicklungsumgebungen (IDEs - Integrated Development Environments).

    @guibrush sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    Dann verstehe ich die Aufgabenstellung nicht. (Ich bin im 1.Semester)
    Wir sollen ein Programm schreiben, dass dem Nutzer die Möglichkeit bietet die größer einer Matrix zu bestimmen. Als nächstes hat er die Wahl einen Wert einzugeben womit die Matrix gefüllt werden soll.

    Und das mit vom Benutzer in ints eigelesenen Größen für Arrays ist euch so beigebracht worden?



  • std::vector sollte man nutzen. Wenn man euch das nicht beibringt, bringt man euch Quatsch bei (leider absolut möglich).



  • @Swordfish sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    Und das mit vom Benutzer in ints eigelesenen Größen für Arrays ist euch so beigebracht worden?

    Ja. So genau haben wir es gesagt bekommen.

    IDEs: Ok, danke. Gut zu wissen. Bin neu auf diesem Gebiet.



  • @TGGC sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    std::vector sollte man nutzen.

    Hmmm... soweit sind wir wahrscheinlich noch nicht.
    Also so wie ich das hier jetzt verstehen, kann ich auf die uns beigebrachte Art und Weise die Matrix nicht mit Nullen füllen. Ich werde mal unseren Dozenten zur Rede stellen.
    Vielen Dank.

    (das man Quatsch an den Unis lernt, ist mir leider auch schon oft bewusst geworden 😕 )



  • @guibrush sagte in Array mit Nullen füllen ... eigentlich easy, doch es wird nicht alles Null.:

    Also so wie ich das hier jetzt verstehen, kann ich auf die uns beigebrachte Art und Weise die Matrix nicht mit Nullen füllen.

    Natürlich kannst du es mit Nullen füllen. Du musst es nur manuell machen:
    for (size_t r = 0; r < rows; ++r) for (size_t c = 0; c < cols; ++c) arr[r][c] = 0;
    oder einfach memset nehmen (oder std::fill, wenn du wirklich C++ statt C mit Elementen aus C++ lernen würdest, wobei der vector aber auch schon automatisch initialisieren würde). Aber wie schon erwählt, verwende keine VLAs.

    Wenn du kompilierst (mit g++ oder clang++), dann füge die Parameter -Wall -Wextra -Wpedantic -Werror hinzu. Dann kompiliert dieser Code gar nicht erst.

    $ g++ -Wall -Wextra -Wpedantic -Werror forum.cpp 
    forum.cpp: In function ‘int main()’:
    forum.cpp:6:20: error: ISO C++ forbids variable length array ‘matrix’ [-Werror=vla]
         int matrix[a][b] = {c};
                        ^
    forum.cpp:6:20: error: ISO C++ forbids variable length array ‘matrix’ [-Werror=vla]
    cc1plus: all warnings being treated as errors
    

    Und als Bonus: clang warnt sogar, dass dein Code nicht initialisiert:

    $ clang++-7 -Wall -Wextra -Wpedantic -Werror forum.cpp
    forum.cpp:6:18: error: variable length arrays are a C99 feature [-Werror,-Wvla-extension]
        int matrix[a][b] = {c};
                     ^
    forum.cpp:6:15: error: variable length arrays are a C99 feature [-Werror,-Wvla-extension]
        int matrix[a][b] = {c};
                  ^
    forum.cpp:6:16: error: variable-sized object may not be initialized
        int matrix[a][b] = {c};
                   ^
    3 errors generated.
    

    Wegen der Initialisierung kompiliert clang++-7 deinen Code übrigens auch ohne -Werror nicht.



  • ok. Hmmm... das ist wohl ein höheres Semester. 🤔
    Aber vielen Dank schon mal.
    Gefällt mir hier im Forum. Hier kriegt man geholfen.


Anmelden zum Antworten