Structur & "string"
-
Hallo,
ich habe folgende structur (fest vorgegeben):
typedef struct { long cnt; /* number of bytes that follow */ unsigned char str[1]; /* cnt bytes */ } **LStrHandle; typedef struct { LStrHandle dir; LStrHandle file; } PARAM_CLUSTER; PARAM_CLUSTER x;
und moechte in variable "dir" einen String(Pfad) zuweisen.
Leider bin ich nicht so fitt in C. Kann mir vielleicht einer dabei helfen ?
Danke
-
Ui da hast du dir aber was schönes ausgesucht. Du musst den Speicherplatz für deine Variablen in dem Fall selber reservieren mit malloc().
Ich mach dir mal ein Beispiel anhand deiner struktur:
//Der Pfad C:\temp mit den drei Dateien a.txt, b.txt und c.txt soll gespeichert werden int i; int anzpfad = 1; int anzdatei = 3; //Speicher für 1 Pfad reservieren x.dir = malloc(anzpfad * sizeof(unsigned int)); //unsigned int = Größe eines Zeigers //Speicher für Pfadnamen (Länge) reservieren x.dir[0] = malloc(sizeof(long) + 255); //255 Zeichen reservieren für den Pfadnamen //Pfad speichern strcpy(x.dir[0], "C:\\temp"); //Speicher für 3 Dateien reservieren x.file = malloc(anzdatei * sizeof(unsigned int)); //Speicher für Dateinamen (Länge) reservieren for(i=0;i<anzdatei;++i) { x.file[i] = malloc(sizeof(long) + 20); //20 Zeichen reservieren für den Dateinamen } //Dateien speichern x.file[0].cnt = 5; //Anzahl Zeichen von a.txt strcpy(x.file[0].str, "a.txt"); x.file[1].cnt = 5; strcpy(x.file[1].str, "b.txt"); x.file[2].cnt = 5; strcpy(x.file[2].str, "c.txt");
Ich hoffe ich konnte dir helfen und dass sich kein Fehler eingeschlichen hat.
-
x.dir = malloc(anzpfad * sizeof(unsigned int))
wieso schreibst du nicht einfach
x.dir = (LStrHandle**)malloc(anzpfad * sizeof(*LStrHandle))
PS: der Cast vor malloc ist eigentlich nicht erforderlich...
-
@ghost
Weil ich glaube, dass das nicht ganz richtig ist so. Wenn du dir nochmal die Deklaration von LStrHandle anschaust, dann siehst du da zwei * davor, wenn du jetzt noch einen * vor LStrHandle machst, dann wären es schon drei. Du würdest also Speicher für einen Zeiger auf einen Zeiger auf einen Zeiger reservieren. Im Endeffekt wär es egal, aber ich empfinde es als logisch falsch. Kann auch sein, dass ich mich jetzt irre.Irgendwie hab ich aber auch noch einen Fehler drin. Ich hab die Elemente von LStrHandle ganz übersehen.
[Edit]So jetzt hab ich es oben geändert. Möglicherweise muss man vor str und cnt anstatt dem . einen -> machen. Blöderweise hab ich momentan keinen Compiler da zum Test, würd mich interesieren ob das so stimmt. Kann das mal einer Testen bitte?[/Edit]
-
Oh da habe ich ja wirklich Mist geschrieben. Also hier nochmal die saubere Version:
typedef struct { long cnt; /* number of bytes that follow */ unsigned char str[1]; /* cnt bytes */ } sStrHandle; typedef sStrHandle **LStrHandle; typedef struct { LStrHandle dir; LStrHandle file; } PARAM_CLUSTER; PARAM_CLUSTER x; ... x.dir = (LStrHandle)malloc(anzpfad * sizeof(sStrHandle*)); // malloc reserviert anzpfad * Größe eines Pointers auf die Struktur. // Und dieser reservierter Block (die Adresse) wird dann x.dir übergeben.
-
@ghost
Ja so schaut das schon besser aus :).