Forum: Compiler & IDEs struct als array an funktion übergeben.


von Mathias G. (motze)


Lesenswert?

hallo liebe Gemeinde,

ich möchte gerne ein struct an einer Funktion übergeben. Leider 
funktioniert das nicht so wie geplant
1
struct LED
2
{
3
  uint8_t gruen;
4
  uint8_t rot;
5
  uint8_t blau;
6
};
7
8
struct LED led[60];
1
void output_send_led(struct LED _led[], uint8_t _anzahl_led)
2
{
3
  uint8_t i;
4
  uint8_t a;
5
  
6
  for (a = 0; a < _anzahl_led; a++)
7
  {
8
    for (i = 0; i < 8; i++)
9
    {
10
      if(_led[a].gruen & 0x80)
11
      {
12
        output_eins();
13
      }
14
      else
15
      {
16
        output_null();
17
      }
18
      _led[a].gruen<<=1;
19
    }
20
    
21
    for (i = 0; i < 8; i++)
22
    {
23
      if(_led[a].rot & 0x80)
24
      {
25
        output_eins();
26
      }
27
      else
28
      {
29
        output_null();
30
      }
31
      _led[a].rot<<=1;
32
    }
33
    
34
    for (i = 0; i < 8; i++)
35
    {
36
      if(_led[a].blau & 0x80)
37
      {
38
        output_eins();
39
      }
40
      else
41
      {
42
        output_null();
43
      }
44
      _led[a].blau<<=1;
45
    }
46
  }
47
}
48
49
int main(void)
50
{
51
  DDRC |= (1<<PC0);
52
  
53
  led[2].blau = 0xFF;
54
  led[2].rot = 0xFF;
55
  led[2].gruen = 0xFF;
56
  
57
    while(1)
58
    {
59
    output_send_led(led, 10);
60
    output_reset();
61
    }
62
}

vielen dank für eure Hilfe.

von Falk B. (falk)


Lesenswert?

@ Mathias G. (motze)

>ich möchte gerne ein struct an einer Funktion übergeben. Leider
>funktioniert das nicht so wie geplant.

Kann man machen, ist aber eher unüblich. Solche großen Massen an Daten 
will man nicht kopieren, sondern übergibt Zeiger.

Da fehlt wohl ein typedef. Eher so.
1
typedef struct
2
{
3
  uint8_t gruen;
4
  uint8_t rot;
5
  uint8_t blau;
6
} LED_t;
7
8
LED_t led[60];
9
10
void output_send_led(LED_t *_led, uint8_t _anzahl_led)
11
{
12
  uint8_t i;
13
  uint8_t a;
14
  
15
  for (a = 0; a < _anzahl_led; a++)
16
  {
17
    for (i = 0; i < 8; i++)
18
    {
19
      if(_led[a].gruen & 0x80)
20
      {
21
        output_eins();
22
      }
23
      else
24
      {
25
        output_null();
26
      }
27
      _led[a].gruen<<=1;
28
    }
29
    
30
    for (i = 0; i < 8; i++)
31
    {
32
      if(_led[a].rot & 0x80)
33
      {
34
        output_eins();
35
      }
36
      else
37
      {
38
        output_null();
39
      }
40
      _led[a].rot<<=1;
41
    }
42
    
43
    for (i = 0; i < 8; i++)
44
    {
45
      if(_led[a].blau & 0x80)
46
      {
47
        output_eins();
48
      }
49
      else
50
      {
51
        output_null();
52
      }
53
      _led[a].blau<<=1;
54
    }
55
  }
56
}
57
58
int main(void)
59
{
60
  DDRC |= (1<<PC0);
61
  
62
  led[2].blau = 0xFF;
63
  led[2].rot = 0xFF;
64
  led[2].gruen = 0xFF;
65
  
66
    while(1)
67
    {
68
    output_send_led(led, 10);
69
    output_reset();
70
    }
71
}

von Mathias G. (motze)


Lesenswert?

erstmal ganz herzlichen dank für deine Hilfe leider bekomme ich noch 
eine Fehlermeldung:

array type has incomplete element type

was möchte mir den der Compiler damit sagen?

von Falk B. (falk)


Lesenswert?

Möglicherweise fehlt da ein

#include <stdint.h>

von Mathias G. (motze)


Lesenswert?

nein leider nicht die Fehlermeldung bleibt die gleiche.

von Falk B. (falk)


Lesenswert?

Dann sind die Dinge oben im Quelltext nicht so in deinem ECHTEN 
Quelltext, sondern in anderer Reihenfolge oder verteilt auf Dateien?

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Irgendwas in diese Richtung wird es aber sein!

OT: wie kommt man eigentlich auf die Idee, irgend einen Namen mit 
Unterstrich[en] am Anfang zu versehen? Lass das...

von Mathias G. (motze)


Lesenswert?

erstmal danke für eure Antwort. Ihr hattet recht es war nicht richtig in 
Quelltext. Jetzt wird es ohne Fehler Compiliert.

vielen dank dafür

von Mathias G. (motze)


Lesenswert?

jetzt habe ich leider ein anderes Problem der folgende Code Funktioniert 
genau einmal danach nicht mehr woran kann das den liegen?
1
void output_reset()
2
{
3
  _delay_us(60);
4
}
5
6
void output_alle(uint8_t _led[])
7
{
8
  uint8_t i;
9
  uint8_t k;
10
  
11
  for (i = 0; i < 180; i++)
12
  {  
13
    for (k = 0; k < 8; k++)
14
    {
15
      if(_led[i] & 0x80)
16
      {
17
        output_eins();
18
      }
19
      else
20
      {
21
        output_null();
22
      }
23
      _led[i]<<=1;  
24
    }
25
  }
26
}
27
28
uint8_t Led_60[180] =
29
{
30
  0x00, 0xFF, 0xFF, //1
31
  0x00, 0xFF, 0xFF, //2
32
  0x00, 0xFF, 0xFF, //3
33
  0x00, 0xFF, 0xFF, //4
34
  0x00, 0xFF, 0xFF, //5
35
  0x00, 0xFF, 0xFF, //6
36
  0x00, 0xFF, 0xFF, //7
37
  0x00, 0xFF, 0xFF, //8
38
  0x00, 0xFF, 0xFF, //9
39
  0x00, 0xFF, 0xFF, //10
40
  
41
  0xFF, 0xFF, 0x00, //11
42
  0xFF, 0xFF, 0x00, //12
43
  0xFF, 0xFF, 0x00, //13
44
  0xFF, 0xFF, 0x00, //14
45
  0xFF, 0xFF, 0x00, //15
46
  0xFF, 0xFF, 0x00, //16
47
  0xFF, 0xFF, 0x00, //17
48
  0xFF, 0xFF, 0x00, //18
49
  0xFF, 0xFF, 0x00, //19
50
  0xFF, 0xFF, 0x00, //20
51
  
52
  0xFF, 0xFF, 0xFF, //21
53
  0xFF, 0xFF, 0xFF, //22
54
  0xFF, 0xFF, 0xFF, //23
55
  0xFF, 0xFF, 0xFF, //24
56
  0xFF, 0xFF, 0xFF, //25
57
  0xFF, 0xFF, 0xFF, //26
58
  0xFF, 0xFF, 0xFF, //27
59
  0xFF, 0xFF, 0xFF, //28
60
  0xFF, 0xFF, 0xFF, //29
61
  0xFF, 0xFF, 0xFF, //30
62
    
63
  0xFF, 0xFF, 0xFF, //31
64
  0xFF, 0xFF, 0xFF, //32
65
  0xFF, 0xFF, 0xFF, //33
66
  0xFF, 0xFF, 0xFF, //34
67
  0xFF, 0xFF, 0xFF, //35
68
  0xFF, 0xFF, 0xFF, //36
69
  0xFF, 0xFF, 0xFF, //37
70
  0xFF, 0xFF, 0xFF, //38
71
  0xFF, 0xFF, 0xFF, //39
72
  0xFF, 0xFF, 0xFF, //40
73
  
74
  0xFF, 0xFF, 0xFF, //41
75
  0xFF, 0xFF, 0xFF, //42
76
  0xFF, 0xFF, 0xFF, //43
77
  0xFF, 0xFF, 0xFF, //44
78
  0xFF, 0xFF, 0xFF, //45
79
  0xFF, 0xFF, 0xFF, //46
80
  0xFF, 0xFF, 0xFF, //47
81
  0xFF, 0xFF, 0xFF, //48
82
  0xFF, 0xFF, 0xFF, //49
83
  0xFF, 0xFF, 0xFF, //50
84
  
85
  0xFF, 0xFF, 0xFF, //51
86
  0xFF, 0xFF, 0xFF, //52
87
  0xFF, 0xFF, 0xFF, //53
88
  0xFF, 0xFF, 0xFF, //54
89
  0xFF, 0xFF, 0xFF, //55
90
  0xFF, 0xFF, 0xFF, //56
91
  0xFF, 0xFF, 0xFF, //57
92
  0xFF, 0xFF, 0xFF, //58
93
  0xFF, 0xFF, 0xFF, //59
94
  0x00, 0xFF, 0x00 //60  
95
};
96
97
int main(void)
98
{  
99
  DDRC |= (1<<PC0);
100
  
101
    while(1)
102
    {
103
    output_alle(Led_60);
104
    output_reset();
105
    _delay_ms(5000);
106
    }
107
}

ich weiß das mit den unterstrichen ist doof ich werde es mir auch 
abgewöhnen.

Also die Leds leuchten genau 5 Sekunden auf und danach geht nix mehr.
Output_reset hat bei anderen Sachen immer hingehauen mit Timing.

vielen dank schonmal

von foobar (Gast)


Lesenswert?

> Also die Leds leuchten genau 5 Sekunden auf und danach geht nix mehr.
1
>     _led[i]<<=1;

Kein Wunder, nach einem Durchlauf von output_alle sind alle Werte in 
deinem led-Array 0.

Wenn du die Werte erhalten möchtest:
1
void output_alle(uint8_t led[])
2
{
3
    uint8_t i, k;
4
5
    for (i = 0; i < 180; i++)
6
        for (k = 0x80; k; k >>= 1)
7
            if(led[i] & k)
8
                output_eins();
9
            else
10
                output_null();
11
}

von (prx) A. K. (prx)


Lesenswert?

Falk Brunner schrieb:
> Solche großen Massen an Daten
> will man nicht kopieren, sondern übergibt Zeiger.

Genau das tut er. Es gibt in C keine Array-Übergabe per Wert, nur per 
Referenz. Sein

> void output_send_led(LED_t _led[], uint8_t _anzahl_led)

ist nur eine andere Schreibweise von deinem

> void output_send_led(LED_t *_led, uint8_t _anzahl_led)

von (prx) A. K. (prx)


Lesenswert?

Falk Brunner schrieb:
> Da fehlt wohl ein typedef. Eher so.

Ob man
  struct LED { ... }
schreibt und im weiteren Code stets
  struct LED
verwendet, oder erst
  typedef struct { ... } LED
und dann dafür
  LED
ist gleich. Seine Variante wirkt nur etwas altbacken. Man kann auch
  typedef struct LED { ... } LED
schreiben, und dann beides verwenden.

von Falk B. (falk)


Lesenswert?

@ A. K. (prx)


>ist nur eine andere Schreibweise von deinem

>> void output_send_led(LED_t *_led, uint8_t _anzahl_led)

Hmm, stimmt. Es war schon zu spät.

von Mathias G. (motze)


Lesenswert?

Vielen dank für die Hilfe jetzt geht es so wie ich es will. Manchmal ist 
man echt blind. Klar wenn ich die alle Rausschifte das nur noch nullen 
übrig geblieben sind.

vielen dank nochmal.

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.