#PB_Any - Problem mit Debugger - halb(gelöst)

Anfängerfragen zum Programmieren mit PureBasic.
Little John

Beitrag von Little John »

Kaeru Gaman hat geschrieben:und als Array?

Code: Alles auswählen

Dim Position(#Sprite_H2erXfe0R_tiootal_vpolkl)
X = Position(#Sprite_Budvar)
das ist doch unfug, das führt die verwendung von konstanten ad absurdum.
Wenn man bei der Enumeration standardmäßig Step=1 benutzt (und um keinen Speicherplatz zu verschwenden am besten auch standardmäßig Beginn=0) und dann darauf achtet, für die Array-Dimensionierung den größten in Frage kommenden Wert zu verwenden, dann funktioniert das prima. Beispiel:

Code: Alles auswählen

Enumeration
   #Montag
   #Dienstag
   #Mittwoch
   #Donnerstag
   #Freitag
   #Samstag
   #Sonntag
EndEnumeration

Structure Tag
   wetter.s
   wastun.s
EndStructure

Dim Wochentag.Tag(#Sonntag)

For i = #Montag To #Freitag
   Wochentag(i)\wetter = "noch unsicher"
   Wochentag(i)\wastun = "arbeiten"
Next

For i = #Samstag To #Sonntag
   Wochentag(i)\wetter = "noch unsicher"
   Wochentag(i)\wastun = "feiern"
Next
Was ist daran absurd?

Gruß, Little John
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Was ist daran absurd?

die vorgehensweise an sich.

wenn man konstanten in einer enum benutzt, dann tut man das um
a) keine lücken in seinen nummern zu haben aber
b) sich nicht um die zahlenwerte kümmern muss.

wenn ich eine enumeration habe, kann ich an beliebiger stelle eine weitere
konstante in die enumeration-liste einfügen, auch am anfang oder ende,
und die funktionalität leidet nicht darunter.

der wunsch, das in einer schleife oder gar als array indices zu verwenden,
legt mich darauf fest, die enumerierten konstenten wieder in einen festen
bezug zu den zahlen zu setzen, was die verwendung von Enum überhaupt
negiert, dafür nimmt man dann keine konstanten sondern literale.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@Little John

Da hat der Kaeru Gaman Recht.

Wenn ich bei deiner Enumeration eine Konstante einfüge, wird deine Schleife unsinnig.


Allerdinsg kann ich mir vorstellen, dass es so möglicherweise schon nicht ganz dumm ist.

Code: Alles auswählen

Enumeration 1
 #Montag
 #Dienstag
EndEnumeration

Enumeration 1
  #Gadget1
  #Gadget2
EndEnumeration

Debug #Dienstag
Debug #Gadget1
Debug #Montag
 
 Dim Tag.s(7)
 
 Tag(#Montag)="Montag"
 Tag(#Dienstag)="Thuesday"
 
 For i=#Montag To #Dienstag
   Debug Tag(i)
 Next
Das würde zwar bedeuten, dass man für Montag auch die "1" nehmen kann, aber wenn man sich mal nicht sicher ist, welche Zahl man welchem Tag zugewiesen hat, könnte man das über die Konstante machen.
Kinder an die Macht http://scratch.mit.edu/
Little John

Beitrag von Little John »

Kaeru Gaman hat geschrieben:wenn ich eine enumeration habe, kann ich an beliebiger stelle eine weitere
konstante in die enumeration-liste einfügen, auch am anfang oder ende,
und die funktionalität leidet nicht darunter.
Das geht bei meinem Beispiel auch beinahe. Dass man darauf achten muss, das Array immer ausreichend groß zu dimensionieren ist eine Einschränkung. Dadurch wird das Ganze aber noch nicht ad absurdum geführt, denn bei einer konkreten Anwendung kann es durchaus sein dass am Ende nichts mehr eingefügt werden soll (siehe Beispiel oben).

//edit1: Mir ist gerade eingefallen, wie sich diese Einschränkung auch noch leicht umgehen lässt, nämlich durch Verwendung eines Dummys der immer am Ende der Liste steht.

//edit2: Das geht sogar noch besser, nämlich ohne Dummy, unter Verwendung der reservierten Konstante #PB_Compiler_EnumerationValue:

Code: Alles auswählen

Enumeration
   #Montag
   #Dienstag
   #Mittwoch
   #Donnerstag
   #Freitag
   #Samstag
   #Sonntag
EndEnumeration

Structure Tag
   wetter.s
   wastun.s
EndStructure

Dim Wochentag.Tag(#PB_Compiler_EnumerationValue-1)
Kaeru Gaman hat geschrieben:der wunsch, das in einer schleife oder gar als array indices zu verwenden,
legt mich darauf fest, die enumerierten konstenten wieder in einen festen
bezug zu den zahlen zu setzen,
Allein durch eine Schleife oder ein Array wird das nicht zwangsläufig festgelegt. Es geht v.a. darum, dass die Zahlen in einer bestimmten Reihenfolge auftreten. Wenn beispielsweise jemand einen neuen Wochentag zwischen Dienstag und Mittwoch erfinden würde, könnte man den in mein obiges Beispiel ohne jedes Problem einfügen.
Etwas anderes ist es allerdings, wenn bestimmte Berechnungen durchgeführt werden, die z.B. nur funktionieren wenn #Montag = 0 ist.
Kaeru Gaman hat geschrieben:was die verwendung von Enum überhaupt
negiert, dafür nimmt man dann keine konstanten sondern literale.
Kann man auch nicht so allgemein sagen. Die Verwendung von Konstanten verbessert oft die Lesbarkeit eines Programms beträchtlich, so in meinem obigen Beispiel etwa #Sonntag statt 6. Quasi als Zwischending zwischen Literalen und Enumeration kann man ja aber den Konstanten auch explizit ihre Werte zuweisen, z.B.:

Code: Alles auswählen

#Montag = 0
#Dienstag = 1
Gruß, Little John
Zuletzt geändert von Little John am 05.07.2008 14:16, insgesamt 2-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3040
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:

Beitrag von HeX0R »

Kaeru Gaman hat geschrieben: nicht für die sprites, sondern für die objekthandles.
Richtig, das meinte ich eigentlich, hab mich nur mal wieder falsch ausgedrückt.

Ansonsten gebe ich Little John Recht, ich hatte nur nach Kaerus Antwort keine Lust mehr mich an Erklärungen zu versuchen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

letztendlich ist das dann wohl auch wieder geschmackssache... sprach der Affe und biss in die Seife :lol: :wink:

eine demendsprechend komplexe Enum-Verwaltung kann durchaus
einen Bibliothekenhaften Zugriff auf dutzende Sprites ermöglichen,
wie ich das mit sprechenden nummernkreisen lösen würde.

ich bin halt letzteres gewöhnt, das macht es mir einfacher den überblick zu behalten.
wenn die zuordnung der nummern letztendlich doch eine bedeutung hat,
dann sehe ich sie eben lieber anstatt sie hinter begriffen zu verbergen.

für mich sind auch zahlen nicht zwangsweise abstrakt,
ich kann mit einer zahlenreihe mindestens genausogut umgehen,
wie mit einer reihe begriffen als konstante.

..wenn ich so eine Enum Methode verwenden würde,
würde ich möglicherweise darauf verfallen,
als Konstantennamen sprechende nummerncodes zu verwenden.
#Spr003_4711 :lol:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

also ich hab bei solchen Sachen meistens eine Procedur die mir einen freien Wert ausgibt.

Sieht dann meistens so aus:

Code: Alles auswählen

Global Sprite3d
Procedure makeSpriteID()
Sprite3d+1
ProcedureReturn Sprite3d
EndProcedure

SpriteId=makeSpriteID()
LoadSprite(SpriteId,"...",#PB_Sprite_Texture)
CreateSprite3D(SpriteId,SpriteId)
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Antworten