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

28.07.2003, 13:09

@Hardcore C++ coder

Wie kann man dieses unschöne Makro in eine Funktion umwandeln. Oder wie würdet ihr es machen?

Quellcode

1
2
3
4
5
6
7
#define FESafeRelease(pPointer) {\
                                     if((pPointer) != NULL)\
                                    {\
                                        (pPointer)->Release();\
                                                 (pPointer) = NULL;\
                                             }\
                                 }

2

28.07.2003, 13:40

Da es dieses Komische Release macro ist musste "void*" nehmen also:

void SafeRelease(void *Pointer)
{
if(Pointer)
{
Pointer->Release();
Pointer = NULL;
}
}

Was soll das eigentlich mit Hardcore C++ zu tun haben ? Is ne simple C funktion :)

3

28.07.2003, 14:23

das dumme ist nur das void::Release nicht existiert! :P

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.07.2003, 14:41

Da Release nur auf COM-Schnittstellen funktioniert, ginge es so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
void SafeRelease(IUnknown** ppInterface)
{
    if(ppInterface != NULL)
    {
        if(*ppInterface != NULL)
        {
            (*ppInterface)->Release();
            (*ppInterface) = NULL;
        }
    }
}


Aufrufen tust Du es dann z.B. so:

Quellcode

1
SafeRelease(&pD3DDevice);


Müsste so gehen, bin mir aber nicht ganz sicher. Vielleicht ist noch ein Casting nötig.

@ghostie:
Das auf-NULL-setzen in Deiner Funktion hat garkeine Wirkung, da die Variable in der Funktion lokal ist! Man muss es hier schon mit Doppelzeigern machen!

5

28.07.2003, 14:44

Ach, der Patrick bekommt das bestimmt noch allgemeiner hin ;)

Was meinst du mit doppelZeigern. Wieso hat das keine Wirkung?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.07.2003, 14:51

Zitat von »"_progger_"«

Was meinst du mit doppelZeigern. Wieso hat das keine Wirkung?

Sollte doch klar sein! Schau Dir meine Funktion an.
Dieses Geschreibsel, das ghostie da gepostet hat, kann überhaupt nicht funktionieren. Erstens ja, weil man Release nicht auf einem void-Pointer aufrufen kann und zweitens, weil die Funktion den Zeiger selbst nicht verändern kann, da sie ja als Parameter nur eine Kopie des Zeigers erhält. Folgender Code sollte das klarmachen:

Quellcode

1
2
3
4
5
6
7
void SetzeVariable(int Variable, int Wert)
{
    Variable = Wert;
}

int Test;
SetzeVariable(Test, 100);


Die Variable "Test" hat danach nicht den Wert 100! Genau das tut ghostie aber in seiner Funktion. Er versucht, den Zeiger zu verändern (nämlich ihn auf NULL zu setzen). Und das kann ja so nicht gehen. Dafür braucht man natürlich einen Zeiger auf einen Zeiger, also einen Doppelzeiger. Wie es bei meiner Version auch zu sehen ist.

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

28.07.2003, 15:34

Hi,

Zitat

Ach, der Patrick bekommt das bestimmt noch allgemeiner hin.

;D Danke für das Kompliment :D nee mal im ernst, ich benutz fast die selbe Funktion (wie die von oben) in der EagleX nur halt in einem Namespace und in einer Singleton Klasse :) Denn "allgemeiner" kann man es nun echt net mehr machen :)

So sieht sie aus :)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
 inline void XarentLib::exUtilities::safeRelease(IUnknown** Interface) 
{ 
    if(Interface != NULL) 
    { 
        if(*Interface != NULL) 
        { 
            (*Interface)->Release(); 
            (*Interface) = NULL; 
        } 
    } 
}


@David zum Thema casten:

Zitat


All Component Object Model (COM) objects support an interface called IUnknown. This interface provides Microsoft® DirectX® with control of the object's lifetime and the ability to retrieve other interfaces implemented by the object.

Stammt aus dem DX SDK :) Ich glaube diese beiden Sätze sagen aus, dass nicht gecastet werden muss, da alles von IUnknow abgeleitet wird :)

Gruß,
Patrick :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

28.07.2003, 15:36

Jo. Ist ja witzig, dass unsere Funktionen praktisch exakt gleich aussehen :)

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

28.07.2003, 15:37

@David:
Ich glaub das liegt daran, da es anders nun echt net mehr geht :) ;D

10

28.07.2003, 16:15

ok,
das mit der SetzeVariable Funktion ist schon klar.
So würde es ja gehen

Quellcode

1
SetzeVariable(int *Variable, int Wert)


Aber weil bei FESafeRelease sowieso schon ein Pointer übergeben wird, dachte ich, das da funktioniert.

Werbeanzeige