Forum: PC-Programmierung Mehrdimensionales Array als Funktion zurückgeben


von Mathias K. (underworldgamer)


Lesenswert?

Hallo Leute ich habe da ein kleines Problem mit mehrdimensionalen Array 
und Rückgabe durch eine Funktion.

Vielleicht könnt ihr mir weiterhelfen.

anbei der Code

mfg Mathias
1
#include <stdio.h>
2
3
int *caffeine(int *array1,int *array2,int size);
4
5
void main()
6
{
7
    int joe[2][2] = { {9, 8},{3,3}};
8
    int java[2][2] = { {9, 8},{3,3}};
9
    int *coffee;
10
11
    coffee = caffeine(joe,java,2);
12
13
      
14
}
15
16
17
int *caffeine(int *array1,int *array2,int size)
18
{
19
    int static total[2][2];
20
    int x;
21
22
    for(x=0;x<2;x++)
23
            total[x][x]=array1[x][x]+array2[x][x];
24
25
    return(total);
26
}

mit der Fehlermeldung

subscripted value is neither array nor pointer|

von Karl H. (kbuchegg)


Lesenswert?

Mathias K. schrieb:

beantworte mal ganz schnell die Frage:
Wie soll der Compiler ausrechnen, der weivielte int, vom Beginn des 
Arrays aus gerechnet, denn array1[x][x] sein soll, wenn alles was er hat 
die Startadresse des Arrays ist.

Auch ein 2D Array muss im Speicher abgebildet werden, indem die Elemente 
alle hintereinander liegen

   2D Array (konzeptionell)  3 Spalten, 2 Zeilen

     0   1   2
   +---+---+---+
0  | a | b | c |
   +---+---+---+
1  | d | e | f |
   +---+---+---+


  dasselbe Array im Speicher

  +---+---+---+---+---+---+
  | a | b | c | d | e | f |
  +---+---+---+---+---+---+


um zu berechnen, dass das Element in Zeile 1, Spalte 0 (also 'd') das 4. 
Element ab Beginn des Arrays ist, muss der Compiler die Anzahl Spalten 
pro Zeile kennen (in diesem Fall sind es 3 Spalten).

  Adresse des Elements = Startadresse +
                         gewünschte_Zeile * Anzahl_Spalten +
                         gewünschte_Spalte

Die Anzahl der Spalten muss bekannt sein, sonst kann man die Position 
nicht ausrechnen.

Du gibst ihm aber nur einen Pointer. Das reicht für den 1D Fall, aber 
nicht für 2D. Auch ein Compiler kann nicht zaubern.
1
... caffeine(int array1[2][2], int array2[2][2])
2
{
3
  ...
4
}


und für den Returnwert musst du dir sowieso was anderes ausdenken. 
Arrays kann man nicht als Ganzes zuweisen und daher kann man sie auch 
nicht als ganzes aus einer Funktion heraus als Returnwert übergeben. 
Denn dazu müsste ein Array zuweisbar sein

     coffee = func( ... )

was sie aber nicht sind.

von Yalman (Gast)


Lesenswert?

Hallo,

du musst mit einem Zeiger auf Zeiger auf int als "formaler Parameter" 
(der Parameter in deiner Caffein-Funktion) arbeiten.

caffeine(int **zgrzgr1, int **zgrzgr2, int size) { }

durch das erste dereferenzieren *(zgrzgr+i) erhaelst du die Zeile i,und 
durch das zweite dereferenzieren *(*(zgrzgr+i)+j) erhälst du die
Spalte j mit dem int Wert A(i,j)=X.

Gruß

von Yalu X. (yalu) (Moderator)


Lesenswert?

Yalman schrieb:
> du musst mit einem Zeiger auf Zeiger auf int als "formaler Parameter"
> (der Parameter in deiner Caffein-Funktion) arbeiten.
>
> caffeine(int **zgrzgr1, int **zgrzgr2, int size) { }

Das ist aber wieder etwas anderes: Jetzt erwartet die Funktion einen
Zeiger auf einen Zeiger bzw. ein Array von Zeigern. Der Aufruf
1
    coffee = caffeine(joe,java,2);

liefert aber weder das eine noch das andere.

Richtig ist der Vorschlag von Karl Heinz:
1
... caffeine(int array1[2][2], int array2[2][2])

Der Typ des Rückgabewerts und der Variable coffee muss natürlich auch
noch korrigiert werden. Da C-Funktionen keine Arrays zurückgeben können,
nimmt man stattdessen einen Zeiger auf eine Zeile des zweidimensionalen
Arrays, der den Typ (*)[2] hat und wie ein zweidimensionales Array
benutzt werden kann. Hier ist das komplette Programm:
1
#include <stdio.h>
2
3
int (*caffeine(int array1[2][2], int array2[2][2]))[2];
4
5
int main()
6
{
7
    int joe[2][2]  = {{9, 8}, {3,3}};
8
    int java[2][2] = {{9, 8}, {3,3}};
9
    int (*coffee)[2];
10
11
    coffee = caffeine(joe, java);
12
    printf("%2d %2d\n%2d %2d\n",
13
            coffee[0][0], coffee[0][1], coffee[1][0], coffee[1][1]);
14
15
    return 0;
16
}
17
18
int (*caffeine(int array1[2][2], int array2[2][2]))[2]
19
{
20
    int static total[2][2];
21
    int x;
22
23
    for(x=0; x<2; x++)
24
        total[x][x]=array1[x][x]+array2[x][x];
25
26
    return total;
27
}

von DirkB (Gast)


Lesenswert?

In diesem Fall (kleines Array) kann man das Array auch in einer struct 
verstecken.

Denn structs kann man direkt zuweisen und auch als Rückgabeparameter 
benutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.