C Anfänger - Pointer/Speicher Frage



  • Hi, ich probiere von Basic auf C umzusteigen
    und da es ja so schön heißt "learning by doing", hab ich auch schon angefangen
    eine kleine 2D engine zu schreiben.
    allerdings ist mir das mit den pointern noch etwas unklar, folgendes problem:

    ich habe eine TImage struktur:

    struct TImage
    {
    	IDirect3DTexture8 *ptexture;
    };
    

    und 2 funktionen, womit ich texturen laden und freigeben kann, allerdings weiß ich nicht ob das so funktionieren würde.

    mein gedanke ist, das das bild geladen wird und in den speicher gelegt wird,
    dannach wird das lokale image zurückgegeben und zerstört, und an die variable an die ich zurückgebe wird ja neu erstellt, dadurch wird doch zweimal ptexture in den speicher geladen oder?

    sry ich habs grad nicht so mit erklären, aber ich hoffe ihr wisst was ich sagen will.

    TImage LoadImage()
    {
    	TImage image;
    	D3DXCreateTextureFromFile(g_pD3DDevice, "test.bmp", &image.ptexture);
    	return image;
    }
    
    void FreeImage(TImage Image)
    {
    	if(Image.ptexture != NULL)
    		Image.ptexture->Release();
    }
    

    und in der main:

    TImage GFX_Testbild = LoadImage();
    // hier würde die mainloop mit der renderfunktion sein
    FreeImage(GFX_Testbild);
    


  • macht sinn, von den pointern her.

    und wenn ich mir [1] so angucke, stimmt auch der pointer auf einen pointer fuer das d3d dingens (&image.ptexture).

    checke aber besser den returnwert der d3d funktion.

    hab beim schnellen durchforsten der msdn nichts von einem IDirect3DTexture8::Release() gesehen, aber da wirst du mehr als ich wissen.

    [1] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/D3DXCreateTextureFromFile.asp



  • hi danke für deine antwort

    also würde das jetzt heißen das man das so lassen könnte ?
    und zu dem IDirect3DTexture8::Release():
    wenn ich das richtig verstanden habe dann ist
    IDirect3DTexture8 ein abstract von IUnknown
    und Release() eine memberfunktion von IUnknown ("IUnknown::Release()") und somit
    auch in IDirect3DTexture8 verwenbar. 😕
    garnicht mal so leicht das ganze 😃

    [EDITIERT]
    ich glaube ich habs jetzt verstanden:
    &image.ptexture bekommt ja die speicheradresse der textur zugewiesen
    egal ob die lokale zerstört wird oder nicht die textur bleibt ja an der adresse bestehn, somit kann sie ja nicht doppelt erstellt werden
    und wenn ich TImage returne, dann zeigt image.ptexture immer noch auf diese stelle im speicher.

    lieg ich da richtig ?
    [/EDITIERT]

    Gruß Tony



  • das das bild geladen wird und in den speicher gelegt wird,
    dannach wird das lokale image zurückgegeben und zerstört,
    und an die variable an die ich zurückgebe wird ja neu erstellt,
    dadurch wird doch zweimal ptexture in den speicher geladen oder?

    beim return wird eine flache kopie deines "TImage" erzeugt - das neue TImage enthaellt als den gleichen pointer "*ptexture" - das "IDirect3DTexture8" existiert also nur einmal.
    du moechtest aber evtl in erwaegung ziehen, in "FreeImage" Image.ptexture auf NULL zu setzen - zu diesem zwecke muesstest du allerdings einen pointer auf TImage uebergeben, da sonst nur die uebergebene kopie modifiziert wuerde.



  • hellihjb schrieb:

    du moechtest aber evtl in erwaegung ziehen, in "FreeImage" Image.ptexture auf NULL zu setzen - zu diesem zwecke muesstest du allerdings einen pointer auf TImage uebergeben, da sonst nur die uebergebene kopie modifiziert wuerde.

    ja richtig, aber selbst wenn ich eine kopie übergebe, müsste doch trozdem die textur freigegeben werden
    weil ja

    Image.ptexture->Release();
    

    die textur aus der speicheradresse entfernt, somit könnte mein globales TImage auch nicht mehr drauf zugreifen.

    Allerdings hast du recht, er rendert die textur sogar nach dem aufruf von FreeImage
    was mir jetzt kopfschmerzen bereitet

    [EDITIERT]
    OK, vielen dank euch allen, ich hab das mit den pointern und release() falsch verstanden, nach dem ich das OpenBook C von A - Z (Pointer Kapitel) durch hatte, hab ichs jetzt.
    [/EDITIERT]

    Gruss Tony


Anmelden zum Antworten