Zugriff auf Strukturelement über Index+"Zweig"

OP #4875480
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!
Gast
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
}
OP
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...
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.