Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Wie auf Zeiger in einer Struktur zugreifen
roadracer
11-11-2010, 17:08
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
undefined
11-11-2010, 17:25
Zu a kein Code - keine Ahnung was du machst ;)
Zu b Eingabe fehlt und kein Format angegeben siehe man fprintf
*(struktur.zeiger) = blabla;
%e beim fprintf erwartet einen parameter siehe
http://linux.die.net/man/3/printf
sommerfee
11-11-2010, 19:28
Vermutlich will er
fprintf(db, "%%entry\n");
(also mit doppeltem %)
oder alternativ
fputs("%entry\n", db);
roadracer
11-11-2010, 21:36
Vermutlich will er
fprintf(db, "%%entry\n");
(also mit doppeltem %)
Das war's, danke! Also manchmal ehrlich....
Also ich habe eine Struktur
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
foofoo.(*z) = 'x';bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token).
VG
Das war's, danke! Also manchmal ehrlich....
Also ich habe eine Struktur
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
foofoo.(*z) = 'x';bekomme ich von gcc eine Fehlermeldung (expected identifier before ‘(’ token).
VG
ich hab dir die lösung bereits geschrieben! lies nochmal!
...
Wenn ich das so mache
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...
foofoo.z = malloc(sizeof(char));
*(foofoo.z) = 'x';
roadracer
12-11-2010, 14:21
tüllich, genau dafür ist der zeiger ja da!
TheTraina
14-11-2010, 18:55
hallo,
ich habe ein ähnliches problem. und zwar habe ich einen struct, in dem ich einen Typ list habe.
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.
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 :)
struct foo {
...
list< int > listname
...
} foofoo, *foofooptr
struct foo *f;
f = malloc( sizeof(struct foo));
f->listname.push_back(integer);
TheTraina
14-11-2010, 20:44
ja, im endeffekt habe ich es genauso, nur dass mein struct per typedef als typ definiert wurde.
typedef struct _cluster {
// ...
list< int > points_in;
// ...
} cluster, *clusterptr;
und aufgerufen wirds mit:
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?
sommerfee
15-11-2010, 07:27
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:
clusterptr c;
c = new cluster;
TheTraina
15-11-2010, 11:35
Nimm also stattdessen:
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 :D.
Besten Dank und schönen Tag
TheTraina
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.