Mehrdimensionales Array als Funktion zurückgeben

OP #2670059
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|
#2670083
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.
Gast #2764690
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ß
Moderator #2764702
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren