Mehrdimensionales array an funktion übergeben (C)

Gast #4395633
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
#4395926
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.
#4395988
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?
Gast #4396002
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)
#4396057
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.
#4396059
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.
Gast #4396373
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.