2 Dimensionales Array an Funktion übergeben
-
hast du denn speicher reserviert?
-
Ne das wirds wohl sein
Aber wie kann ich denn für ein 2D. Array speicher reservieren? Wenn ich weis, dass meine Felder 3 zeilen und 32 Spalten enthalten.
-
Das Programm wird imperativ ausgeführt, (von oben nach unten) also kennt das Programm logischerweise den zu übernehmenden Parameter "unsigned long **x" in den (vor main) definierten Funktionen nicht. (auch dann nicht wenn du in main einen Wert zuteilst).
-
Zum Speicher zuweisen an einen Zeiger:
int *p; // Hilfe bin doof und zeige auf NULL p = new int[x][y];
könnte das so funcen bin auch nicht ganz sicher (is aber C++)
in ANSI C musst du das mit malloc machen
-
Na dann nehmen wir doch lieber gleich calloc und initialisieren mit 0.
-
new ist nicht c
machst du so:int **p,i; p = malloc(x * sizeof(int*)); if(p == NULL) return 1; for(i=0;i<x;i++) { p[i] = malloc(x * sizeof(int)); if(p[i] == NULL) return 1; }
so oder so ähnlich geht das
x muss natürlich angepasst werden
-
btw: ein *type *foo ist kein 2D-Array. Es ist ein Zeiger auf einen Zeiger.
-
Hallo, du kennst doch die Anzahl der Zeilen und Spalten bereits, dann kannst du dir den Klimbim mit malloc, calloc und Konsorten sparen. Drei Zeilen ist doch recht überschaubar, spendier doch jeder Zeile einen Zeiger und schick die drei Zeiger in eine Funktion:
#include <stdio.h> void uebergabe_2d( int* p1, int* p2, int* p3 ) { int i; for ( i = 0; i<32; i ) { p1[i] = i; p2[i] = i; p3[i] = i; } } int main() { int zwei_d[3][32]; int i; uebergabe_2d( zwei_d[0], zwei_d[1], zwei_d[2] ); for ( i = 0; i<32; i ) { printf("%2i %2i %2i \n", zwei_d[0][i], zwei_d[1][i], zwei_d[2][i] ); } return 0; }
Gruß, p.
-
Die letzte Lösung gefällt mir auch am besten, aber wäre schön gewesen, wenn es mittels Doppelpointer gegangen wäre. Anscheinend sind 2 Dimensionale Arrays nicht so einfach zu behandeln in c. Aber bei mehr als 3 Felder im 2.Dimensionalen wird die Variante schnell Unübersichtlich.
-
Tobias1984 schrieb:
aber wäre schön gewesen, wenn es mittels Doppelpointer gegangen wäre.
Mit einem Doppelpointer drei Adressbereiche anzuspringen finde ich irgendwie umständlich, nach dem Motto warum einfach wenns auch umständlich geht ?
Tobias1984 schrieb:
Die letzte Lösung gefällt mir auch am besten.
Hach, welch Balsam für meine Augen, mal etwas erfreuliches heute zur Abwechslung.
Na dann will ich mich mal frohgelaunt in die Sonne legen gehen.
MfG,
p.