Struct anlegen

Hallo,

dieses mal hab ich ein kleines struct problem.

Ich hab ein struct array angelegt.

struct strInfo strArray[] = {

 {...} //Spalte1
 {...} //Spalte2
...
}; 

mit strArray[] kann ich jetzt alle Elemente innerhalb diesem struct Array aufrufen.

Der komplette Inhalt in dieser struct stellt die Spalten einer Tabelle dar. D.h. jede Spalte ist wiederum eine struct - nämlich die struct strInfo.

Jetzt möchte ich gern 10 Reihen anlegen - allerdings möchte ich nicht 10x den Inhalt vom strArray hintereinander hineinkopieren müssen.

struct strInfo \*ptr; 

führt natürlich nicht zum Ziel.

struct strInfo TBL[10]; 

führt natürlich nicht zum Ziel.

Die strInfo struct ist 4x in der strArray struct enthalten, weil die Tabelle 4 spalten hat.

Wenn man einfach strInfo TBL[40] macht, hat man zwar alle Werte vorhanden (für die 10 Zeilen), aber das Problem ist hier, dass ich dann alle strInfo structs zu Beginn initialisieren muss mit den richtigen Werten. -> das kann man leider nicht per for-schleife oder ähnlichem realisieren, da die Werte nach keinem Muster verlaufen.

struct strInfo {
 unsigned int \*ID; //ID: Position in Tabelle
 unsigned short Length; //ID Länge
 unsigned short Access; //zugriff auf Value: lesen, schreiben
 unsigned short Type; //Spalten-Typ: z.B. char, string, int
 void \*Value; //wert 
}; 

Das fällt bei der strArray-Methode weg, da innerhalb dieser Struct bereits die Werte fest initialisiert sind.

Hat irgend-jemand für mich eine Idee, wie ich das am besten realisieren kann?

  • eine Tabelle erstellen, die als Spaltenwerte die struct strArray
    besitzt
  • und 10 Reihen aufweist?

gruß
patrick

Hallo patrick,

Ich finde das reichlich verwirrend, was Du das schreibst. Ich befürchte, daß das sehr unuebersichtlich wird, wenn Du so weiter machst.

Ich gehe mal davon aus, daß das für C sein soll (oder dürfen es auch Klassen mit C++ sein?) Wie wäre das hier:

struct strInfo
{
 char \*name;
 char \*strasse;
 int alter;
 /\* etc. \*/
};

Das ist noch überschaubar. Jetzt machen wir ein Array davon:

typedef strInfo[10] INFO\_ARRAY;

Davon machen wir jetzt wieder ein paar:

typedef INFO\_ARRAY[12] ARRAY\_BUNDLE;
ARRAY\_BUNDLE asdf;

So kann ich natürlich ewig weiter machen. Es bringt dann aber auch solche Schreibe mit sich:

asdf.qwer[0].ertz.tzui[1].fghj = 1;

Ich würde das eher als „Strafe für schlimme Entwickler“ einschätzen.

Das mindeste wäre eine seperate init-Funktion für jeden Daten-Typ, welche die jeweils nächste rekursiv aufruft.
Das gleiche mit C++ - Klassen wäre m.E. halb so wild. Die Daten könntest du in eine Textdatei als XML o.ä. eintippen, dann brauchst Du aber auch einen Parser (die init-Funktionen), der das einliest.

Beschreibe doch mal ein wenig Dein Projekt, wofür Du das brauchst. Ich bin sicher, da gibt es noch bessere Lösungen.

lg
Martin B

Hallo patrick,

Ich finde das reichlich verwirrend, was Du das schreibst. Ich
befürchte, daß das sehr unuebersichtlich wird, wenn Du so
weiter machst.

Ich gehe mal davon aus, daß das für C sein soll

richtig, ich programmiere in C (Mikrocontroller).

Beschreibe doch mal ein wenig Dein Projekt, wofür Du das
brauchst. Ich bin sicher, da gibt es noch bessere Lösungen.

ich möchte gern eine Tabelle darstellen, die im laufenden Programm bis zu max. 10 einträge bekommen kann (also Zeilen) / diese einträge können auch gelöscht oder in den werten geändert werden. Diese Veränderungen werden über Netzwerk getätigt durch andere User (über das Protokoll SNMP).

Bei SNMP ist es jedoch so, dass jedes Element seine eigenen Eigenschaften wie Zugriffserlaubnis, ID etc. beinhaltet. Deshalb hab ich mir die struct (hier im Bsp: preferences) geschrieben, in denen diese Eigenschaften vermerkt sind.

Jede Spalte besitzt diese Eigenschaften. Daher hab ich daraus ein struct Array (Spalten) gemacht. Die Anzahl der Einträge entspricht der Spaltenanzahl. Der Vorteil dieses struct Arrays ist es, dass ich alle Eigenschaften fix festlegen kann, bevor das Programm losläuft; dadurch benötige ich nicht soviel zeit um die Eigenschaften per Hand reinzuschreiben.

struct preferences {
 unsigned int \*ID; 
 unsigned short Length; //ID länge
 unsigned short Access; //read-write / read-only / no-access
 unsigned short Type; //short, int, char, string etc. 
 void \*Value; //wert in der tabelle 

}; 

struct preferences Spalten {

 {} //stellen die einzelnen spalten der tabelle dar
 {}
 ... usw. 
}; 

Jetzt fehlt mir noch eine Möglichkeit wie ich eben eine Art Tabelle erstellen kann, mit den Spalten der struct Spalten (auf elegante Weise) - übersichtlich und ohne viel Code.

Bei SNMP gibt es eine Menge solcher Tabellen - mit u.a. mehr als 30 Einträgen, so dass es keine gute Möglichkeit darstellt 30 Einträge * Zeilenanzahl in die Spalten struct zu schreiben.

gruß
patrick

Hallo patrick,

Sorry, ich verstehe nichts von SNMP und Mikrocontrollern, da muss ich passen. Wünsche viel Glück für dein Projekt.

lg
Martin B