Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » pointer auf struct?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.09.2003, 01:53 Uhr
BeS



Hallo,
ich bastel gerade an einem Programm, welches eine pointer auf eine structur an eine andere Funktion übergeben muß.
Da es nicht richtig funktioniert habe ich mir mal folgendes Testprogramm geschrieben:


C++:
#include <stdio.h>

struct daten {
  int data1, data2;
};

void aendern(struct daten *x)
{
  struct daten in = *x;
  in.data1 += in.data2;
  *x = in;
}

int main()
{
  struct daten y;

  y.data1 = 5;
  y.data2 = 10;

  aendern(&y);

  printf("%d - %d", y.data1, y.data2);

  return 0;
}



so geht es, mich stört aber die 'in'-Variable in aendern etwas. Wenn ich es aber ohne dieser versuche:

C++:
void aendern(struct daten *x)
{
  *x.data1 += *x.data2;
}



bekomme ich diese Fehlermeldung:
request for member `data1' in something not a structure or union
request for member `data2' in something not a structure or union

Was mache ich falsch?

Danke
BeS

--edit: Pablo. [ cpp ] tags richtig gesetzt --
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 25.09.2003 um 01:54 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.09.2003, 01:55 Uhr
Pablo
Supertux
(Operator)


Wie wäre es damit?


C++:
#include <stdio.h>

typedef struct {
  int data1, data2;
}daten;

void aendern(daten *x)
{
     x->data1 += x->data2;
}

int main()
{
  daten y;

  y.data1 = 5;
  y.data2 = 10;

  aendern(&y);

  printf("%d - %d\n", y.data1, y.data2);

  return 0;
}




Bearbeitung:

[code]
*x.data1
[/cpp]
geht nicht, weil x ein Pointer ist, und um auf Members von Pointer zugreifen zu können, muss man -> statt . benutzen.

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 25.09.2003 um 02:12 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.09.2003, 02:04 Uhr
Pablo
Supertux
(Operator)


Und ohne typedef:

C++:
#include <stdio.h>

struct daten{
  int data1, data2;
};

void aendern(struct daten *x)
{
     x->data1 += x->data2;
}

int main()
{
  struct daten y;

  y.data1 = 5;
  y.data2 = 10;

  aendern(&y);

  printf("%d - %d\n", y.data1, y.data2);

  return 0;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.09.2003, 06:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Pablos Version ist richtig.
Noch ein kleiner Nachtrag:

C++:
  *in.data1 += *in.data2;


Geht nicht, weil Der . - Operator stärker bindet als der * -Operator. Wenn Du dich im den -> Operator drücken willst, kannst Du auch schreiben:

C++:
  (*in).data1 += (*in).data2;


Was aber hochgradig ungewöhnlich wäre.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.09.2003, 12:04 Uhr
BeS



Hallo,
danke für eure schnelle Hilfe!
Das C Programm funktioniert soweit, ich habe jetzt nur noch ein kleines Problem. Das Programm indem ich das brauche ist ein GTK+ Programm, welches nur einen pointer vom typ gpointer übernimmt.
Ich muß in meiner Funktion die pointer also casten, dass mache ich derzeit so:

C++:
((struct statistik *)data)->anz++;



es funktioniert so, sieht für mich aber nicht unbedingt schön aus. Gibt es da auch andere Möglichkeiten? Wie würdet ihr das schreiben?

Danke!
BeS
--
If art interprets our dreams, the computer execute them in the guise of programs!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.09.2003, 13:47 Uhr
Pablo
Supertux
(Operator)


Ich kenne in C keine andere Möglichkeiten zu casten, wie in C++. Deshalb würde ich vermuten, dass dies richtig sei und dass anders nicht geht. Vielleicht kennt jemand eine andere Form in C zu casten, aber wie gesagt da bin ich mir nicht sicher.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.09.2003, 14:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Anders gehts nicht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.09.2003, 08:59 Uhr
ao

(Operator)



Zitat:
BeS postete

C++:
((struct statistik *)data)->anz++;


Gibt es da auch andere Möglichkeiten?

Du kannst auch eine lokale Pointervariable von passendem Typ "zwischenschalten" und diese dann verwenden:

C++:
struct statistik * pStat = (struct statistik *) data;
pStat->anz++;


Meiner Privatmeinung nach werden die Zugriffe auf die Strukturmember so lesbarer, besonders dann, wenn auf mehrere Member nacheinander zugegriffen wird.

ao

Dieser Post wurde am 26.09.2003 um 09:00 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: