Peter F.: Frage zu C-Strukturen, Arrays

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

  1. 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

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. 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

  2. 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

    --
    Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde.