#PB_Any (-1) ist 100000?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

#PB_Any (-1) ist 100000?

Beitrag von Mok »

N'Abend!

Hab mir gerade einen Code zusammengebastelt (für 'n Spiel).
Ich hab da einfach #PB_Any als #Sprite-Parameter genommen, weil ich noch nicht weiß, wie viele Grafiken ich brauche.
#PB_Any, das weiß doch jedes Kind, hat den Wert -1, warum bricht die Programmausführung bei der markierten Zeile ab? (Mit der Meldung #Image object number is very high (over 100000), are You sure of that?

Code: Alles auswählen

Procedure ResizeSprite(Sprite$, Breite, Hoehe, NeuerName$)
  SpriteID = LoadSprite(#PB_Any,Sprite$)
  LoadImage(SpriteID,Sprite$) ;*********************************
  ResizeImage(SpriteID,Breite,Hoehe)
  SaveImage(SpriteID,NeuerName$)
EndProcedure
Zuletzt geändert von Mok am 12.09.2009 10:50, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ganz einfach weil LoadSprite(#PB_Any,Sprite$) dir nicht -1 zurück gibt, sonden die SpriteNummer die "zufällig" gewählt wurde und die ist nun mal etwas hoch ...

Das einfachste wäre wenn du beides #PB_Any lädtst
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

STARGÅTE hat geschrieben:ganz einfach weil LoadSprite(#PB_Any,Sprite$) dir nicht -1 zurück gibt, sonden die SpriteNummer die "zufällig" gewählt wurde und die ist nun mal etwas hoch ...
Kann es sein, dass das bei PB3.94 noch gefunzt hat :?:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nein.
es funktioniert so wie es ist.

wenn du eine feste Nummer 0 - 100000 wählst, wird mit dieser Nummer als Index ein Verweis angelegt,
in dem das Handle das erzeugten Objektes gespeichert wird.
wenn du #PB_Any verwendest, wird dieses Handle direkt zurückgegeben.

diese Handles kannst du nicht wiederverwenden, Free das Objekt und erzeuge das nächste wieder mit #PB_Any.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ist das nicht eine Debugger Warnung? Die kann man doch Notfalls unter den Compiler-Optionen > Kompillieren/Starten > Warnhinweis-Modus verwenden: Warnungen ignorieren abschalten. Ist zwar nicht so schön was du da machst aber wenn es einen triftigen Grund hat und damit nichts anderem in die Quere kommt kann man es so machen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Mok hat geschrieben:
Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...
entweder du verwechselst da was, oder der Autor hat Mist verzapft.

ein Handle wiederzuverwenden ist äußerst konterproduktiv:
bei der Wiederverwendung wird es nicht als Handle verwendet, sondern als Index auf den internen Table der dann das neue Handle beinhaltet.

Es ist die völlig falsche und ober unsinnigste Verfahrensweise. basta!

es ist vom ganzen Konzept her nicht dafür gemacht, also lass es.

Es ist mir auch egal wo du's herhast, und warum du der Meinung bist, es ginge oder was auch immer.

und wenn man hundert mal die Warnung abschaltet, es ist immer noch Unsinn.

Es ist scheiße, lass es sein.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Kaeru Gaman hat geschrieben:
Mok hat geschrieben:
Kaeru Gaman hat geschrieben:nein.
Sämtlich Codes aus "Programming 2D Scrolling Games" benutzen aber eine ähnliche vorgehensweise und funzten trotzdem :?
Einen Beispielcode kann ich grad nicht posten, da ich das Buch wieder irgendwo verräumt habe...
entweder du verwechselst da was, oder der Autor hat Mist verzapft.

ein Handle wiederzuverwenden ist äußerst konterproduktiv:
bei der Wiederverwendung wird es nicht als Handle verwendet, sondern als Index auf den internen Table der dann das neue Handle beinhaltet.
Das stimmt jetzt aber auch wieder nicht.

Mit PB_Any wird ja ein Index automatisch generiert, der zurückgegeben wird und kein Handle!

Index1 = LoadSprite(#PB_Any, ...)
LoadSprite(Index2, ...)

Spritetabelle:
Index1 - Handle1
Index2 - Handle2

SpriteID/ImageID gibt das Handle zurück.

Da gab es ja anfangs Verwechslungen und ich dachte wir hätten das mittlerweile geklärt, dass Load ... #PB_Any nie die SpriteID/ImageID zurückgibt.

Und so ein Unsinn ist das garnicht die Warnungen abzuschalten. Angenommen du programmierst irgendwas mit einer hohen Anzahl von Sprites und bist gezwungen über die 10000er Grenze hinauszugehen mit den Indizes, auch wenn du nicht alle gleichzeitig geladen hast, dann ist es doch völlig in Ordnung die Compiler-Warnungen zu unterdrücken.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

oh konträr, Mondamin!

Code: Alles auswählen

Debug "Program start"

Delay(20000)

Debug "Create Image"
Number = CreateImage( 99999, 256, 256 )
; Number = CreateImage( #PB_Any, 256, 256 )
Debug Number

Delay(20000)

End
man beobachte in der Prozessliste den Speicherverbrauch.
mit #PB_Any: 1.356 K -> 1.376 K
mit Nummer : 1.356 K -> 2.956 K

Grund: Mit Nummer wird eine Handle-Liste erzeugt, mit Any nicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Hmm gut okay, dann gibt das halt einen Pointer zu einem Strukturierten Speicherbereich zurück die die Informationen beinhaltet (aber nicht die SpriteID/ImageID) aber trotzdem ist in Create...(Index) kein Bereich für gültige Zahlenwerte des Index definiert. Und demnach muss es doch möglich sein CreateImage( 100000, 256, 256 ) auszuführen.

Btw.: Ich heiße nicht Mondamin und das hier ist ein Deutsches Forum ;-) . Wenn du mich beleidigst, dann bitte auf Deutsch. Bin doch keine Backmischung.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten