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

Anonymous

unregistriert

1

20.11.2003, 21:58

Einheitlichkeit in der Tribase-Engine, ne Frage an den Autor

Hallo, :) :) :) :)

Im Forum habe ich gelesen, dass David aufgrund einfacherer Handhabungen mit konstanten Referenzen arbeitet. Warum macht er das dann nicht auch bei Rückgabewerten, welche größer als ein Byte sind?
??? ??? ??? ???

'was anderes:
Warum kann der Tribase Speichermanager, soll er doch sichereres Programmieren gewährleisten, nicht korrekt mit Klassen arbeiten? (Ich habe selbst einen Speichermanager programmiert, der dies kann (nach viel Mühsal)).


Zur Info: So kann man dass machen: Man hat 'ne Funktion zur Speicherreservierung, der man ein mit new erzeugtes Objekt übergibt. Dieses wird dann in einen gemanagten Speicherbereich kopiert, und mit ::operator delete freigegeben ohne seinen Konstruktor aufzurufen, und der gemanagte Speicher zurückgegeben, ungefähr so:

template <typename TTyp> inline TTyp* sgNewP(TTyp*& p,
TTyp* pInitWith)
{
//gemanagten Bereich anfordern:
p=(TTyp *)sgGetPMemory()->NewP(sizeof(TTyp));
//pInitWith in den gemanagten Bereich kopieren:
memcpy(p,pInitWith,sizeof(TTyp));

//deallciating pInitWith without calling it's destructor:
::operator delete(pInitWith);
return p;
}

Das freigeben ist wohl kein Problem, da man destruktoren explizit aufrufen kann.

Was sagt der Autor zu dieser Lösung?

Harre auf Antwort! :) :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.11.2003, 22:32

Hallo, hier der Autor,

"größer als 1 Byte" ist Unsinn, wenn dann "größer als 4 Bytes", das macht Sinn... werde ich auch in der 2. Auflage ändern.
Kann Dein Speicher-Manager auch Arrays reservieren? Also z.B. char[1000]?

Anonymous

unregistriert

3

21.11.2003, 13:33

Antwort Betreff Speicher-Manager

Zitat

Kann Dein Speicher-Manager auch Arrays reservieren? Also z.B. char[1000]?


Ja, auch das kann der Speicher-Manager.
:) :) :) :) :) :) :)
Da bei Arrays sowieso nur der Standart-Konstruktor aufgerufen wird, lässt sich dies leicht bewerkstelligen (im Template: Der Speicher-Manager kann nur mit void-Zeigern arbeiten, anders geht's nicht. Die Hauptfunktionalität und einfache Handhabung wird durch Template-Funktionen garantiert, wie z.B. die aus meinem letzten Beitrag). Zurück zum Template für's Erzeugen eines Arrays. Ich bin grad nicht daheim, kann daher den Quellcode nicht senden. Bei Interesse kann ich ihn aber mal mailen. Eine grobe Beschreibung: Das Template fordert gemanagten Speicher für X Zeiger auf Objekte an, erzeugt mit new X Objekte (Standart-Konstruktor) kopiert diese hintereinander in den gemanagten Speicherbereich und gibt den gemanagten Bereich zurück.

apropos: kann man eigentlich eine Template Funktion als Member einer nicht-Template-Klasse Deklarieren?? ??? ???
Ich hab schon alles versucht, es scheint nicht zu gehen. Im Falle des Speicher-Managers würde es aber vieles vereinfachen.

In Deinem Beitrag befinden sich noch Fehler.
Bitte bearbeite die rot markierten Stellen und lösche diesen Text.

4

21.11.2003, 20:10

Zitat

apropos: kann man eigentlich eine Template Funktion als Member einer nicht-Template-Klasse Deklarieren??
Ich hab schon alles versucht, es scheint nicht zu gehen. Im Falle des Speicher-Managers würde es aber vieles vereinfachen.

Doch das geht.

Quellcode

1
2
3
4
5
6
7
8
class MyClass
{
public:
  template<class T> void MyMember(const T& p)
  {
     // mache was mit Parameter p;
  }
};
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

5

23.11.2003, 10:39

template Funktionen als Member

Klar geht das mit den Template Funktionen. Probleme gibt es aber, wenn die Klasse mit __declspec(dllexport) deklariert wird. Der Kompiler setzt das ja dann vor jede Member-Funktion. Ruft man nun die Template-Memberfunktion in einem Programm auf erntet man eine saftige Fehlermeldung.

:crying: :crying: :crying: :crying: :crying: :crying:

Wie soll ich das lösen?? ??? ??? ??? ???

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

23.11.2003, 11:05

Template-Klassen sind doch eh in den Header-Dateien und brauchen daher auch kein "__declspec(dllexport)"-Deklaration! Sie werden ja garnicht mit in die DLL geschrieben, sondern werden erst in der Anwendung kompiliert, wenn man eine spezifische Version (also einen konkreten Type-Parameter) anfordert.

7

23.11.2003, 11:40

@Davis
Und was ist wenn man den Konkreten Typ erst in einem anderen Programm, welches die Library linkt anfordert? Ich glaube das war sein Problem!

@Samuel_G
Templatefunktionen können nicht exportiert werden. Das ist ne ganz knifflige Sache und wird nur von ganz wenigen compilern unterstützt. Such mal mit google danach.
Ein Gespenst geht um in Europa...

8

24.11.2003, 19:24

Wie soll man ein Template Exportieren? Ich mein der Compiler muss ja wissen wie die Funktion oder halt auch Klasse (je nach dem) aufgebaut ist.

Naja...in vielen Situationen waehr es schon sehr Praktisch wenn man ein Template wie eine Normale Funktion/Klasse exportieren koennte.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

9

24.11.2003, 20:36

Zur Klarheit

:rolleyes: :rolleyes: :rolleyes:
Es scheint ein Missverständnis vorzuliegen. Hier nochmal die Situation:

Es existiert eine Nicht-Template-Klasse, welche exportiert wird. Sie hat als Member eine Template-Funktion.

Ungefähr so:

class SG_API CClass
{
public:
template<typename TTyp> Func(TTyp* p);
};


Wird jetzt die Template Funktion aufgerufen, giebt es einen Fehler.

pClass->Func(p); //fehler!!

:crying: :crying: :crying: :crying:
Die Funktion kann nicht mit aufgelöst werden. Der Kompiler spricht hier von der Funktion als __declspec(dllexport), das heißt, er rafft nicht, dass es sich um ein Template handelt, welches er für den jeweiligen Typ neu Kompilieren muss!

:help: :help: :help: :help:

Slendroth

Frischling

Beiträge: 66

Wohnort: Heidelberg

Beruf: Schüler

  • Private Nachricht senden

10

25.11.2003, 15:03

Wieso machst du aus der Klasse nicht einfach ne Template-Klasse ?
Einer Gesellschaft, die man damit unterhalten kann, dass zwei Menschen einen
Ball hin- und herschlagen, ist alles zuzutrauen

-- Nicht denken! Wissen! --

Visit klamm.de

Werbeanzeige