Frage zu C-Strukturen, Arrays
Peter F.
- programmiertechnik
0 Hopsel0 Peter F.
0 Der Martin
Moin!
In ldap.h ist folgende Struktur definiert:
typedef struct ldapmod {
int mod_op;
#define LDAP_MOD_OP (0x0007)
#define LDAP_MOD_ADD (0x0000)
#define LDAP_MOD_DELETE (0x0001)
#define LDAP_MOD_REPLACE (0x0002)
#define LDAP_MOD_INCREMENT (0x0003) /* OpenLDAP extension */
#define LDAP_MOD_BVALUES (0x0080)
/* IMPORTANT: do not use code 0x1000 (or above),
* it is used internally by the backends!
* (see ldap/servers/slapd/slap.h)
*/
char *mod_type;
union mod_vals_u {
char **modv_strvals;
struct berval **modv_bvals;
} mod_vals;
#define mod_values mod_vals.modv_strvals
#define mod_bvalues mod_vals.modv_bvals
} LDAPMod;
Jetzt will ich folgendes machen:
char *my_string = malloc(256);
strnpy(my_string, "TEST", 256);
LDAPMod mod;
mod.mod_op = LDAP_MOD_ADD;
mod.mod_type = "cn";
mod.mod_values = {my_string, NULL}; /* <- */
Dies funktioniert aber nicht - der Compiler meldet in der Zeile <- immer einen Syntaxfehler, ich kann diesen jedoch nicht erkennen. Hat jemand eine Ahnung warum dies so ist?
Danke, Peter
Hi Peter!
mod.mod_values = {my_string, NULL}; /* <- */
Dies funktioniert aber nicht - der Compiler meldet in der Zeile <- immer einen Syntaxfehler, ich kann diesen jedoch nicht erkennen.
Das nächste mal solltest du diese Fehlermeldung mit posten. =)
Hat jemand eine Ahnung warum dies so ist?
mod_values ist in der Struktur LDAPMod nicht definiert.
Ich nehme an, du möchtest die Zeile so ersetzen:
mod.mod_vals = {my_string, NULL};
MfG H☼psel
Hallo!
Hi Peter!
»» mod.mod_values = {my_string, NULL}; /* <- */
»»
»» Dies funktioniert aber nicht - der Compiler meldet in der Zeile <- immer einen Syntaxfehler, ich kann diesen jedoch nicht erkennen.
Das nächste mal solltest du diese Fehlermeldung mit posten. =)
Ok, hier wär sie: error: expected expression before ‘{’ token
»» Hat jemand eine Ahnung warum dies so ist?
mod_values ist in der Struktur LDAPMod nicht definiert.
Ich nehme an, du möchtest die Zeile so ersetzen:
mod.mod_vals = {my_string, NULL};
Doch, mod_values ist mittels eines #define gegeben. Tatsächlich habe ich genau deine Zeile dastehen (mod_attr.mod_values = {mystring, NULL};), aber dann gibts obige Meldung. Noch Ideen?
Grüße, Peter
Hallo,
union mod_vals_u {
char **modv_strvals;
struct berval **modv_bvals;
} mod_vals;
der Trick an einer union ist, dass beide (bzw. alle) darin angelegten Members einander überlagern, d.h. denselben Speicherplatz belegen. Ist dir das bewusst? Okay, nur zur Sicherheit.
char *my_string = malloc(256);
strnpy(my_string, "TEST", 256);LDAPMod mod;
mod.mod_op = LDAP_MOD_ADD;
mod.mod_type = "cn";
mod.mod_values = {my_string, NULL}; /* <- */
Löst man das Macro mod_values auf, das in diesem Ausdruck steht, ergibt sich:
mod.mod_vals.modv_strvals = {my_string, NULL};
Dies funktioniert aber nicht - der Compiler meldet in der Zeile <- immer einen Syntaxfehler, ich kann diesen jedoch nicht erkennen. Hat jemand eine Ahnung warum dies so ist?
Man kann in C keine komplexen Datenstrukturen einfach so zuweisen. Du musst also die Strukturen Schritt für Schritt aufbauen. Den ersten Schritt hast du (Speicher reservieren für den ersten String my_string). Der zweite Schritt wäre, Speicher für zwei oder mehr char* zu reservieren und die Adresse von my_string sowie die Konstante NULL dort einzutragen. Und der dritte Schritt wäre, in mod.mod_vals.modv_strvals die Adresse dieses char*-Arrays zu hinterlegen.
So long,
Martin