Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.07.2007, 09:11

Struct unbekannt?

Hi :) ,

ich hätte da ein kleines Problem mit meiner Config-Klasse. Und zwar möchte ich mir ein Struct zurückgeben lassen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
        typedef struct 
        {
            int             i_window_width;
            int             i_window_heigth;
        }cfg_data;


        cfg_data            config_data;


Zur Übung ist die Klasse von einer Singleton-Klasse abgeleitet. Jetzt würde ich gerne von außen dieses Struct holen.

Aus ConfigClass.h/Public

C-/C++-Quelltext

1
        *cfg_data           ConfigClassGet();


Aber hier mekert schon der Compiler, als ob er cfg_data garnicht kennen würde.

Zitat

Fehler 1 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'ConfigClassGet' c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\test\tset\configclass.h 46

Fehler 2 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\test\test\configclass.h 46

Fehler 3 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\test\test\configclass.h 46




Die Implementierung in der Klasse sollte dann ganz einfach so aussehen:

C-/C++-Quelltext

1
2
3
4
*cfg_data ConfigClassGet()
{
    return *config_data;
}


Hätte da jemand eine Idee, ich komm einfach nicht drauf. Ich meine das Struct ist definiert und deklariert. Eigentlich alles da was er braucht, oder???

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

23.07.2007, 11:16

Naja, die Struktur hat ja auch keinen Namen. Den solltest du zuerst vergeben:

C-/C++-Quelltext

1
2
3
4
struct cfg_data_t
{
    // xyz

};


Außerdem brauchst du das typedef nicht, wir sind hier in C++ nicht in C! ;-)

Wenn du einen Zeiger auf die Struktur zürckgeben willst brauchst du desweiteren:

C-/C++-Quelltext

1
cfg_data_t* ConfigClassGet();


grüße
@D13_Dreinig

3

23.07.2007, 11:30

Woops,

dann hab ich was durcheinander gebracht, ich dachte die Benennung am Ende der Struct-Deklaration wäre auch möglich aber das wird dann wohl auch C sein.

Und der Stern wegen Pointer nicht vor den Variablentyp?

Auf jeden Fall schon mal danke, jetzt kann ich weiterwurschteln. :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

23.07.2007, 11:32

Zitat von »"Shoot"«

Woops,

dann hab ich was durcheinander gebracht, ich dachte die Benennung am Ende der Struct-Deklaration wäre auch möglich aber das wird dann wohl auch C sein.


Am Ende der Struktur kannst du Objekte des Strukturtyps anlegen. Das was du gemacht hast also.

Zitat von »"Shoot"«


Und der Stern wegen Pointer nicht vor den Variablentyp?


Nö, war schon immer hinter dem Typ. Den Stern vor dem Zeiger brauchst du zum derefenzieren.
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

23.07.2007, 12:33

Also mann muss zwar seine Strukturen nicht per typedef benennen, aber es sollte unproblematisch möglich sein. cfg_data_t ist in dem obigen Code keine Variable sondern tatsächlich ein typedef ;)

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

6

23.07.2007, 12:50

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// C Style


// deklarieren der struktur

struct foo
{
     int some_value;
};

// instanziieren

struct foo MyFoo;
struct foo* MyFooP = (struct foo*)malloc(sizeof(struct foo));


die typedefs in c sind einfach nur da um sich schreibarbeit zu sparen.


C-/C++-Quelltext

1
2
3
4
5
6
typedef struct 
{
    int some_value;
} foo;

foo* MyFooP = (foo*)malloc(sizeof(foo));
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

23.07.2007, 13:12

Zitat von »"grek40"«

Also mann muss zwar seine Strukturen nicht per typedef benennen, aber es sollte unproblematisch möglich sein.


Unproblematisch schon, aber nicht sinnvoll! :-P

Zitat von »"grek40"«

cfg_data_t ist in dem obigen Code keine Variable sondern tatsächlich ein typedef ;)


Richtig! Ich war gedanklich schon vom typedef weg! :)
@D13_Dreinig

8

24.07.2007, 09:03

Hi nochmal,

soo, hat jetzt geklappt aber nicht wie ich es ursprünglich vorhatte. Weil ich ja versuche ordentlich Programmieren hab ich mir gedacht, daß das mit dem Zeiger nicht die beste Vorgehensweise ist. Daher hab ich auf Referenz umgestellt.

Trotzdem hätte ich noch eine Frage wegen der Rückgabe mit dem Zeiger wenn ich es trotzdem so durchgeführt hätte:

Die Methode war ja so deklariert:

C-/C++-Quelltext

1
2
3
4
5
6
ConfigClass::cfg_data *ConfigClass::ConfigClassGet()
    {
     ConfigClass::cfg_data *p_cfg_data = 0;
     p_cfg_data = &config_data;
     return p_cfg_data;
    }


Also Rückgabe der Adresse des Strukts

und mein Aufruf hat so ausgeschaut:

C-/C++-Quelltext

1
2
    ConfigClass::cfg_data config_data;
    *config_data = g_p_config->ConfigClassGet();


Da erhalte ich in der Zeile wo er sich die Adresse holt den Fehler bezüglich einer ungültigen Dereferenzierung und einen wegen Konvertierung das *config_data keinen Typ ConfigClass::cfg_data * konvertieren kann.

Hmm, eigentlich wird ja so die Adresse in den Pointer meiner Variablen zugewiesen oder hab ich wieder was falsch verstanden. Wahrscheinlich ja, sonst kämen keine Fehlermeldungen, aber warum? :oops:

Ich denke mal das der Zeiger auf config_data stört, aber wieso verschließt sich mir.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

24.07.2007, 09:19

Zitat von »"Shoot"«


und mein Aufruf hat so ausgeschaut:

C-/C++-Quelltext

1
2
    ConfigClass::cfg_data config_data;
    *config_data = g_p_config->ConfigClassGet();


Das macht ja gar keinen Sinn, weil du config_data als lokales objekt erzeugst, kannst du es mit * nicht dereferenzieren. Ich würde an der Stelle einen Fehler erwarten, sollte wirklich keiner kommen, wird er * wohl einfach ignorieren, aber kann ich mir egtl nicht vorstellen.

du kannst nur pointer mit dem * dereferenzieren, also zB

C-/C++-Quelltext

1
2
3
4
 int* i;
int j;
i = &j;
*i = 2;

in j steht jetzt 2.

10

24.07.2007, 09:31

Edit: Eigentlich ging ich davpn aus, daß die Daten überall erhältlich sind, deswegen hab ich die ConfigClass von einer Singleton-Klasse abgeleitet.

Edit2: also statt *config_data = .... &config_data = .... nehmen?

Werbeanzeige