Array von Strukturen dynamisch initialisieren
-
Hallo,
(Hinweis: Die Frage ist: "wie kann ich ein Array von Strukturen dynamisch initialisieren?", dass es sich dabei um Gtk+ Strukturen handelt nebensächlich.)
für ein GUI-Menü benötige ich ein Array von Strukturen (menue), auf das ich später z.B. wie folgt füllen möchte:
... GtkItemFactoryEntry *ptr = &menue[5]; for (n=0; n<anzahl; n++){ ... /* weitere Anweiseungen */ ptr->path=ipfadarr[n]; ... /* weitere Anweiseungen */ ptr++; }
Das funktioniert auch wunderbar, solange ich die Anzahl der Menüeinträge vorher kenne und ich es folgendermaßen initialisieren kann:
static GtkItemFactoryEntry menue[45];
Nun möchte ich aber das Array aber dynamisch initialisieren. Ich denke an etwas wie:
struct GtkItemFactoryEntry menue = malloc(groesse*sizeof(int*));
und habe auch versucht, anschließend an diese Anweisung für die Members von GtkItemFactoryEntry Speicher zu allozieren:
for(i = 0; i < groesse; i++){ menue[i].path=malloc(39*sizeof(char)); ... }
Der Compiler gibt mir " Fehler: Variable »menue« hat Initialisierung, aber unvollständigen Typ" und "Fehler: Speichergröße von »menue« ist unbekannt" zurück. Also wie kann ich ein Array von Strukturen dynamisch initialisieren?
-
Auf den ersten Blick sehe ich nur einen Fehler an deinem Code - du brauchst einen Zeiger: "struct GtkItemFactoryEntry* menue = malloc(groesse*sizeof(int*));".
-
Danke für die schnelle Antwort.
Leider bekomme ich mit dieser Änderung gleich dutzende Meldungen des Inhalts:
"Fehler: falsche Benutzung des undefinierten Typs »struct GtkItemFactoryEntry«"
und "Fehler: Dereferenzierung eines Zeigers auf unvollständigen Typen" für jede folgende Zeile, in der ich auf "menue" zugreifen möchte...Bin langsam am Verzweifeln!
-
soweit ich weiß, ist GtkItemFactory nicht mehr zu verwenden, siehe http://www.gtk.org/api/2.6/gtk/GtkItemFactory.html#id3736831 und solltest lieber GtkUIManager benutzen.
Desweiteren solltest du lieber g_malloc statt malloc benutzen, wenn du mit GTK/Glib arbeitest.
struct GtkItemFactoryEntry menue = malloc(groesse*sizeof(int*));
ist falsch, da GtkItemFactoryEntry ein typedef auf ein struct ist und außerdem kannst du malloc nur Zeigern zuweisen. menue ist kein Zeiger, so wie du es deklariert hast. Wieso nimmst du sizeof(int*)
???
GtkItemFactoryEntry *menue = g_malloc(groesse*sizeof(GtkItemFactoryEntry));
-
Zitat:
"soweit ich weiß, ist GtkItemFactory nicht mehr zu verwenden"> Ups, da hast du ganz offensichtlich recht! Ich habe mich an dem Tutorial unter http://www.gtk.org/tutorial/ orientiert. Gibt es denn irgendwo ein aktuelleres Tutorial?
Zitat:GtkItemFactoryEntry *menue = g_malloc(groesse*sizeof(GtkItemFactoryEntry));
Danke! Jetzt wird es immerhin übersetzt... Aber im Rest des Codes müssen auch noch Fehler sein, funktionieren tut es noch nicht:
menue[i].callback_action=malloc(sizeof(int));
ergibt:"Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung".
-
Der Name "callback_action" sowie die Fehlermeldung deuten darauf hin, daß hier eine Funktion zugewiesen werden muß (oder NULL, falls nicht benutzt).
Den Prototyp der Funktion mußt du dir aus der Doku oder den Header-Dateien heraussuchen.
-
Laut der Headerdatei ist callback_action vom Typ guint:
struct _GtkItemFactoryEntry { gchar *path; gchar *accelerator; GtkItemFactoryCallback callback; guint callback_action; ... }
guint ist nach Definition auf http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint:
typedef unsigned int guint;
menue[i].callback_action=malloc(sizeof(unsigned int));
oder:
menue[i].callback_action=malloc(sizeof(guint));
führen allerdings zur selben Warnung.
-
odysseus2007 schrieb:
Zitat:
"soweit ich weiß, ist GtkItemFactory nicht mehr zu verwenden"> Ups, da hast du ganz offensichtlich recht! Ich habe mich an dem Tutorial unter http://www.gtk.org/tutorial/ orientiert. Gibt es denn irgendwo ein aktuelleres Tutorial?
Dieses Tutorial ist gut, aber weder vollständig noch wird es aktualisiert. Deswegen ist es immer ratsam, die GTK+ Reference offen zu haben.
2. Wenn du gtk+ oder die glib benutzt, dann musst auch die glib bzw. gtk+ Datentypen benutzen. D.h. immer gint statt unsiged int. In einer anderen Plattform kann gint etwas anders sein. Die glib definiert solche Datentypen, damit die glib Benutzer ihren Code nicht auf andere Plattformen portieren müssen.
3. Dasselbe gilt für die Verwendung von malloc. Wenn du gtk benutzt, dann solltest du g_malloc und g_free nehmen oder eine Funktion der g_malloc Familie
4. Ich hab dir schon gesagt, dass malloc (bzw g_malloc) nur einem Zeiger zugewiesen werden kann, denn malloc bzw. g_malloc lieferen jeweils einen void* Zeiger zurück. menu[i].callback_action ist jedoch ein gint, kein Zeiger !!!, also brauchst du keinen Speicher dafür zu allozieren. Wie es scheint, kennst du nicht, wie malloc arbeitet, also lies dir lieber einen C Tutorial/Buch durch, bevor du weitermachst.
-
Hm, der Versuch, Speicher für die Members zu allozieren war ausgemachter Blödsinn von mir... und der Fehler lag an anderer Stelle.
Vielen Dank an alle für die Antworten!