Zugriff auf Strukturen

Gast #4343378
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?
Gast
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.
Gast
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?
Gast
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
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.