2 Dimensionales dynamisches Array als Parameter?

yax

Erfahrenes Mitglied
Hallo,

ich bin jetzt schon seit einigen Tagen dabei ein Programm zu schreiben. Doch bisher habe ich immer alles in die main-Funktion geschrieben, und das sieht ziemlich durcheinander aus :)
Beim "aufräumen" bin ich auf das Problem gestoßen ein 2 Dimensionales Array an eine Funktion zu übergeben. Ein weiteres Problem ist, dass die größe vom Benutzer erst festgelegt wird.
Jetzt weiß ich nicht, wie ich das Array mit der selbst definierten Größe an eine Funktion übergeben kann.

Code:
Code:
#include <stdio.h>
#include <stdlib.h>

void arrEingabe(int **array, int x, int y){
  int i,b;
  for(i = 0; i < x; i++) {
    for(b = 0; b < y; b++) {
      printf("Zahl [%d][%d]: ",x,y);
      scanf("%d",array[x][y]);
    }
  }
}

int main(void) {
  int x,y;

  printf("Zahl x: ");
  scanf("%d",&x);
  printf("Zahl y: ");
  scanf("%d",&y);

  int array[x][y];

  arrEingabe(array,x,y);

  return EXIT_SUCCESS;
}

Ich hoffe ihr könnt mir helfen :)

Gruß

yax
 
Einen dynamischen Bereich kannst du mittels malloc allozieren:
C:
int index = 0;
int** array = (int**)malloc(sizeof(int*) * x);
while (index < x)
{
   array[index++] = (int*)malloc(sizeof(int) * y);
}

Natürlich musst du alle Teile, die du mit malloc alloziert hast am Ende wieder mit free freigeben.
 
Also irgendwie verstehe ich das Beispiel nicht wirklich. Ich bin ja noch ein Anfänger :)

Also ich verstehe, dass:
in Zeile 1: eine int-Variable angelegt wird
in Zeile 2: ein Zeiger auf ein int-Wert erstellt wird. Was nach dem = kommt verstehe ich nich :)
in Zeile 3: die Schleife wird so lange durchlaufen bis index = x ist.
in Zeile 4: im Array an der Stelle index+1 wird irgend ein Speicher reserviert, aber das verstehe ich auch nicht so ganz :)

Könntest du mir das vielleicht ein wenig erklären? Das wäre sehr nett. Ich habe schonmal mit malloc gearbeitet, aber irgendwie verstehe ich es trotzdem nicht :)

Trotzdem Danke für die schnelle Antwort :)
 
Hi

der main-Teil passt grundsätzlich schonmal.
In der Funktion ist aber das Problem, dass der Compiler beim Zugriff mit[...][...] auf die Elemente wissen müsste, wieviel Elemente eine "Zeile" des 2dim-Arrays hat. Du gibst die Größen zwar als int mit, das hilft dem Compiler aber nichts. Und aus dem Typ int** wird er auch nicht schlauer (der Typ ist sowieso hier ein wenig...seltsam).

Lösung:
Ich nehm die Variablennamen aus deiner Funktion, du willst also das Element [i][b] haben, wenn es insgesamt [x][y] groß ist.
Mach zuerst einen eindim. Pointer:
C++:
int *p;
p=(int *)array;
Dann greifst du statt mit
C++:
array[i][b]
so auf ein Element zu:
C++:
p[i*y+b]

Gruß
 
@sheel: Also kommt das alles in die Funktion? Weil dann verstehe ich das erste Beispiel nicht :)

Code:
int *p;
p=(int *)array;
 
Beispiel, ein 2dim-Array mit Größe [3][4], gefüllt mit irgendwelchen Zahlen:
Code:
    0   1   2   3
0  00  01  02  03
1  10  11  12  13
2  20  21  22  23
Im Speicher ist das ja nicht wirklich in Tabellenform, sondern eher so:
Code:
00 01 02 03 10 11 12 13 20 21 22 23
Also die einzelnen Zeilen sind hintereinander.
Das Ganze könnte man so auch als eindim. Array betrachten, was es in Wirklichkeit ja auch ist

Wenn du jetzt auf den Index [1][2] zugreifst (Wert 12), rechnet der Compiler das zu einem Index des eindim.Arrays um. 12 ist dort auf [6].
Umgerechnet wird das [a][b]->[i] bei einem 2dim. Array mit Gesamtgröße [x][y] so: i=a*y+b
Gesamtgröße ist hier [3][4], du willst den Index von [1][2], =1*4+2=6.
Um die "Koordinaten" also umzurechnen, muss die Gesamtgröße des 2dim. Arrays bekannt sein.

Das Problem an deiner Funktion ist: Du übergibst das Array als int**
int** hat keine Infos, wie hoch/breit das Array ist. Deshalb kannst du nicht mit [1][2] auf den Wert 12 zugreifen, weil der Compiler das ohne Größeninfo nicht auf [6] umrechnen kann.
Das du die Größen als ints mitübergibst, erkennt der Compiler dabei nicht. Für den zählt nur das int**

Deshalb mein Vorschlag: zuerst so tun, als wäre alles ein eindim. Array (was du mit dem ersten Codestück erreichst), und dann in den eckigen Klammern die Umrechnung selbst vornehmen,

Gruß
 
Entschuldigung, aber ich muss nocheinmal nachfragen :D wenn ich o tun soll als ob ich ein ein-dim array hätte, soll ich dann in der main()-Funktion ein ein-dim array anlegen?
 
also mein Programm sieht nun so aus:

Code:
#include <stdio.h>
#include <stdlib.h>

void arrEingabe(int array[], int x, int y){
  int i,b;
  int *p = (int *)array;

  for(i = 0; i < x; i++) {
    for(b = 0; b < y; b++) {
      printf("Zahl [%d][%d]: ",i,b);
      scanf("%d",p[i*y+b]);
    }
  }
}

int main(void) {
  int x,y;

  printf("Zahl x: ");
  scanf("%d",&x);
  printf("Zahl y: ");
  scanf("%d",&y);

  int array[x][y];

  arrEingabe(array,x,y);

  return EXIT_SUCCESS;
}

Doch nach der 2. Eingabe funktioniert das Programm nicht mehr. :( Was ist falsch?
 
Zurück