arrays und struct in funktionen

OP #3888028
Lesenswert?

Hallo,

wie kriege ich die Inhalte von struct und arrays innerhalb einer 
funktion möglichst unumständlich geändert!?

Als beispiel wollte ich für meine LEDs (ws2812b) die Lightweight Library 
verwenden. Meine eigene Lib läuft zwar aber nicht so schön ;)

Soweit so gut. Nun da ich es gerne "einfach" habe wollte ich die Lib um 
eine weitere Funktion erweitern.

In der Lib wird folgendes genutzt:
1
struct CRGB { uint8_t g; uint8_t r; uint8_t b; };
2
struct CRGB led[255];

Nun lässt sich das ganze ja wie folgt bearbeiten:
1
led[1].r = 100;
2
led[1].g = 100;
3
led[1].b = 100;

Soweit sogut. Das ist mir aber zu umständlich. Ich hätte gerne zwei 
weitere Funktionen wie folgt:
1
#define LEDANZAHL 255
2

3
struct CRGB { uint8_t g; uint8_t r; uint8_t b; };
4
struct CRGB led[LEDANZAHL];
5

6
// Und nun folgende Funktionen:
7

8

9
// Einmal für eine LED
10

11
void writeoneledcolor(int lednummer, int rot, int gruen, int blau)
12
{
13

14
lednummer--;
15

16
led[lednummer].r = 100;
17
led[lednummer].g = 100;
18
led[lednummer].b = 100;
19
}
20

21
// Und für alle LEDs
22

23
void writeallledcolor(int rot, int gruen, int blau)
24
{
25
   for (i=0; i<LEDANZAHL; i++)
26
   {
27
      led[i].r = rot;
28
      led[i].g = gruen;
29
      led[i].b = blau;
30
   }
31
}

Nur leider will das nicht so ganz. Die Funktionen können weder auf das 
led struct/array zugreifen noch auf LEDANZAHL.

Pointer etc übergeben ist genau so blöd da man dann wieder mehr angeben 
muss. Es muss doch eine Möglichkeit geben das ganze so umzusetzen.

Danke euch.
Gast #3888053
Lesenswert?

>Nur leider will das nicht so ganz.

Und was will da nicht? Eigentlich müsste das gehen.

Auch wenn du da ordentlich Murkskram machst.

>void writeallledcolor(int rot, int gruen, int blau)

Was soll die int Scheisse da?
In deinem struct ist alles uint8_t.
Dann mach die Parameter auch uint8_t.
Gast #3888061
Lesenswert?

Es sind halt 3 kleine Fehler drin:

- Die Deklaration von i in den Funktionen fehlt jeweils
- writeoneledcolor() setzt .r, .g, .b auf 100, 100, 100 statt auf rot, 
grün, blau

Ansonsten ist alles korrekt und funktioniert auch.
Die Funktionen können auf das globale Array zugreifen.
Was funktioniert denn bei dir nicht?
Persönliche Seite #3888072
Lesenswert?

Tobias N. schrieb:
> Wenn ich das so compilieren will dann mekkert er rum das led in der
> funktion nicht deklariert ist und sowas

"Er" meckert, weil Du die Dinge, die Du da verwenden willst, 
irgendwoanders deklariert haben wirst. Und wo hast Du das?

In irgendeiner anderen Quelltextdatei, richtig?

Die Themen wo deklariert man Dinge und wie funktionieren include - 
Dateien haben wir hier praktisch jede Woche.
Gast #3888075
Lesenswert?

Beweis:
1
#include <stdio.h>
2
typedef unsigned char uint8_t;
3

4
#define LEDANZAHL 255
5

6
struct CRGB { uint8_t g; uint8_t r; uint8_t b; };
7
struct CRGB led[LEDANZAHL];
8

9
// Und nun folgende Funktionen:
10
// Einmal für eine LED
11

12
void writeoneledcolor(uint8_t lednummer, uint8_t rot, uint8_t gruen, uint8_t blau)
13
{
14
  int i;
15
  lednummer--;
16
  
17
  led[lednummer].r = rot;
18
  led[lednummer].g = gruen;
19
  led[lednummer].b = blau;
20
}
21

22
// Und für alle LEDs
23

24
void writeallledcolor(uint8_t rot, uint8_t gruen, uint8_t blau)
25
{
26
  int i;
27
  for (i=0; i<LEDANZAHL; i++)
28
  {
29
    led[i].r = rot;
30
    led[i].g = gruen;
31
    led[i].b = blau;
32
  }
33
}
34

35
int main()
36
{
37
  int i;
38
  writeallledcolor(1,2,3);
39
  writeoneledcolor(2,100,150,200);
40

41
  for(i=0; i<5; i++) 
42
  {
43
    printf("%d: %d, %d, %d\n", i, led[i].r, led[i].g, led[i].b);
44
  }
45
}

Ausgabe:
1
0: 1, 2, 3
2
1: 100, 150, 200
3
2: 1, 2, 3
4
3: 1, 2, 3
5
4: 1, 2, 3
Gast #3888079
Lesenswert?

>Wenn ich das so compilieren will dann mekkert er rum das led in der
>funktion nicht deklariert ist und sowas

Kompletten Sourcecode zeigen. Und zwar das gesamte Projekt.
Sonst reden sich hier wieder viele den Mund fusselig.
OP #3888090
Lesenswert?

So habe ich das derzeit compiliert. Die funktionen wie oben geschrieben 
hatte ich in der lightws.c und lightws.h eingefügt und dann klappt es 
halt nicht.

Das ist jetzt das gesamte programm was zurzeit läuft.
Angehängte Dateien:
Gast #3888104
Lesenswert?

Da finde ich deine Funktionen jetzt aber nicht...
Naja,

mach einfach folgendes:

im Headerfile:
1
#define LEDANZAHL 255
2
typedef struct { uint8_t g; uint8_t r; uint8_t b; } CRGB_t;

in der Quelle, in der du das Array beschreiben/lesen willst:
1
#include "header.h"
2
(...)
3
CRGB_t led[LEDANZAHL];
4
(...)
Gast #3888130
Lesenswert?

>Ich hatte die Funktionen wie oben in die lightws.c/h geschrieben und
>dann versucht in der main.c aufzurufen

Dann pack mal ein

extern  struct cRGB led[];

in lightws.h. Woher soll lightws.c denn wissen das dein
Array in main.c deklariert wurde?

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