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

11

29.05.2004, 17:36

Du muss __declspec(dllexport) sowohl vor der Deklaration also auch vor der Definition schreiben. Die Fehlermeldung weis darauf hin das du das nicht vor der Definition gemacht hast.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

12

29.05.2004, 19:50

Nein! Ich habe __declspec(dllexport) sowohl bei der Definition als auch bei der Deklaration geschrieben! Der Compiler kompiliert erst die Header der DLL (die wird ja in die DLL-CPP-Datei eingebunden), dann tritt auch schon der Fehler auf! Er schaut sich gar nicht erst die Definition an!

Nach der Fehlermeldung sagt er dann: Siehe Deklaration von 'new' und verweist auf eine temporäre Datei, die (wer hätte es gedacht?) gar nicht mehr existiert!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

13

29.05.2004, 20:06

ahh...ich glaub ich weis wo der Fehler liegt. Du hast die selbe Definition des bestehenden new/delete Operators genommen. Das mag der Compiler nicht. Du must die Parameterliste leicht ändern. Das Problem hatte ich auch schon. Der Compiler denkt das du den bestehenden new/delete Operator exportieren willst.


Falls dir das alles zu Kompliziert wird, kannst du auch meinen Memory Manager der GTL nehmen. Da ist alles bereits fertig.
Download unter http://www.dragon-master.net/projects/gtl/index.php?site=download
GTL ins Projekt einbinden, die gtlnew.h überall einfügen und wenn du keinen Memory Pool verwenden willst, einfach vor gtlnew.h #define _DO_NOT_USE_MEMORY_MANAGER entippen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

14

29.05.2004, 21:05

1) Wie sieht's rechtlich mit GTL aus? Darf ich es frei verwenden, in meine Spiele einbauen, muss ich Urheber nennen etc.?
2) Heißt das, ohne _DO_NOT_USE_MEMORY_MANAGER wird immer Speicher in einem Modul verwendet?
3) Was bedeutet "Parameterliste leicht ändern"? Wie muss ich sie ändern? Und die STL-Objekte benutzen trotzdem diese Operatoren?
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

15

30.05.2004, 00:44

Zu 1) GTL ist zwar nicht OpenSource aber man darf sie frei im Projekt verwenden :)

Zu 2) Die GTL Implementiert sowohl einen Tracker als auch einen Memory Pool. Der Tracker sammelt nur den Speicher und prüft am ende ob alles freigegeben wurde. Wenn dem nicht so ist wird eine Meldung ausgegeben und der Speicher freigegeben. Der Memory Pool legt einen großen Speicherbereich an (z.B. 10MB) und in diesen werden dann alle Objekte eingelagert. Auch die STL Objekte. Mit _DO_NOT_USE_MEMORY_MANAGER wird verhindert das einige Konstanten Definiert und auch die Überladung des new/delete Operators durchgeführt wird um diesen Memory Pool zu verwenden.
Den Tracker kann man auf die selbe Art ausschalten. So kann man z.B. den Memory Pool benutzen und gleichzeitig den Std new/delete Operator nutzen.

Zu 3) Die Std. Implementierung des new Operators erwartet einen size_t Typ als Parameter und der delete Operator ein void*. Wenn du die gleiche Parameterliste hast, kommt es ebenfalls zu diesem Fehler. Du musst dann einen weiteren Parameter beifügen. Z.b. ein const char* und int für Datei und Zeile. Das hielft dann auch beim Debuggen :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

16

30.05.2004, 15:26

Also...

1) Ist die GTL zu neu für mich? Ich habe Visual Studio 6.0 mit dementsprechender STL. Aber die Datei "hash_map" gibt's bei VC98\Include nicht!

Ich habe die ganze Platte durchsucht und tatsächlich solch eine Datei gefunden, allerdings zu einer anderen Entw.-Umgebung (Dev-C++), di dann natürlich nicht MSVC++ passt. Als ich den inlcude für die Datei dann auskommentiert habe (nach dem Motto "werd' ich schon nicht brauchen"), ließ sich alles kompilieren, nur konnte nun bei Programmstart eine bestimmte DLL (nicht[\b] gtl(d).dll) nicht geladen werden...

Hab ich Pech, bin ich blöd, oder was auch immer :crying:

2) Wäre eine Lösung für mein Problem nicht einfach, von der DLL Funktionen zu exportieren, die sich wie new und delete verhalten, aber von jedem Modul durch eine lokale inline-Überladung der Operatoren new u. delete aufgerufen werden?

Danke für die Mühe,
Till
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

17

30.05.2004, 15:48

zu 1) Die GTL wurde mit VC++ .NET erstellt. Und es ist tatsächlich so das die STL bei VC++ 6 unvollständig ist. Die hash_map gehört leider zu den fehlenden Klassen.


zu 2) So hab ich es auch mit meinem Memory Management gemacht ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

18

31.05.2004, 20:15

Schade...

Dann kann ich GTL wohl vergessen (oder gibt es irgend ein VC++6 Update?), sie sah ganz praktsich aus :crying:

Aber mit der Methode von vorhin hat's schließlich geklappt! (Und ein ungewollter Memory Manager schadet dem Projekt auch nicht :) )

OK, Danke für die Hilfe, sonst wäre mein ganzes Projekt (3 Monate bis jetzt) ins Wackeln gekommen!

mfG,
Till
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

19

31.05.2004, 20:27

Steig einfach auf VC++ .NET um. Dann hast du auch keine Probleme mehr, da VC++ .NET auch die 6er Projekte einlesen kann.

Wenn man nicht unbedingt das gesamte Studiopacket haben will, ist die Std. Version von VC++ .NET auch nicht so teuer. Preis ist anehmbar. Oder du nimmst STLPort.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige