Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Strukturen


von Simon (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zu struct Arrays in C.
Anhand des Buches welches ich vorliegen hab,
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_006.htm#mj558e0e4fc0892fc3f91cd810f7c07860
wird bereits geschrieben, wie auf ein struct Array zugegriffen wird. Nun 
stehe ich aber vor einem kleinen Problem, und weiß nicht so recht wie 
ich es lösen soll.
1
#define NUM_INDEX 10
2
struct index {
3
   uint8_t val1;
4
   uint8_t val2;
5
} lib[NUM_INDEX];
6
7
void foo(struct index *test, uint8_t numStruct, uint8_t col)
8
{
9
for(uint8_t i = 0; i < numStruct; i++)
10
put(test[i][col]); // <-----
11
}
12
13
int main(void)
14
{
15
foo(lib, NUM_INDEX, 1);
16
}



Es geht mir um die Variablen Zugriff auf diese Struktur. Es soll von 
aussen bestimmt werden, auf welches Element von index zugegriffen werden 
soll.

Entwerder val1 oder val2.

Kann man das irgendwie flexibel lösen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Simon schrieb:
> put(test[i][col]); // <-----

Was soll "col" sein? test ist ein eindimensionales Array.

von Simon (Gast)


Lesenswert?

Ich möchte über eine Variable von aussen entscheiden, wie ich auf das 
struct zu greife.


Ist eine Variable 0,
soll test[i].val1 abgefragt werden
ist eine Variable 1,
soll test[i].val2 abgefragt werden.

Ich könnte es mit einem switch/if/... etc lösen, aber da wird das ganze 
Programm recht lang mit.

von Klaus (Gast)


Lesenswert?

Simon schrieb:
> Ich möchte ...

Nun gut. Es gibt aber, wie Dein C-Buch eigentlich auch beschreiben 
sollte, genau eine (portable und standardkonforme) Methode auf 
Strukturmitglieder zuzugreifen. Und die setzt die Verwendung des 
'.'-Operators (bzw. "->") voraus.

Wenn Du nun beim schreiben, darauf stösst, das Du in einem Array noch 
eine Variable namens ""col" benötigst - was vermutlich "column" bedeuten 
soll, dann ist das ein Hinweis, dass Du eigentlich ein zweidimensionales 
Array brauchst.

Warum machst Du das nicht so?

von public (Gast)


Lesenswert?

Hallo,

du könntest standardmäßig ja immer Variable 1 zurückgeben und nur bei 
Änderung eines "Zustands" auf Variable 2 wechseln, direkt im Anschluss 
musst du wieder zurückwechseln. Ähm und wenn mich nicht alles täuscht 
nennt sich soetwas dann FLAG ;)

Aber eigentlich sieht dein Link ziemlich gut aus, da solltest du alle 
Antworten finden.

Als alternative solltest du mal darüber nachdenken ob du dir dein 
vorhaben nicht mal aufschreibst/zeichnest, evtl. kommst du dann selber 
drauf.

beste grüße
public

von Daniel A. (daniel-a)


Lesenswert?

1
#define NUM_INDEX 10
2
struct index {
3
   union {
4
     uint8_t val[1];
5
     struct {
6
       uint8_t val1;
7
       uint8_t val2;
8
     };
9
  };
10
} lib[NUM_INDEX];
11
12
void foo(struct index *test, uint8_t numStruct, uint8_t col)
13
{
14
for(uint8_t i = 0; i < numStruct; i++)
15
put(test[i].val[col]); // <-----
16
}
17
18
int main(void)
19
{
20
foo(lib, NUM_INDEX, 1);
21
}
Das mit der union ist dann zwar nicht ganz definiert, aber der Syntax 
müsste c11 konform sein.

von public (Gast)


Lesenswert?

Daniel A. schrieb:
> #define NUM_INDEX 10
> struct index {
>    union {
>      uint8_t val[1];
>      struct {
>        uint8_t val1;
>        uint8_t val2;
>      };
>   };
> } lib[NUM_INDEX];

Oha jetzt wird mir ganz warm ums Herz, nee wirklich sieht gut aus ;)

Natürlich Quatsch mit Soße! Software ist auch "nur" ein Stück Technik, 
also genau überlegen was du willst und danach handeln.

beste grüße
public

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.