Enumeration beginnt statt 0 bei 1?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Enumeration beginnt statt 0 bei 1?

Beitrag von Delle »

Hallo zusammen,

warum ist die SpriteID von #Hintergrund 1, anstatt 0?

Code: Alles auswählen

Enumeration
  
  #Hintergrund
  
  #Figur1
  #Figur2
  #Figur3
  
EndEnumeration

If OpenWindow(100, 0, 0, 1920, 1080, "", #PB_Window_ScreenCentered)
  
  
  If OpenWindowedScreen(WindowID(100), 0, 0, 1920,1080, 0, 0, 0)
    
    SetFrameRate(60)
    
    SpriteQuality(#PB_Sprite_BilinearFiltering)
    
    LoadSprite(#Hintergrund, "hintergrund.png"):Debug SpriteID(#Hintergrund)
    
    LoadSprite(#Figur1, "1.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur1)
    LoadSprite(#Figur2, "2.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur2)
    LoadSprite(#Figur3, "3.png",#PB_Sprite_AlphaBlending):Debug SpriteID(#Figur3)
    
    ...
    
    
Welches Objekt schreibt sich denn als 0 rein? Das Fenster vielleicht? Der Screen?

Ich habe es auch mit expliziten Zuweisungen probiert, auch ohne Erfolg:

Code: Alles auswählen

Enumeration
  
  #Hintergrund = 0
  
  #Figur1 = 1
  #Figur2 = 2
  #Figur3 = 3
   
  EndEnumeration
Hat jemand eine Idee? :cry:
PB 6.30 | Win 11
Benutzeravatar
HeX0R
Beiträge: 3066
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von HeX0R »

Vielleicht geht Dir ja damit ein Licht auf:

Code: Alles auswählen

#Hintergrund = 712
#Figur1      = 99
#Figur2      = 123
#Figur3      = 0
  
InitSprite()
OpenWindowedScreen(OpenWindow(0, 0, 0, 1920, 1080, "", #PB_Window_ScreenCentered), 0, 0, 1920,1080, 0, 0, 0)
CreateSprite(#Hintergrund, 128, 128):Debug SpriteID(#Hintergrund)
CreateSprite(#Figur1, 128, 128):Debug SpriteID(#Figur1)
CreateSprite(#Figur2, 128, 128):Debug SpriteID(#Figur2)
CreateSprite(#Figur3, 128, 128):Debug SpriteID(#Figur3)
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von Delle »

Nee, leider nicht :)

Macht die Enumeration in dem Falle mehr Schaden als Nutzen?

Für mich wäre halt günstig gewesen, wenn #Figur1 auch gleich der SpriteID = 0 entspricht...

Aber so werde ich wohl oder übel für jede Figur die tatsächliche SpriteID in einer Linked List speichern...
PB 6.30 | Win 11
Benutzeravatar
mk-soft
Beiträge: 3894
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von mk-soft »

Du must nicht die SpriteID wissen, sondern nur bei bedarf verwenden. Es ist das OS spezifische Handle, welches auch jeder zeit anders sein kann

Es ist immer besser Enumeration zu verwenden. Und zwar für jeden Objekt Type eine eigene Enumeration. (window, gadgets, images, sprites, etc)
Zum fortsetzen von Object besser Named Enumerations verwenden.

Hierzu siehe in der PB-Hilfe dir den Eintrag PureBasic Objekte an.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von NicTheQuick »

Alle Werte wie SpriteID(), WindowID(), ConnectionID(), ImageID(), usw. liefern immer OS-interne Handles. Die kannst du nicht selbst bestimmen.

Außerdem verstehe ich nicht wie du darauf kommst, dass SpriteID() den Wert aus der Enumeration zurückgeben sollte. Wäre ja komisch, weil dann bräuchte man SpriteID() nicht mehr.
Michael Vogel
Beiträge: 76
Registriert: 16.03.2006 11:20

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von Michael Vogel »

Wie Nic so quick gesagt hat, benötigt es interne Referenzen, die halt nicht immer so 'schön' durchnummeriert werden...

Bei Purebasic-internen IDs sind diese oft netterweise fortlaufende Werte, etwa bei den Sprites. Hier wird allerdings mit Eins begonnen, da - wie in den Hilfeseiten ersichtlich - Fehler durch den Rückgabewert Null angezeigt werden.

Bei Betriebssystem-nahen Befehlen werden normalerweise die entsprechenden Referenzen (Handles) genommen, deren Werte können von Purebasic natürlich nicht beeinflusst werden. Dies merkt man beispielsweise bei OpenWindow, wo ein erneuter Aufruf einen anderen Wert zurückliefert. Im Gegensatz dazu verwendet PureBasic bei einem erneuten CreateSprite die freigewordene ID.

Die gute Nachricht: für einfache Programmierjobs werden diese IDs nicht benötigt, somit muss man sich zu Beginn keine Gedanken darüber machen.

Code: Alles auswählen

InitSprite()
OpenWindowedScreen(OpenWindow(0,0,0,256,256,"",#PB_Window_ScreenCentered),0,0,256,256,0,0,0)
Debug CreateSprite(0,32,32)
Debug CreateSprite(0,32,32)
Debug SpriteID(0)
;
Debug OpenWindow(0,0,0,0,0,"")
Debug OpenWindow(0,0,0,0,0,"")
Debug WindowID(0)
Benutzeravatar
Delle
Beiträge: 1162
Registriert: 10.05.2005 22:48

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von Delle »

Danke für alle Hinweise!

Ich hab die Enumerationen jetzt entfernt und arbeite so:

Code: Alles auswählen

f1 = LoadSprite(#PB_Any, "1.png",#PB_Sprite_AlphaBlending)
AddFigur(1, "Delle", Random(1920), 300+Random(400), "nein", "ja", "nein", f1)
ForEach ...
DisplayTransparentSprite(Figuren()\sprite, Figuren()\x+5, Figuren()\y+5, 90-abschlag, RGB(0,0,0))
f1 = Figuren()\sprite

Die Werte von f1 usw. werden bei der Figur mit in einer LL gespeichert und sind mir (jetzt) herzlich egal, ich glaube es sind jeweils 10-stellige Nummern oder sowas...
PB 6.30 | Win 11
Benutzeravatar
mk-soft
Beiträge: 3894
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von mk-soft »

Jetzt muss du dir die dynamische PB-ID von Sprite (Variable f1) merken und wenn du das Sprite nicht mehr brauchst oder überschreiben willst, das Sprite mit FreeSprite(f1) explizit freigeben. Mit Enumeration kannst du das Sprite direkt überschreiben.

Du hättest auch die Enumeration mit 1 starten können (Wenn es dich stört mit 0 anzufangen). Somit wäre im internen Array für die Sprites der Platz 0 freigeblieben.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Axolotl
Beiträge: 319
Registriert: 31.12.2008 16:34

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von Axolotl »

Meine Gedanken zu Enumeration (Konstanten im Allgemeinen)
Ich verwende immer (außer vllt. in Beispielen) benannte Enumerationen für alle Object-Typen ab 1 (s.Beispiel) und Konstanten. Weil NULL für mich immer und (fast) überall als Fehlerwert gilt.
Anmerkung: Es gibt tatsächlich API-Funktionen wo #ERROR_SUCCESS zurückgegeben wird und dessen Wert ist tatsächlich NULL!
Da mir der eigentilche Wert im weiteren egal ist, und ich immer auch ordenlich auf die Enums oder Konstanten prüfe, könnten sich die Werte sogar zwischen den kompilierungen beliebig oft ändern.....
Nach meiner Meinung ist das ja auch der Sinn von der Verwendung von Enums und Const....
Hinweis: Hilfe zu Handles und Nummern

Code: Alles auswählen

Enumeration EWindow 1 
  #WND_Main 
  ; ..... 
  #WND_Trace 
EndEnumeration

Enumeration EGadget 1 
  #GDT_btnAdd 
  #GDT_btnCancel  
  ; ..... 
  #GDT_edtOutput 
EndEnumeration

; Advantage: Continuation is possible at any time without errors. 
Enumeration EWindow ; continued 
  #WND_Preferences
  ; ..... 
EndEnumeration

Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
mk-soft
Beiträge: 3894
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enumeration beginnt statt 0 bei 1?

Beitrag von mk-soft »

Der Vorteil von Enumerations ist auch das man ein Event Management mit virtuellen Funktionstabellen verbinden kann.
Mache ich zum Beispiel bei meine EventDesigner.

Part of Event Management

Code: Alles auswählen

...
Prototype _MyPrototypeInvoke()

Structure _MyEventInvoke
  Invoke._MyPrototypeInvoke[0]
EndStructure

Global *vTableMyEventSizeWindow._MyEventInvoke = ?vTableMyEventSizeWindow
Global *vTableMyEventCloseWindow._MyEventInvoke = ?vTableMyEventCloseWindow
Global *vTableMyEventMenu._MyEventInvoke = ?vTableMyEventMenu
Global *vTableMyEventGadget._MyEventInvoke = ?vTableMyEventGadget
...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten