2D Array



  • Hallo,

    ich habe 2 einfachere fragen:

    1. ich würde gerne wissen wie ich ein 2D array auf einen schlag mit einem wert füllen kann.

    vielleicht so in der art:
    double myArr[500][400] = 0.0; ??

    1. Wie könnte ich dann in einer doppelten for schleife das array ausgeben lassen...bzw. wie komme ich an die grösse der einzelnen dimensionen im nachhinein ran?
      for(int i = 0; i < myArr.size()[0] ?????; i++)
      for(int j = 0; j < myArr.size()[1] ????????; j++)

    danke euch vielmals!



  • 1. Das müsste mit double myArr[500][400] = { {0.0} }; gehen... Kann aber sein, dass es da noch eine elegantere Lösung gibt... Bin in C etwas eingerostet ^^

    2. 2 for-Schleifen sind ja schon mal nicht schlecht... 😉

    for(i = 0; i < 500; i++) {
        for(j = 0; j < 400; j++) {
            // ...
        }
    }
    

    Die Größe deines Arrays ist doch fest! Warum also die Größe ermitteln? Zum Thema dynamische Speicherwerwaltung bei Mehrdimensionalen Arrays einfach mal unter http://www.pronix.de/pronix-762.html gucken 🙂

    Mfg



  • danke ,
    abe wenn ich eine variable übergen will geht das nicht? also sowas:
    int a = 9;

    myArr[a][a] = ...

    geht das gar net so?



  • Mati schrieb:

    danke ,
    abe wenn ich eine variable übergen will geht das nicht? also sowas:
    int a = 9;

    myArr[a][a] = ...

    geht das gar net so?

    C in a nutshell:
    C99 erlaubt in der Definition eines Arrays(Vector), die Anzahl der Elemente
    durch einen nicht konstanten Ausdruck festzulegen, wenn der Vektor eine
    automatische Speicherdauer hat, d. h. in einem Block ohne den Spezifizierer
    static. Ein solcher Vektor wird "Vektor variabler Länge" genannt.

    Der Name des Vektors variabler Länge muss ein gewöhnlicher Bezeichner sein.
    Das bedeutet, dass Elemente von Strukturen oder Unions keine Vektoren variabler Länge sein können.
    Beispiel:

    void func(int n) {
    	int arr[2*n];		// OK: automatische Speicherdauer
    	static int arr2[n]	// unzulässig: Ein Vektor variabler Länge
    				// kann keine statische Speicherdauer haben.
    	struct s { int f[n]; }	// unzulässig: f ist kein gewöhnlicher 	
    				// Bezeichner
    	/* ... */
    }
    

    Automatische Variablen werden jedesmal neu erzeugt, wenn die
    Programmausführung diese Funktion aufruft. Daher kann arr bei der
    Instanzierung eine unterschiedliche Länge haben. Bis zum Ende der Funktion
    oder eines Blocks, ist arr aber nicht mehr veränderbar.



  • Mati schrieb:

    double myArr[500][400] = 0.0; ??

    probier's so:

    memset (myArr, 0, sizeof(double)*500*400);
    

    weiss jetzt aber nicht ob das allgemein so geht...



  • double (*myArr)[400] = (double(*)[400])calloc(500*400*sizeof(double));
        // dynamisch ein double myArray[500][400] angelegt - alle Werte au 0.0
        double test = myArr[47][11]; // test = 0.0
        free(myArr);
    


  • Mati schrieb:

    Hallo,

    ich habe 2 einfachere fragen:

    1. ich würde gerne wissen wie ich ein 2D array auf einen schlag mit einem wert füllen kann.

    vielleicht so in der art:
    double myArr[500][400] = 0.0; ??

    Wenn Du das ganze Array auf 0.0 setzen willst, reicht:

    double myArr[500][400] = {0.0};
    

    völlig aus 🙂



  • thknopp schrieb:

    Mati schrieb:

    Hallo,

    ich habe 2 einfachere fragen:

    1. ich würde gerne wissen wie ich ein 2D array auf einen schlag mit einem wert füllen kann.

    vielleicht so in der art:
    double myArr[500][400] = 0.0; ??

    Wenn Du das ganze Array auf 0.0 setzen willst, reicht:

    double myArr[500][400] = {0.0};
    

    völlig aus 🙂

    Bei normalem Stack von 1 MB gibts bloss nen Stacküberlauf!



  • gerie schrieb:

    Bei normalem Stack von 1 MB gibts bloss nen Stacküberlauf!

    Ich habe bei verschiedenen Rechnern verschiedenen alters (zum Teil 10 Jahre
    mit entsprechnder Software) keine Probleme gehabt. Bei Pronix steht, dass
    man mit alten C-Kompilern evt. Probleme bekommen könnte, wenn die Arraygröße
    zu hoch gesetzt wurde.



  • Stack schrieb:

    Ich habe bei verschiedenen Rechnern verschiedenen alters (zum Teil 10 Jahre
    mit entsprechnder Software) keine Probleme gehabt. Bei Pronix steht, dass
    man mit alten C-Kompilern evt. Probleme bekommen könnte, wenn die Arraygröße
    zu hoch gesetzt wurde.

    Hab einen modernen Compiler VC++ 8.0 - Die standardmäßige Stapelgröße beträgt 1 MB
    Das sollte reichen, bei zu grossen Array's kann man ja den Heap benutzen.


Log in to reply