struct dynamisch erstellen
-
Hallo zusammen,
gibt es eine Möglichkeit, structs dynamisch, z.B. anhand einer XML- oder TXT-Datei zu erstellen? Ich programmiere mit Linux (gcc).
Vielen Dank und schöne Grüße,
Epfel
-
vielleicht mit einer Struktur die 2 Arrays hat. Eins für die Attribute und das andere entsprechend für die Werte (als char?!)
-
Danke, aber bitte nochmal langsam:
Was genau ist STL? Wo finde ich Infos darüber?
Gruß, Epfel
-
Wie meinst du das? Was die struktur für mitglieder hat muss ja zur compile zeit feststehen
-
Die STL (Standard Template Libary) ist ein Teil von der C++ Standard Bibliothek.
-
Ja, genau das wäre meine Frage:
Ist es nicht möglich eine Struktur komplett zu generieren?
Ich hätte z.B. eine .txt-Datei, in der die Strukturkomponenten und deren Datentyp (in irgendeiner Form) definiert sind. Beim Starten des Programms soll die Datei geöffnet und die nötigen Infos zur Erstellung einer Struktur herausgeholt werden. Anschließend muss diese Struktur erstellt werden.
Falls in der .txt-Datei eine andere Struktur definiert wird, soll die Struktur im Programm (nur beim Programmstart, nicht zur Laufzeit) entsprechend angepasst werden. Ist sowas möglich?(Ich hoffe, das war verständlich)
Viele Grüße, Epfel
-
-
hi
nein also so etwas ist leider nicht möglich
-
Epfel schrieb:
Danke für die Antwort, aber ich möchte mit ANSI C arbeiten, nicht C++.
Gruß, Epfel
Du hasst doch nach der STL gefragt da hab ich es dir gesagt^^
Eine Möglichkeit die ich sehe wäre die Daten binär zu speichern. Da speicherst du noch zu jedem Eintrag den Datentyp mit. Beim auslesen speicherst du alles in eine linked list mit void-Pointern. Je nach dem welcher Datentyp musst du dann eben casten.
Aus Langweile probier ich mal bissl rum
-
In C kann man sowas dynamisch nur pbe rden void* Pointer machen. Du musst eben zur Compile-Zeit wissen welche Typen du unterstützen willst:
struct dataNode { struct dataNode* prev; struct dataNode* next; void* data; int size; char* type; }; void freeData(struct dataNode* p) { while(p != NULL) { struct dataNode* next = p->next; free(p->data); free(p->type); free(p); p = next; } } struct dataNode* readData(const char* buf, int bufsize) { const char* typedelim; const char* content = buf; struct dataNode *begin = NULL, *current = NULL; while( typedelim = (char*)memchr(content, ':', content - buf + bufsize) ) { int tmpsize; const char* endofline; struct dataNode* last = current; current = (struct dataNode*) malloc(sizeof(struct dataNode)); current->prev = last; current->next = NULL; if(begin == NULL) { begin = current; } else { last->next = current; } tmpsize = typedelim - content; current->type = (char*) malloc(tmpsize + 1); memcpy(current->type, content, tmpsize); current->type[tmpsize] = 0; typedelim++; endofline = (char*)memchr(typedelim, '\n', typedelim - buf + bufsize); if(endofline == NULL) { tmpsize = strlen(typedelim); } else { tmpsize = endofline - typedelim; } current->data = malloc(tmpsize); current->size = tmpsize; memcpy(current->data, typedelim, tmpsize); if(endofline) { content = endofline + 1; } else { break; } } return begin; }
Für dieses Beispiel müssen die Daten in folgendem Format sein:
typA:valueA typB:valueB . . .