Seite 2 von 2

Verfasst: 05.07.2008 07:58
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

Verfasst: 05.07.2008 09:00
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.

Verfasst: 05.07.2008 09:23
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.

Verfasst: 05.07.2008 09:44
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

Verfasst: 05.07.2008 13:02
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.

Verfasst: 05.07.2008 18:06
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:

Verfasst: 05.07.2008 18:53
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)