Aktuelle Zeit: 12.12.2018 18:42

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:08 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Hallo,

ich habe mal eine Frage zu LoadImage():

Doumentation sagt zum Rückgabewert:
Zitat:
Returns nonzero if the image was loaded successfully and zero if the image could not be loaded. If #PB_Any was specified as the #Image parameter then the auto-generated number is returned on success.


Es gibt ja diese zwei Möglichkeiten, ein Bild zu laden:
Code:
;manuelle Vergabe
bla = 0;
If LoadImage(bla, "xyz.png") = 0 : error....

;automatische Vergabe
bla = LoadImage(#PB_Any, "xyz.png");
If bla = 0 : error....


Wird im zweiten Fall auch die ID 0 vergeben? Wenn ja, wie unterscheide ich den Fall vom Fehlerfall?

Und irgendwann habe ich hier mal als Antwort bekommen, dass folgendes zu Speicherverschwendung führt:

Code:
LoadImage(0, "xyz.png")
LoadImage(10000, "xyz2.png")
;Jetzt hat das PB-interne ID-Array 10000 Einträge, wovon nur 2 sinnvoll verwendet werden. 1-9999 sind leer.


Jedoch vergibt die #PB_Any-Variante noch viel größere ID's ohne für mich erkennbares System. Ist das dann nicht Speicherverschwendung hoch 3, wenn zigtausende leere Arrayelemente erzeugt werden?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:17 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Ganz einfach:
Mit #PB_Any bekommst du eigentlich ein PB-internes Handle zurück, also eine Speicheradresse. Die kann niemals 0 sein, aber ist meistens auch sehr hoch. Vergleichbar mit den Rückgabewerten von 'AllocateMemory()'.
Bei der Verwendung von festen IDs erstellt Purebasic intern ein Array und nutzt die übergebene ID als Index in diesem Array. Lädst du also ein Image mit der ID 10000, wird ein Array erstellt, das mindestens 10001 Einträge (inklusive Index 0) hat. Und am Index 10000 wird dann der Pointer zur PB-internen Image-Struktur abgelegt. Deswegen kommt auch eine Compilerwarnung, wenn die übergebene Image-ID zu hoch ist. Dann könnte sie sich irgendwann mit den Pointerwerten beißen.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:18 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
DarkSoul hat geschrieben:
Wenn ja, wie unterscheide ich den Fall vom Fehlerfall?

Du kannst sowohl den Rückgabewert als auch mit IsImage prüfen, ob das Bild erfolgreich geladen wurde.
Beispiel 1:
Code:
EnableExplicit

Define Image
Define Result

UsePNGImageDecoder()

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Result = LoadImage(1, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If Result
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If Image
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf


Beispiel 2:
Code:
EnableExplicit

Define Image

UsePNGImageDecoder()

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
LoadImage(1, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(1)
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(Image)
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf

_________________
BildBildBildBildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:20 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Achso :shock:

Dann ist alles klar.

Also kann man beide Varianten gleichzeitig nutzen? Ich habe immer nur eine Varante verwendet, um Kollisionen zu vermeiden :mrgreen:

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:21 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Ja, gleichzeitiges Nutzen ist kein Problem. :allright:

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:24 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Danke!

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:34 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Variante 4 würde ich vermeiden:
RSBasic hat geschrieben:
...Beispiel 2:
Code:
...
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(Image)
  Debug "Erfolgreich"
...

Wenn man Bibliotheken verwendet oder sonst irgendwie static und dynamic IDs gleichzeitig verwendet werden könnten, dann könnte es ein Image 0 durchaus geben und ein fehlschlagendes LoadImage() wird nicht richtig erkannt, bzw sogar das Image 0 aus einem ganz anderen Kontext gekidnappt und verwendet. Also besser nur den Rückgabewert an sich überprüfen, oder für dynamic IDs IsImage() immer mit <>0 checken.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:43 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Ich persöhnlich nutze (wenn es statisch sein soll) immer Werte erst ab 1...

So kann man einfach gegen Null testen, ohne das man IsGadget oder IsImage usw nutzen muss,
da diese doch langsamer werden können, je mehr Gadgets usw in Benutzung sind.

(Es wird intern ja die komplette Liste durchgeackert bei den IsIrgendwas() Funktionen)

_________________
PureBasic 5.46 LTS / 5.62 (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:48 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Bisonte hat geschrieben:
(Es wird intern ja die komplette Liste durchgeackert bei den IsIrgendwas() Funktionen)

Weißt du das sicher oder wie kommst du drauf? Warum sollte da eine Liste durchgearbeitet werden?
Ich weiß zwar auch nicht wie sie es machen, wenn man ein dynamisch (#PB_Any) angelegtes Objekt hat, es löscht, und dann IsObject() darauf anwendet, aber Listen durcharbeiten kommt mir komisch vor.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu den Image ID's
BeitragVerfasst: 12.02.2018 17:51 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
Mir ist nur bekannt, dass mehr Speicher verbraucht wird, wenn man höhere statische IDs verwendet, da alle freien IDs vorher definiert werden. So war es jedenfalls damals so. Es kann aber auch sein, dass dieses Problem nicht mehr existiert.

_________________
BildBildBildBildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye