2dimensionales Array beliebiger Größe



  • Hallo,

    ich möchte ein 2-dimensonales Array erstellen, dessen Größe allerdings vom Benutzer eingegeben wird. Dieses Array soll dann an eine Funktion übergeben werden, was das eigentlich Problem ist.
    So weit ich weiß muss ich beim Übergeben an die Funktion die Größe der 2. Dimension mit angeben:

    void funktion (feld[][zahl]){
    ...
    }

    Jetzt habe ich versucht das Problem mit einer Konstante zu lösen, aber die geht ja nicht verändern.
    Dann habe ich versucht das mit einer globalen Variable zu machen, aber da speichern sich in das übergebene Feld (welches zunächst einmal überall Null sein soll) plötzlich irgendwelche komischen Werte...

    Ist es überhapt möglich das irgendwie zu lösen???

    Danke für jede Hilfe 🙂



  • void foo(int (*p)[100], size_t size)
    

    Bedenke, dass die "100" hier eine compile-time Konstante sein muss. Bedeutet dein Nutzer kann nur eine Dimension bestimmen.
    Ansonsten:

    void foo(int *p, size_t x_size, size_t y_size)
    {
    	p[5 * y_size + 3] = 4; // p[5][3] = 4;
    }
    
    int main(void)
    {
    	int *p = malloc(x_size * y_size);
    	foo(p, x_size, y_size);
    	free(p);
    }
    

    Wenn alle Dimensionen dynamisch sein sollen brauchst du einen int**, da reservierst du erst die Zeilen und dann für jede Zeile noch mal Speicher.



  • Aber warum geht das denn nicht mit der globalen Variable?

    int LAENGE;
    
    //Funktion:
    void print(int feld[][LAENGE]) {
        int i, j;                
    
        //Ausgabe des Feldes:
        for (i = 0; i < LAENGE; i++) {        
            for (j = 0; j < LAENGE; j++) {
                if (feld[i][j] == 0) {
                    printf("  "); 
                } else {
                    printf("%d",feld[i][j]); 
                }
            }      
        }            
    }
    
    //Main:
    int main(int argc, char** argv) {
        int i, j;
    
        int feld[LAENGE][LAENGE];                 
        scanf("%d",&LAENGE);
    
        for (i = 0; i < LAENGE; i++) { // Alle Elemente des Feldes als Null setzen
            for (j = 0; j < LAENGE; j++) { 
                feld[i][j] = 0;
            }
        }
        print(feld);
        return (EXIT_SUCCESS);
    }
    

    Das Übergeben an die Funktion funktioniert hier ja, nur gibt das dann trotz dass ich das ganze Feld mit Null überschrieben habe viele komische Zahlen aus...



  • Lies zuerst die Anzahl der Spalten und Zeilen ein (Konsole o.Ä.) und reservier dann den Speicher mit malloc/new.



  • Welchen Wert hat denn LAENGE in Zeile 23?



  • Aaah, das Problem hat sich gelöst, sobal ich erst mit scanf LAENGE eingelesen habe und dann erst das Array deklariert habe...
    Eigentlich ja auch logisch.

    Vielen Danke für die Hilfe! 🙂



  • Bedenke, dass das nur in C99 geht. Weder C89 noch C++ kennen VLAs, da musst du mit malloc/new arbeiten.


Anmelden zum Antworten