Noch eine Array Frage!



  • Hi,

    ich habe ein Zweidimensionales Array. Ich möchte bevor ich Werte zuweise einmal das Array auf "Null" setzen. (Nennt man das so ?)

    Meine Überlegung war folgende:

    arr[10][10]
    
    for(int j = 0; j < 10; j++ )
     {
       for(int m = 0; m < 10; m++ )
       {
          ???
       }
     }
    

    Ich durchlaufe jedes Element des Arrays und möchte den Wert auf "null" setzen.
    Allerdings weiss ich jetzt nicht wie das am elegantesten lösen kann.

    Grund: das Array wird mehrfach beschrieben. und vor jedem neu einschreiben soll der Inhalt des Arrays gelöscht werden.

    Jemand eine Idee ?



  • arr[10][10]
    
    for(int j = 0; j < 10; j++ )
     {
       for(int m = 0; m < 10; m++ )
       {
          ???  // arr[j][m] = 0;
       }
     }
    

    Das ganze dann in eine Funktion packen. Weiß nicht sicher ob ich dich richtig verstanden habe.



  • Eine weitere Möglichkeit wäre

    char arr[10][10];
    memset(arr, 0, sizeof(arr)*sizeof(char));
    


  • DarkShadow44 schrieb:

    Eine weitere Möglichkeit wäre

    char arr[10][10];
    memset(arr, 0, sizeof(arr)*sizeof(char));
    

    Das *sizeof(char) ist zuviel. Es schadet hier zwar nicht, da sizeof(char) per default 1 ist, aber bei Typen die eine andere Größe haben ist es absolut falsch.

    sizeof() gib schon die Größe in Byte an.
    Es funktioniert auch nur im selben Scope, in dem auch das Array definiert ist.



  • Jürgen Wolf empfiehlt mir:

    arr[10][10] = {{0}};
    

    Ich find's praktisch, bin mir aber nicht sicher, ob performancebegründet nicht doch lieber memset zu verwenden ist. Weiß das jemand?



  • Ah mist da hab ich was durcheinandergebracht... 😞
    Richtig wäre

    memset(arr, 0, 10*10*sizeof(char));
    

    funktioniert dann auch in anderem Scope.

    EDIT:

    Ich find's praktisch, bin mir aber nicht sicher, ob performancebegründet nicht doch lieber memset zu verwenden ist. Weiß das jemand?

    Performancetechnisch wird das nicht viel ändern. Aber es geht halt NUR bei Erstellen das Arrays, ist also für nicht nicht geeignet.



  • rednaZ schrieb:

    Jürgen Wolf empfiehlt mir:

    arr[10][10] = {{0}};
    

    Ich find's praktisch, bin mir aber nicht sicher, ob performancebegründet nicht doch lieber memset zu verwenden ist. Weiß das jemand?

    Das funktioniert nur bei der Definition von dem Array. (Also nur einmal)


  • Mod

    rednaZ schrieb:

    Jürgen Wolf empfiehlt mir:

    arr[10][10] = {{0}};
    

    Ich find's praktisch, bin mir aber nicht sicher, ob performancebegründet nicht doch lieber memset zu verwenden ist. Weiß das jemand?

    Dann macht er es ja sogar mal richtig!
    Aber wie schon erwähnt, hilft das nicht, wenn ein Array erneut initialisiert werden soll.

    Django2012 schrieb:

    arr[10][10]
     
    for(int j = 0; j < 10; j++ )
     {
       for(int m = 0; m < 10; m++ )
       {
          ???  // arr[j][m] = 0;
       }
     }
    

    Das ganze dann in eine Funktion packen. Weiß nicht sicher ob ich dich richtig verstanden habe.

    Das ist schon mal der richtige Ansatz. Wir können allerdings auch ausnutzen, dass mehrdimensionale Arrays in C als Arrays aus Arrays implementiert sind und im Speicher "dicht" angeordent sind. So ein Array kann folglich auch eindimensional betrachtet werden:

    char arr[10][10];
    
    for(int i = 0; i < 10*10 /* sizeof(arr)/sizeof(arr[0][0]) */; i++ )
     {
         arr[0][i] = 0;
     }
    

    Und für diese Form gibt es auch eine Funktion in der Standardbibliothek, wenn es sich um char-Elemente handelt: memset



  • camper schrieb:

    Und für diese Form gibt es auch eine Funktion in der Standardbibliothek, wenn es sich um char-Elemente handelt: memset

    Wie kommst du darauf, dass das nur bei char-Elementen geht?

    Natürlich geht das bei beliebigen Speicherelementen.


  • Mod

    DirkB schrieb:

    camper schrieb:

    Und für diese Form gibt es auch eine Funktion in der Standardbibliothek, wenn es sich um char-Elemente handelt: memset

    Wie kommst du darauf, dass das nur bei char-Elementen geht?

    Natürlich geht das bei beliebigen Speicherelementen.

    Wenn man 0 haben will. Und auch dann portabel nur für integrale Typen.


Log in to reply