return STRUKTUR ???
-
hallo,
ist es möglich als returnwert eine Struktur zurückzugeben??
also so: return STRUKTUR;und wenn ja, kann ich das auch bei einer Funktion machen, die in einer dll definiert ist??
-
Wie wärs mit ausprobieren?
Du kannst eine Variable vom typ Struktur zurückgeben...
wieso auch nicht?
-
funktioniert das den auch aus Dll's raus, wenn dort der gleiche Strukturtyp wie im Programm definiert wurde?
-
*und wie muss ich die Funktion deklarieren wenn eine Struktur zurückgegeben wird die Integerwerte enthält?
etwa so?int TEST(int);
-
Ausprobieren ist die beste Methode etwas zu lernen!
Nein so:
struct test{ int x; float y; char z; }; test foo(){ test u; u.x=5; u.y=10.4; u.z='A'; return u; }
-
gut das wär geklärt aber wenn ich das in einer dll versuche spuckt der Compiler mir ganze 7 Fehlermeldungen aus.
meine dll sieht so aus ( fals ICH was falsch gemacht habe ):
EXPORT design CALLBACK SetDesign(int x) { if( x == 0 ) { design.edittop = 13 ; design.editleft = 45 ; } return design; }und die dll.h so:
#ifndef EXPORT #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #endif #endif EXPORT design CALLBACK SetDesign(int);
-
ok hab gemerk das da einige Fehler drin sind und bis auf scheinbar 3 behoben:
EXPORT design CALLBACK SetDesign(int x) { if( x == 0 ) { design d; d.edittop = 13 ; d.editleft = 45 ; } return d; }
-
dann lies mal was bei deinen fehlern steht...
da steht sicher dass "d" keine variable ist...
denn wenn du d in einer abfrage definierst ist d auch nur darin gültig und kann somit nicht zurückgegeben werden!
-
das stimmt ich hab d jetzt ausserhalb irgenteiner Funktion definiert und bekomm noch 2 Fehler :
error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'design'
und
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
-
diese beziehen sich auf folgende Zeile:
EXPORT design CALLBACK SetDesign(int x)
-
hier stand blödsinn
-
sollte er aber das ist ja meine Struktur
-
Poste mal den betreffenden Code
-
struct design { int edittop; int editleft; int buttontop; int buttonleft; int texttop; int textleft; int tabletop; int tableleft; int timeformstop; int timeformsleft; }; #ifdef _MANAGED #pragma managed(push, off) #endif design d; int WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved ) { return TRUE; } EXPORT design CALLBACK SetDesign(int x) { if( x == 0 ) { d.edittop = 13 ; d.editleft = 45 ; } return d; } #ifdef _MANAGED #pragma managed(pop) #endif
-
struct design { int edittop; int editleft; int buttontop; int buttonleft; int texttop; int textleft; int tabletop; int tableleft; int timeformstop; int timeformsleft; }; int WINAPI DllMain(HINSTANCE, DWORD, PVOID) { return TRUE; } EXPORT design CALLBACK SetDesign(int x) { design d; if(x == 0 ) { d.edittop = 13; d.editleft = 45; } return d; }... aber wo isn der Sinn?

-
der Sinn soll sein das mir die Dll die Struktur zurückgibt. Das Programm aus dem die Dll aufgerufen werden soll wird die gleiche Struktur definiert bekommen und dann die Werte von der aus der dll annehmen.
Schematisch also so:Programmstruktur = SetDesign(0) ; // Set Design gib ja ne Struktur zurück
So wars gedacht
-
so ich hab jetzt nochmal in nem anderen Buch nachgeguckt und die Schreibweise von dort verwendet und jetzt kann ich die dll kompilieren:
extern "C" { design d; int WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved ) { return TRUE; } __declspec(dllexport) design SetDesign(int x) { if( x == 0 ) { d.edittop = 13 ; d.editleft = 45 ; } return d; } }
-
Die Variable d kannst du ja eh in der SetDesign drinbehalten..nur außerhalb der if-Anweisung

Das war damit gemeint, musst sie ja nicht gleich global setzen
-
jetzt stellt sich noch ein anderes ähnliches Problem. Ich benutze jetzt folgende Schreibweisen und Dateien:
design.dll :
struct design { int edittop; int editleft; int buttontop; int buttonleft; int texttop; int textleft; int tabletop; int tableleft; int timeformstop; int timeformsleft; }; #ifdef _MANAGED #pragma managed(push, off) #endif extern "C" { design d; int WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved ) { return TRUE; } __declspec(dllexport) struct design SetDesign(int x) { if( x == 0 ) { d.edittop = 13 ; d.editleft = 45 ; } return d; } } #ifdef _MANAGED #pragma managed(pop) #endifprogramm.exe :
extern "C" __declspec (dllexport) struct design SetDesign(int); #pragma comment(lib,"design.dll") struct design { int edittop; int editleft; int buttontop; int buttonleft; int texttop; int textleft; int tabletop; int tableleft; int timeformstop; int timeformsleft; }; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); design design; ... LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { design = SetDesign(0) ; ...dabei habe ich natürlich wieder was falsch gemacht denn der Kompiler meldet:
error C2526: 'SetDesign': Funktion mit C-Bindung kann C++-Klasse 'design' nicht zurückgebenerror C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'void' akzeptiert (oder keine geeignete Konvertierung möglich)
.\Lateinübersetzer 4.0.cpp(28): kann 'design &design::operator =(const design &)' sein
bei Anpassung der Argumentliste '(design, void)'Wenn mir da jetzt noch weitergeholfen würde wäre ich überglücklich
-
Pack *alles* in
extern C { ...}-Blöcke.