Forum: Mikrocontroller und Digitale Elektronik Mehrdimensionales array an funktion übergeben (C)


von T. (Gast)


Lesenswert?

Hi,
ich bin noch relativ unerfahren mit C
Ich möchte ein mehrdimensionales Array an eine Funktion übergeben. Habe 
hierzu auch recht viel im Internet gefunden und mein funtkionsaufruf 
funktioniert zwar, aber der Compiler spuckt ne Warnung aus. Wie bekomme 
ich diese weg, oder vorallem Wieso kommt sie und wieso funtkioniert es 
trotzdem?
1
uint8_t change[8][8][8];
2
3
4
void get_spi_data(uint8_t data[][8][8]){
5
FUNKTION
6
}
7
8
9
main(){
10
11
...
12
get_spi_data(change);
13
...
14
15
}

Compiler sagt:

Warning    passing argument 1 of 'get_spi_data' from incompatible 
pointer type

: Verschoben durch User
von B. S. (bestucki)


Lesenswert?

Dein Code erzeugt bei mir keine derartige Warnung. Könnte es sein, dass 
dein Array volatile ist?

von array isn 't pointer (Gast)


Lesenswert?

> void get_spi_data(uint8_t data[][8][8])

...get_spi_data(uint8_t data[8][8][8])

...get_spi_data(uinti_t *data)

von B. S. (bestucki)


Lesenswert?

array isn 't pointer schrieb:
> ...get_spi_data(uint8_t data[8][8][8])
>
> ...get_spi_data(uinti_t *data)

Was möchtest du uns damit sagen? Dass Arrays keine Zeiger sind, wissen 
wir. Falls du glaubst, zweimal das Gleiche hingeschrieben zu haben, muss 
ich dich enttäuschen.

Gut wäre, wenn sich der TO wieder melden und etwas Infromationen 
dalassen könnte. Momentan ist weder Compiler noch sonstwas bekannt. 
Nichteinmal, ob die Warnung wirklich im gezeigten Codeausschnitt ist.

: Bearbeitet durch User
von array isn 't pointer (Gast)


Lesenswert?

Beide Zugriffe funktionieren und sind zulässig. Und das unabhängig vom 
Compiler. Ist hält so, Stück. ;-)

von B. S. (bestucki)


Lesenswert?

array isn 't pointer schrieb:
> Beide Zugriffe funktionieren und sind zulässig. Und das unabhängig vom
> Compiler.

Na klar funktionierts, das Gleiche ist es trotzdem nicht. Einmal 
erwartet die Funktion
1
uint8_t (*)[8][8]
und das andere mal
1
uint8_t *
Einmal sieht der Funktionsaufruf so aus
1
get_spi_data(change);
und das andere Mal
1
get_spi_data(change[0][0]);
Edit: Aussdem kannst du das Array nicht mehr über data[0][0][0] 
ansprechen, die musst die Zugriffe manuell berechnen. Spielt natürlich 
keine Rolle, wenn man so oder so linear auf die Daten zugreifen muss.

array isn 't pointer schrieb:
> Ist hält so, Stück. ;-)

Hast du mich als Stück bezeichnet?

: Bearbeitet durch User
von array isn 't pointer (Gast)


Lesenswert?

Beides funktioniert, ja? Dann sind wir uns in der Sache einig.

Wo schrieb ich, dass die beiden Varianten das Gleiche sind? Du hast den 
Nick doch richtig gedeutet???

Ist halt so Stucki. (im anderen Post hat die Androide Eingabehilfe 
zugeschlagen)

von Rolf M. (rmagnus)


Lesenswert?

array isn 't pointer schrieb:
> Beides funktioniert, ja?

Das erste funktioniert, ist aber exakt das gleiche, wie der TE 
hingeschrieben hat. Die zusätzliche 8 wird vom Compiler ignoriert.
Das zweite ist einfach nur falsch, da der Typ nicht stimmt.

> Wo schrieb ich, dass die beiden Varianten das Gleiche sind?

Sie sind nicht nur nicht gleich, sondern auch nicht austauschbar.

Die Definition im ursprünglichen Code sieht für mich richtig aus und 
gibt beim gcc auch mit meinen üblichen Warneinstellungen (-std=c99 
-pedantic -Wall -Wextra) keine Warnung. Ich vermute stark, dass hier mal 
wieder nicht der echte Code, sondern was anderes extra für's Posting 
aufbereitet wurde, das den eigentlichen Fehler gar nicht enthält.

von B. S. (bestucki)


Lesenswert?

array isn 't pointer schrieb:
> Wo schrieb ich, dass die beiden Varianten das Gleiche sind?

Nirgends. Ich wusste nur nicht, was du uns mit deinem ersten Post sagen 
willst. Der Code vom TO erzeugt die Warnung nicht, eine Änderung auf 
deine zweite Funktionssignatur würde genau diese Warnung hervorrufen. 
Deswegen die Nachfrage.


array isn 't pointer schrieb:
> Ist halt so Stucki. (im anderen Post hat die Androide Eingabehilfe
> zugeschlagen)

Kein Problem, deswegen hab ich nachgefragt.

von T. (Gast)


Lesenswert?

Hey,
fuck sorry, ihr habt recht -.- ich hab n fehler beim posting.

die Variable ist als volatile deklariert.
Compiler ich glaube gnu c99 ?! (Atmel Studio 7, code ist für ein Cortex 
M7 (SamV71) )

Wie gesagt, bin ziemlich neu in C und nehme Verbesserungsvorschläge 
gerne an!

hier der original code:
1
//var
2
volatile uint8_t LedCube[8][8][8];  //[x][y][z]
3
4
//prototype
5
void get_spi_cube_data(uint8_t led_cube_data[][8][8]);
6
7
8
9
Aufruf in main:
10
11
get_spi_cube_data(LedCube);
12
13
14
15
16
//Funktion
17
void get_spi_cube_data(uint8_t led_cube_data[][8][8]){
18
  uint8_t x, y, z =0;
19
  uint8_t yl = 8;  //for layer (y=0 - yl=7; y=1 - yl=6; .. ; y=7 - yl=0) hardware'problem'
20
  uint8_t instance=0;
21
  uint8_t led_cube_data_copy[8][8][8];  
22
23
  for (instance = 0; instance < 31; instance++){
24
    yl = 8;
25
    for (y=0; y<8; y++){
26
      yl = yl - 1;
27
      spi_data[instance][yl]=0;
28
      for (x=0; x<8; x++){
29
        for (z=0; z<8; z++){
30
          led_cube_data_copy[x][y][z] = led_cube_data[x][y][z];    //copying led cube data
31
          if (led_cube_data_copy[x][y][z]>0){
32
            led_cube_data_copy[x][y][z] = led_cube_data_copy[x][y][z] - 1;  //Lower LEDcounter by one
33
            spi_data[instance][yl] |= (1 << (x+(z*8)));      //set according LED in Layer
34
            //layer[y] set x and z leds
35
          }
36
        }
37
      }
38
    }
39
  }
40
}

von Rolf M. (rmagnus)


Lesenswert?

T. schrieb:
> //var
> volatile uint8_t LedCube[8][8][8];  //[x][y][z]
>
> //prototype
> void get_spi_cube_data(uint8_t led_cube_data[][8][8]);

Dann ist es ja kein Wunder. Wenn deine Variable volatile ist, musst du 
auch den Parameter volatile machen.

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.
Lade...