2 Dimensionales Array an Funktion übergeben
-
Hallo ich bekomme immer folgende Fehlermeldung,
"The Variable x is used being without definded"
Was mir ein bisschen unklar ist wieso, die erste Funktion hat die Aufgabe einfach eine Datei auszulesen und das Array x zu füllen, die zweite,...,x-te soll dann Berechnungen damit anstellen.void funktion1(unsigned long **x) { //... while(fgets(zeile,100,datei) != NULL) { x[0][i] = strtol(zeile,&ptr,10); x[1][i] = strtol(ptr,&ptr,10); x[2][i] = strtol(ptr,&ptr,10); i++; } } void funktion2(unsigned long **x) { //... while(counter<32) { werte1+= x[0][counter]; werte2+= x[1][counter]; werte3+= x[2][counter]; counter++; } } int main() { unsigned long **x; funktion1(x); funktion2(x); getchar(); }
-
Setze die Funktionen nach main() und deklariere vor main() Prototypen.
-
Ging aber fix, aber mal davon abgesehen das es nichts bringt, also kommt die selbe Meldung! Wieso sollte denn das Funktionieren?
-
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.