hilfe mit struct
-
hallo zusammen
Bin jetzt schon zeit drei tagen am ausprobieren an was es liegen könnte,
rufe ich aber p.val[i].nip_val.val[0] kriege ich ein Bus error,
stelle ich max auf die datenmenge ein die p.val erhalten sollte
funktioniert es wieder ???
iregendwo muss ein fehler sein ?!?kann mir das bitte jemand erklähren ???
so möchte ich es gerne haben.
propertys.val[0].nip_name=name propertys.val[0].nip_name.val[0]=www propertys.val[1].nip_name=passwd propertys.val[1].nip_name.val[0]=* propertys.val[2].nip_name=gid propertys.val[2].nip_name.val[0]=5445 propertys.val[3].nip_name=users propertys.val[3].nip_name.val[0]=ban propertys.val[3].nip_name.val[1]=van //funktioniert noch nicht sollte aber spätter so ausehen. propertys.val[3].nip_name.val[2]=can //funktioniert noch nicht sollte aber spätter so ausehen.
kann man das überhaubt mehrere structuren ineinander verknüpfen,
also eine structur in einer structur die wieder ein teil
einer andern structur ist ,
also so wie hier.#include <stdlib.h> #include <string.h> #include <stdio.h> typedef char *name; typedef struct { int len; name *val; } namelist; typedef struct { name nip_name; namelist nip_val; } property; struct propertys { int len; property *val; }; typedef struct propertys propertys; void structure(propertys *p) { int i, max=1; p->val = (property*) calloc(max, sizeof(property)); if (p->val == NULL) { printf("Kein speicher"); exit(1); } for (i=0; i < 20; i++) { p->len = i+1; if (i > max) { max+=max; p->val = (property*) realloc(p->val,max * sizeof(property)+1); if (p->val[i == NULL) { printf("Kein speicher"); exit(1); } } p->val[i].nip_name = "users"; p->val[i].nip_val.len = 1; p->val[i].nip_val.val = (name*) malloc(sizeof(name)); if (p->val[i].nip_val.val == NULL) { printf("Kein speicher"); exit(1); } p->val[i].nip_val.val[0] = "test"; } } int main() { propertys p; size_t i; structure(&p); for (i=0; i < p.len; i++) { printf("%s\n", p.val[i].nip_name); printf("%s\n", p.val[i].nip_val.val[0]); } }
gruss van
-
Ich hab jetzt leider keine Zeit, den Code vollständig zu verstehen, aber prinzipiell sollte das schon funktionieren. Ein Zeiger auf eine Struktur ist (maschinennahe gedacht) eine ganze Zahl, die auf einen Speicherbereich verweist. Weiters sind ganze Zahlen als Elemente von Strukturen zuläßig.
Somit kann eine Struktur einen (oder beliebig viele) Zeiger auf eine Struktur beliebiger Art enthalten, "auch wenn das auf den ersten Blick riskant aussieht"* einen Zeiger auf eine Strukur vom gleichen Typ.
Wenn ich Dein Problem richtig verstanden habe, kannst Du mit jedem Zeiger auf genau eine Struktur verweisen. Die Struktur propertys enthält aber nur einen Zeiger, kann also nur auf eine Struktur verweisen. Du solltest besser ein Array aus Zeigern anlegen.struct propertys { int len; property *val[PROPSLEN]; };
Vielleicht ist es aber günstiger, einen binären Baum zu verwenden, d.h. eine Kette von Strukturen, von denen jede nur die Adresse ihrer beiden Nachbarn kennt. Diesen Baum könnte eine Funktion rekursiv bearbeiten, was oft zu eleganten und kurzen Formulierungen führt.
typedef struct pr { PRREF linker_nachbar; PRREF rechter_nachbar; /* eigentlich relevante Elemente */ } PROPERTY, *PRREF;
* K&R
-
aber ich übergib doch mit
typedef struct { name nip_name; namelist nip_val; } property; struct propertys { int len; property *val; }; max = 5; p->val = (property*) calloc(max, sizeof(property))
die structur property 5* an propertys *val
*val muss doch nur eindimensional, also val[5]
val[0] property nip_name 1
val[2] property nip_name 2
etc.weil *val ja jetzt 5 * die structure property enthält.
gruss van
-
van schrieb:
...
p->val[i].nip_name = "users";
p->val[i].nip_val.len = 1;
p->val[i].nip_val.val = (name*) malloc(sizeof(name));
if (p->val[i].nip_val.val == NULL)
{
printf("Kein speicher");
exit(1);
}
p->val[i].nip_val.val[0] = "test";
}
...Hier liegt der Hund begraben! Ich geh jetzt mal das Schritt für Schritt durch:
1. Zeile: Das kannst du zwar machen, ist aber nicht ratsam. Besser wäre es wenn du Speicher reservierst und dann den Text mit strcpy() reinkopierst.p->val[i].nip_name = malloc(strlen("users")+1); strcpy(p->val[i].nip_name, "users);
2. Zeile: Die Zuweisung ist Ok, allerdings stimmt der Wert nicht, meines Erachtens, denn "test" sind eindeutig 4 Zeichen und nicht nur 1. Oder willst du mit len was anderes anzeigen??
3. Zeile: Da ist der Hauptfehler! Der Cast name* stimmt nicht. Da darfst du nur name hernehmen! malloc() darfst du auch nicht sizeof(name) übergeben. Das ist nämlich die Größe eines Zeigers. Du musst dort angeben wieviele Zeichen dein String enthält, der da drin gespeichert werden soll + dem Stringendezeichen. In deinem Fall solltest du also 5 angeben oder strlen("test") + 1
4. - 8. Zeile: Gut!
9. Zeile: Diese Zuweisung stimmt auch wiederum nicht. Wie man das am besten macht, hab ich ja schon bei der 1. Zeile erklärt
Noch eine Frage: Hast du vor in p->val[i].nip_val.val mehrere Namen zu speichern? Dann müsste man das Ganze nämlich noch anders machen ab der 3. Zeile.
-
ja p->val[0].nip_val.val sollte auch wider mehrere values haben