PDA

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

msi
11-11-2010, 18:20
*(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

msi
11-11-2010, 22:11
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!

jeebee
12-11-2010, 13:40
...
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 :)

msi
14-11-2010, 19:27
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