globale Struktur einbinden

baeman

Mitglied
Hallo,

habe folgendes Problem:

Arbeite an einer MDI-Anwendung und möchte nun eine globale Struktur einbinden.
Diese über eine Funktion mit Default-Werten füllen, welche dann in den einzelnen Textboxes usw. der anderen Views angezeigt werden.

Struktur befindet sich in der Datei structs.h

Code:
//structs.h

struct INITIALSTRUCT{

double wert1;
double wert2;
usw.
};

struct INITIALSTRUCT init_struct;
noname.cpp enthaelt die app der MDI-Anwendung und die Funktion void fillstruct(struct INITSTRUCT * is). Welche in der Funktion InitInstance() folgendermasen aufgerufen wird.

Code:
//noname.cpp

CNoNameApp::InitInstance()
{
.
.
.

fillstruct(&init_struct);
.
.
.
}
Funktion fillstruct weisst Default-Werte zu:

Code:
void fillstruct(struct INITSTRUCT *is)
{
  is->wert1= 25.5;
  usw...
}
soweit zum Ist-Stand. Bekomme beim kompilieren einige Fehler das wert1 kein member von INITSTRUCT sei, left of wert1 must have class/struct/union type usw.


Sieht jemand den Fehler, oder hat ne Idee was falsch sein könnte?

Grüße Manuel
 
Hallo Manuel,

bei der Strukturdeklaration schreibst du "INITIALSTRUCT", in der Funktionsdeklaration für "fillstruct" allerdings "INITSTRUCT". Wenn das nicht nur ein Tippfehler in deinem Post ist, wäre das der Fehler.

Gruß
MCoder
 
Hi,

sorry war ein Tippfehler im Post.

Struktur wird als "INITSTRUCT" deklariert. VS's IntelliSense zeigt mir auch die einzelnen Elemente der Struktur an ich in der Funktion fillstruct is-> eingebe.
 
Es ist keine gute Idee, die Instanz von init_struct in der Headerdatei anzulegen. Dort würde ich sie nur als extern deklarieren. Alle Dateien, die das struct referenzieren, müssen diese struct.h includieren.
Die Instanz legst Du dann in einer cpp-Datei an, z.B. da, wo auch die Instanz von theApp deklariert wird.

In Deinem Fall würde jedes Object (jede cpp-Datei) eine eigene Instanz von init_struct anlegen. Diese Instanzen hätten nichts miteinander zu tun, außer daß sie den gleichen Typ haben.

Code:
//structs.h

struct INITSTRUCT{

double wert1;
double wert2;
usw.
};

//extern-deklaration
extern struct INITSTRUCT init_struct;
Code:
//noname.cpp
#include "structs.h"
.
// Deklaration der Instanz von init_struct
struct INITSTRUCT init_struct;
.
CNoNameApp::InitInstance()
{
.
.
.

fillstruct(&init_struct);
.
.
.
}
Ganz allgemein solltest Du globale Variablen bei der objektorientierten Programmierung vermeiden und nicht objektorientierte und prozedurale Programmierung mischen. Du könntest z.B. die init_struct zu einem Member Deiner Applikationsklasse machen. Auch die Funktion fillstruct sollte dann eine Memberfunktion dieser Klasse sein, genauso, wie eine Funktion zum auslesen dieser struct.
 
meine idee war, dass alle klassen die gleiche instanz der struktur verwenden. deshalb die deklaration in der header-datei.
 
... wenn ich die struktur als klasse bereitstelle. dann bekomme ich doch am ende das gleiche problem, oder?

gruss baeman
 
Hi.
meine idee war, dass alle klassen die gleiche instanz der struktur verwenden. deshalb die deklaration in der header-datei.
Genau das ist das Problem. Erstmal gibt es einen Unterschied zwischen Deklaration und Definition. Du kannst bzw. mußt die Struktur in der Header Datei deklarieren, damit die Deklaration in allen Modulen bekannt ist. Du darfst aber die Variable init_struct nicht in der Header Datei definieren weil dadurch jedes Modul welches die Header Datei inkludiert, eine eigene Instanz der Variable bekommt.

... wenn ich die struktur als klasse bereitstelle. dann bekomme ich doch am ende das gleiche problem, oder?
Das Problem hat nichts damit zu tun ob du da ein struct oder eine Klasse verwendest.

Du solltest allerdings folgendermaßen vorgehen:

  1. struct/class in Header Datei deklarieren
  2. externe Variable in Header Datei deklarieren
  3. Variable in einer C++ Datei definieren

Schau dir dazu am besten nochmal jokey2's Beitrag an.

Gruß
 
Benutzt dein Programm die MFC? Dann definere die struct doch in der Applikationsklasse. Die kannst du von überall bequem ansprechen ( via AfxGetApp() ).

Gruß
MCoder
 
Erstmal danke, hab die Struktur jetzt in der App definiert, und kann mit AfxGetApp() auch
von anderen Klassen aus auf die Struktur zugreifen.

Noch eine Frage bezueglich Strukturen, hoffe die Frage wurde so noch nicht gestellt.

Ich moechte in meiner INITSTRUCT andere Strukturen einbinden, was in C kein Problem darstellt.

Code:
//structs.h

struct INITSTRUCT
{
 double wert1;
 double wert2;
 struct STRUCT1 struct1;
 struct STRUCT2 struct2;
};

struct STRUCT1
{
 double x;
 double y;
};

struct STRUCT1
{
 double a;
 double b;
};
 
Zurück