Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Pointer-Fragen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 26.01.2015, 11:58    Titel: Pointer-Fragen Antworten mit Zitat

Hallo leute, also immer diese Pointer, die bereiten mir immer wieder Kopfschmerzen.

Es geht in dieser Frage um Image Destroy und das zurücksetzen auf 0
gedacht hatte ich mir folgendes wobei ich jetzt skeptisch geworden bin ob das auch so richtig ist.

z.B.
Code:
Dim As Any Ptr bild = ImageCreate(x,y)

bild = DestroyImage( bild )

Function destroyimage( destroyimagebild As Any Ptr ) As Any Ptr
  ImageDestroy(destroyimagebild)
  Return 0
End Function


Ps: und mir wäre es lieber wenn ich nicht bild = DestroyImage() schreiben müsste, sondern die Function den Übergebenen Wert automatisch auf Null setzt (auch ohne Shared).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 26.01.2015, 12:37    Titel: Antworten mit Zitat

Hallo braesident!

Pointer sind doch etwas herrliches! grinsen

Du könntest den Pointer ByRef übergeben:
Code:
Declare Sub destroyimage(ByRef bild As Any Ptr)

ScreenRes 300,300
Dim As Any Ptr bild = ImageCreate(200,200)
Print bild
destroyimage( bild )
Print bild
Sleep

Sub destroyimage(ByRef bild As Any Ptr )
  ImageDestroy(bild)
  bild = 0
End Sub



Gruß
grindstone

EDIT: In der Referenz ist ein Schreibfehler. Ganz am Anfang des Textes muß es "BYREF" heißen und nicht "BYVAL".
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 26.01.2015, 15:12    Titel: Antworten mit Zitat

Hi,
(Referenz geändert)

Noch eine Lösung mit MACRO
Code:
#Macro DestroyImage(a)
If a Then
  ImageDestroy(a)
  a = 0
EndIf
#EndMacro

ScreenRes 400, 400
Dim As Any Ptr bild = ImageCreate(200,200)
? bild
DestroyImage(bild)
? bild
Sleep

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 26.01.2015, 15:25    Titel: Antworten mit Zitat

danke grindstone und volta

ja Pointer sind schon ne tolle Sache aber ich komm da immer wieder durcheinander. durchgeknallt vor allem wenn ich aus beispielen oder bibliotheken versuche zu rekonstruieren wo was hingeht oder herkommt wie zB:
Code:
Dim As FT_Bitmap Ptr bitmap = @Schrift->glyph->bitmap
Dim As UByte Ptr source = bitmap->buffer

gerade -> bereitet immer wieder probleme. Und immer wenn ich nachgelesen habe und denke jetzt hab ich es verstanden dann bekomm ich es doch nicht hin grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 26.01.2015, 20:00    Titel: Antworten mit Zitat

-> ist nichts anderes als ein Record-Aufruf, wie der Punkt bei 'normalen' Daten, nur hier eben bei Pointern. Da @Schrift ein Pointer ist, kannst du auf sin Record glyph über @Schrift->glyph zugreifen; das ist wieder ein Pointer auf ein UDT mit dem Record bitmap, also Aufruf über @Schrift->glyph->bitmap.

Allerdings sehe ich jetzt den tieferen Sinn nicht, warum man nicht stattdessen Schrift.glyph->bitmap schreibt. Schrift ist ein UDT (kein Pointer) mit dem Record glyph, der deshalb über Schrift.glyph aufgerufen werden kann (glyph selbst aber ist wieder ein Pointer, deswegen geht es danach mit -> weiter).

(Du könntest auch dereferenzieren und *(Schrift.glyph).bitmap schreiben, aber das ist umständlicher und nicht leichter lesbar.)

edit:
ok, falsch, Schrift muss auch ein Pointer sein; @Schrift->glyph->bitmap heißt nämlich nicht (@Schrift)->glyph->bitmap, sondern @(Schrift->glyph->bitmap). Da wird wohl nur der Pointer auf den Pointer übergeben, oder das Record bitmap selbst ist kein Pointer. Müsste man die Datenstruktur kennen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 31.01.2015, 12:57    Titel: Antworten mit Zitat

zu der Datenstruktur kann ich nicht viel sagen. Das Beispiel stammt auf jedenfall aus der Freetype2-bibliothek.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 31.01.2015, 21:39    Titel: Antworten mit Zitat

Die Datenstruktur muss ja in der zugehörigen bi-Datei definiert sein. Schau sie dir ruhig an, dann ist das ganze leichter nachzuvollziehen. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz