Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Strukturelement über Index+"Zweig"


von Schotter (schottre)


Lesenswert?

Hallo,

bei einer Konsolenausgabe will ich statt der Integerwerte einen 
beschreibenden Text ausgeben. Ich dachte dann dabei an ein Mapping à la
1
typedef struct {
2
  const uint8_t index;
3
  const char str[];
4
} desc_t;

Nun kann ich nicht einfach hergehen und die "Strings" der Reihe nach 
herunterschreiben, sie stehen ja noch in einem Verhältnis zueinander.
Ich dachte dann an eine "Über"Struktur
1
typedef struct {
2
  desc_t input[];
3
  desc_t output[];
4
} description_t;

Mit Leben füllen, wollte ich die Struktur dann wie folgt.
1
const description_t Desc {
2
  {
3
    { 0, "text1" },
4
    { 1, "text2" },
5
    { 2, "text3" },
6
    { 3, "text4" },
7
    { 4, "text5" },
8
  },
9
  {
10
    { 0, "blob1" },
11
    { 8, "blob8" },
12
  },
13
};

Und verwenden würde ich sie gerne so.
1
print(Desc.input[0].str);

So viel zu meinen Wünschen :) Funktionieren tut davon eher nichts. An
1
 desc_t input[];

stört sich der Compiler, weil zum Zeitpunkt der Übersetzung bekannt sein 
muss wie groß das Array ist. Hier kann ich natürlich erstmal mit
1
 desc_t *input;
 "Abhilfe" schaffen, aber wirklich schön finde ich das dann auch wieder 
nicht, denn die Speicherbereiche sollen beim Compilieren vorgesehen 
werden. Ich will nicht mit malloc() rumtun.

Weiterhin stört sich der Compiler an
1
const description_t Desc {
2
  {
3
    { 0, "text1" },

Hier warnt er mit "exess elements in scalar initializer" und das geht 
wieder in die "ich reserviere eine Adresse auf einen Speicherbereich, 
aber nicht den Speicherbereich"-Ecke.

Ich bin ja sicherlich nicht der erste, der so etwas vor hat.
Hätte da jemand was für mich? Tipps? Links? Code?^^

Danke!

: Bearbeitet durch User
von test (Gast)


Lesenswert?

wie wäre es damit?
1
#include <stdio.h>
2
3
int main()
4
{
5
    char* str[] = {"anfang", "mitte", "ende" };
6
    
7
    int idx = 1;
8
    printf("idx[%d] = \"%s\"\n", idx, str[idx]);
9
10
    return 0;
11
}

von Schotter (schottre)


Lesenswert?

test schrieb:
> wie wäre es damit?
>
1
#include <stdio.h>
2
> 
3
> int main()
4
> {
5
>     char* str[] = {"anfang", "mitte", "ende" };
6
> 
7
>     int idx = 1;
8
>     printf("idx[%d] = \"%s\"\n", idx, str[idx]);
9
> 
10
>     return 0;
11
> }
12
>

Geht kein bisschen in die Richtung was ich mir wünsche^^
Ich hab's aber auch schlecht beschrieben.

Gebt mir noch ein paar Minuten, dann hab ich's wahrscheinlich selbst. In 
erster Linie habe ich die Klammern falsch gesetzt...

von Schotter (schottre)


Lesenswert?

Ich hab's jetzt quasi.

Im Header steht momentan
1
typedef struct {
2
  const uint8_t idx;
3
  const char *description;
4
} desc_t;
5
6
typedef struct {
7
  desc_t a[4];
8
  desc_t b[17];
9
} description_t;
10
11
void descPrint(const desc_t *desc, uint8_t numOfElemnts, uint8_t idx);
12
13
extern const description_t Descriptions;
14
15
#define descPrintAstr(idx)    descPrint(&Descriptions.a[0], sizeof(Description.a)/sizeof(desc_t), idx);

und in der C-Datei steht
1
const desciption_t Descriptions = {
2
  .a = {
3
    { 0, "text1" },
4
    { 1, "text2" },
5
    { 2, "text3" },
6
    { 3, "text4" },
7
  },
8
  .b = {
9
    { 2, "blob1" },
10
    { 21, "blob19" },
11
// (..)
12
    { 200, "blob99" },
13
  }
14
};

Der Inhalt in der C-Datei muss was die Arraygrößen betrifft mit den 
Angaben im Header übereinstimmen, sonst gibt es eine Warnung. Damit kann 
ich so einigermaßen leben.

Wem ein aussagekräftiger Titel für mein "Problem" einfällt, bitte her 
damit. Genauso wenn jmd einen eleganteren Weg hat.

Schöne Grüße,
Thorsten

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.