Forum: Mikrocontroller und Digitale Elektronik arrays und struct in funktionen


von Tobias N. (silberkristall)


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.

von Uwe (Gast)


Lesenswert?

Hallo Tobias,

Zeiger auf einen Datenbereich ist nicht unüblich !
Man kann sich etwas Scheibarbeit durch geschickte MACRO Definitionen 
sparen.

Aber sonst, eher weniger.

von Tobias N. (silberkristall)


Lesenswert?

Nunja, nur so einen aufruf wie

writeallledcolor(100,100,100,&r, &g, &b);

will ich ja vermeiden.

Also klar das C nicht/nur schwer mit anderen Sprachen vergleichbar ist. 
Aber bei PHP z.b. würde das so ohne Probleme funktionieren.

Also da auf ein Array innerhalb einer funktion zuzugreifen ist standart.

von holger (Gast)


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.

von Easylife (Gast)


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?

von Tobias N. (silberkristall)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Easylife (Gast)


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

von Tobias N. (silberkristall)


Lesenswert?

Nein. Ich habe das alles in die c und h datei der Lightweight lib 
geschrieben wo auch alle anderen Funktionen der lib sind.

von holger (Gast)


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.

von Tobias N. (silberkristall)


Lesenswert?

Ok, moment.

von Tobias N. (silberkristall)


Angehängte Dateien:

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.

von holger (Gast)


Lesenswert?

>Das ist jetzt das gesamte programm was zurzeit läuft.

Und was soll man jetzt damit? Ich will das beschissene
Programm das NICHT läuft. Und bitte als ZIP
und nicht alle einzeln.

von Easylife (Gast)


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
(...)

von Nop (Gast)


Lesenswert?

Mir fehlt irgendwie ein typedef der struct...

von Tobias N. (silberkristall)


Lesenswert?

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

von holger (Gast)


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?

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.