Anzeige:
Ergebnis 1 bis 13 von 13

Thema: [C] Wie auf Zeiger in einer Struktur zugreifen

  1. #1
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48

    [C] Wie auf Zeiger in einer Struktur zugreifen

    Hallo,
    wie kann ich auf einen Zeiger in einer Struktur zugreifen? Eigentlich ja ohne Struktur mit *zeiger = blabla; ganz einfach. Bei struktur.(*zeiger) = blabla; bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token). Wie macht man's richtig?

    Kleine Frage noch am Rande: Will fprintf mich verarschen? Oder warum bekomme ich bei den Aufruf fprintf(db, "%entry\n"); eine Warnung (too few arguments for format)?

    VG
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  2. #2
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zu a kein Code - keine Ahnung was du machst
    Zu b Eingabe fehlt und kein Format angegeben siehe man fprintf
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Code:
    *(struktur.zeiger) = blabla;

    %e beim fprintf erwartet einen parameter siehe
    http://linux.die.net/man/3/printf

  4. #4
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Vermutlich will er
    Code:
    fprintf(db, "%%entry\n");
    (also mit doppeltem %)
    oder alternativ
    Code:
    fputs("%entry\n", db);

  5. #5
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Zitat Zitat von sommerfee Beitrag anzeigen
    Vermutlich will er
    Code:
    fprintf(db, "%%entry\n");
    (also mit doppeltem %)
    Das war's, danke! Also manchmal ehrlich....

    Also ich habe eine Struktur
    Code:
    struct foo {
    int a
    long b
    char *z
    } foofoo;
    ich möchte nun auf den in der Struktur enthaltenen Zeiger zugreifen. Wenn ich das so mache
    Code:
    foofoo.(*z) = 'x';
    bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token).

    VG
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von roadracer Beitrag anzeigen
    Das war's, danke! Also manchmal ehrlich....

    Also ich habe eine Struktur
    Code:
    struct foo {
    int a
    long b
    char *z
    } foofoo;
    ich möchte nun auf den in der Struktur enthaltenen Zeiger zugreifen. Wenn ich das so mache
    Code:
    foofoo.(*z) = 'x';
    bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token).

    VG
    ich hab dir die lösung bereits geschrieben! lies nochmal!

  7. #7
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Zitat Zitat von roadracer Beitrag anzeigen
    ...
    Wenn ich das so mache
    Code:
    foofoo.(*z) = 'x';
    bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token).

    VG
    Abgesehen davon machst du hoffentlich ein foofoo.z = malloc(sizeof(char)), bevor du versuchst da hinzuschreiben...

    Code:
    foofoo.z = malloc(sizeof(char));
    *(foofoo.z) = 'x';
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  8. #8
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    tüllich, genau dafür ist der zeiger ja da!
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  9. #9
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    hallo,
    ich habe ein ähnliches problem. und zwar habe ich einen struct, in dem ich einen Typ list habe.

    Code:
    struct foo {
       ...   
       list< int > listname
       ...
    } foofoo, *foofooptr
    ich möchte nun nachher im code, nachdem ich einen neuen struct foo initialisiert habe, in der liste listname per push_back einen wert hinzufügen.
    Code:
    foofooptr f;
    f = (foofooptr) malloc(1 * sizeof(foofoo));
    
    ((foofooptr)(f))->listname.push_back(integer);
    beim kompilieren erhalte ich keine fehlermeldung, allerdings bricht das program an der stelle mit dem push_back einfach ab. habe das auch schon versucht, indem ich die liste des struct als zeiger initialisiere (quasi analog zu einem festen array mit double*, dem ich nachher dann per new die Größe zuweise, brauche diesmal aber eine dynamische liste), aber auch das lief nicht.

    kann mir da jemand helfen? wie kann ich nachher im code werte der liste hinzufügen?

    vielen dank
    Geändert von TheTraina (14-11-2010 um 19:00 Uhr)

  10. #10
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Code:
    struct foo {
       ...   
       list< int > listname
       ...
    } foofoo, *foofooptr

    Code:
    struct foo *f;
    f = malloc( sizeof(struct foo));
    
    f->listname.push_back(integer);

  11. #11
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    ja, im endeffekt habe ich es genauso, nur dass mein struct per typedef als typ definiert wurde.


    Code:
    typedef struct _cluster {
        // ...
        list< int > points_in;
        // ... 
    } cluster, *clusterptr;
    und aufgerufen wirds mit:

    Code:
    int index = 3;    //Test
    
    clusterptr c;
    c = (clusterptr) malloc(sizeof(cluster));
    
    c->points_in.push_back(index);   // [#]
    das sollte doch eigtl. funktionieren, oder?
    wie gesagt, ich bekomme keinen compiler fehler (gcc 4.4.1 unter linux). das programm hört einfach auf in der push_back zeile [#].

    ne idee weswegen?
    Geändert von TheTraina (14-11-2010 um 21:12 Uhr) Grund: rechtschreibfehler, compiler info geadded

  12. #12
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von TheTraina Beitrag anzeigen
    clusterptr c;
    c = (clusterptr) malloc(sizeof(cluster));
    das sollte doch eigtl. funktionieren, oder?
    Nein.

    Sobald du eine C++ Klasse verwendest (hier: list), mußt du die Existenz von malloc() ganz einfach vergessen. (Besser: Wenn man C++ macht, dann grundsätzlich die Existenz von malloc() und free() vergessen.) Denn bei malloc() werden die Konstruktoren der Klassen nicht aufgerufen, weil malloc() von seinem C++ Umfeld schlicht und einfach nichts weiß. (Von der vtable für späte Bindung etc. ganz zu schweigen.)

    Nimm also stattdessen:

    Code:
    clusterptr c;
    c = new cluster;
    Geändert von sommerfee (15-11-2010 um 07:49 Uhr)

  13. #13
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    Zitat Zitat von sommerfee Beitrag anzeigen
    Nimm also stattdessen:
    Code:
    clusterptr c;
    c = new cluster;
    Perfek. Das klappt einwandfrei .
    Danke dir für die Lösung und logische Schilderung meines Problems. Jetzt ist es mehr als klar, wieso es vorher nicht funktioniert hat .

    Besten Dank und schönen Tag
    TheTraina

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •