Constant-Enumeration

Previous topic - Next topic

UserWithoutGLBasic

English:

I'm new to GLBasic and still trying out with the free version, had already a couple of basic languages and now I want to port one of my older progs to GLBasic for some training-purposes. Now I'm used to replace all unreadable numeral through plain, readable text, that's why I like to use a lot of "Constants". Guess what follows:
It would be great if one could enumerate those somehow as described in the code below 
(where StartConstants + EndConstants are just imaginary statements, could be done using GlobalConstants and LocalConstants to get it in perfection)

Deutsch:

Ich bin ganz neu bei GLBasic und "übe" noch mit der kostenlosen Version, habe aber bereits mit vielen anderen Basic-Dialekten herumprogrammiert und wollte nun eines meiner Fremd-Basic-Programme portieren um GLBasic etwas näher kennenzulernen.  Da ich es gewohnt bin alle Zahlen möglichst durch lesbaren Text zu ersetzen benutze ich sehr gerne viele "Constants". Ihr könnt Euch denken was jetzt kommt:
Es wäre schön, wenn man am Anfang seine Konstanten automatisch durchnummerieren lassen könnte, es wäre genial, wenn es z.b. so ginge
(StartConstants + EndConstants sind jetzt mal imaginäre neue Befehle, genauso gut könnte man das auch noch auf GlobalConstants und LocalConstants ausweiten um es perfekt zu machen)


Code (glbasic) Select

StartConstants  Direction
    Forward = 1
    Left
    Backward
    Right
EndConstants


English:

"Left" would get assigned a 2, "Backward" 3 etc.

In code one could read "Direction.Forward" and knows exactly what is meant.
Assigning 1 at "Forward" will overwrite the default-starting-value of 0 in an enumeration. User should be able to assign any (integer) so the following element gets increased by 1 assuming the current lines value, so "Left" gets assigned a 2.

But would be enough with just single-words with no dots to classify them, as in the code below:
   
Deutsch:

"Left" hätte automatisch den Wert 2, "Backward" 3 usw.

Im Code könnte man dann mit "Direction.Forward" sehr genau erkennen was gemeint ist.
Das Zuweisen der 1 für "Forward" überschreibt den Default-Start mit 0 einer Enumeration. Man sollte jeglichen (integer) Wert zuweisen können, darauf folgende Elemente werden um 1 erhöht - vom gegenwärtigen Wert ausgehend, also "Left" bekäme automatisch 'ne 2.

Es wäre aber bereits ausreichend wenn man nur einzelne Worte definieren könnte, dann würde man das eben einfach so schreiben:

Code (glbasic) Select

Enumerate
  Sprite_Player
  Sprite_Enemy
  Sprite_Bullet
// ...
  Sprite_LAST
EndEnumerate
Global mySprite[Sprite_LAST] AS t_SpriteProperties
// wobei t_SpriteProperties mal ein beliebiger, bestehender TYPE ist
// where t_SpriteProperties is some existing sample TYPE



if I squeeze some in before Sprite_LAST later, the dimensioning and enumerating is done all right by default
btw. It'll surely make only sense for Integer-Constants to enumerate them
   
wenn ich nun vor Sprite_LAST noch welche einschiebe ist alles automatisch richtig nummeriert, dimensioniert etc.
nebenbei bemerkt macht das Ganze sicherlich nur Sinn für Ganzzahlen-Konstanten 



Quentin

ENUM gibts leider noch nicht in GLBasic. Du kannst dir ja mit einem TYPE behelfen, der dir das gewünschte liefert, müsstest allerdings alle Aufzählungen explizit mit Werten versehen. Das wäre halt die Mehrarbeit.

Code (glbasic) Select

TYPE tDirection
forward = 1
backward = 2
left = 3
right = 4
ENDTYPE


LOCAL direction AS tDirection

STDOUT "Vorwaerts:   " + direction.forward + "\n"
STDOUT "Rueckwaerts: " + direction.backward + "\n"
STDOUT "Links:       " + direction.left + "\n"
STDOUT "Rechts:      " + direction.right + "\n"

KEYWAIT

UserWithoutGLBasic

#2
Quote
ENUM gibts leider noch nicht in GLBasic.
Deswegen ja mein request :D
Und die Mehrarbeit wollte ich mir doch gerade dadurch ersparen
- denn wenn ich noch neue Elemente einfügen würde, z.B. Up und Down und die noch vor allen anderen stehen sollen muss ich manuell alles umnummerieren. Gefällt's mir dann nicht und ich nehme Up+ Down raus krieg ich schon 'ne mittlere Krise weil ich ja nochmal alles umnummerieren muss...

:? ... ein Type enthält aber doch Variablen die den (Variablen-)Speicher belegen.
Constants werden sicher vor dem Compilieren durch reelle Werte ersetzt.


kanonet

Hmm, ich sehe zwar wofür man es nutzen könnte, glaube aber nicht, dass es wirklich nötig ist, zumindest gibt es Sachen die deutlich nötiger sind.

Übrigens für SpriteIDs gibt es GENSPRITE dass automatisch die nächste freie ID auswählt. Gleiches gilt für Sounds, etc...
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

UserWithoutGLBasic

#4
Quote from: kanonet on 2013-Mar-05
Hmm, ich sehe zwar wofür man es nutzen könnte, glaube aber nicht, dass es wirklich nötig ist, zumindest gibt es Sachen die deutlich nötiger sind.

Übrigens für SpriteIDs gibt es GENSPRITE dass automatisch die nächste freie ID auswählt. Gleiches gilt für Sounds, etc...
Sprites waren nur ein Beispiel. Ich könnte genausogut die Controls in einem GUI so nummerieren uvm. Zudem wäre die SpriteID sicher nur ein Wert den ich im Type zum jeweiligen Steuerelement speichern würde und dann könnte sich das z.B. so lesen:

Code (glbasic) Select

myControl[Control.ButtonOK].SpriteID = GenSprite()
myControl[Control.ButtonCancel].SpriteID = GenSprite()
myControl[Control.ButtonExit].SpriteID = GenSprite()
// ...
DrawSprite myControl[Control.ButtonExit].SpriteID, myControl[Control.ButtonExit].X, myControl[Control.ButtonExit].Y
// etc.

kanonet

Genau genommen würde das so nicht mal funktionieren. Du kannst 10 mal hintereinander GENSPRITE aufrufen und wirst 10 mal die gleiche Nummer zurück bekommen. Du musst GENSPRITE-LOADSPRITE-GENSPRITE-LOADSPRITE etc... aufrufen, GENSPRITE gibt die nächste freie ID zurück, fragst du eine ID ab und lädst dann kein Sprite auf diese ID ist sie beim nächsten GENSPRITE immer noch leer und wird folglich wieder zurück gegeben.
Im übrigen wäre es wirklich ein 'dirty hack' SpriteIDs für controlls zu nutzen, mal ganz davon abgesehen, dass dies ja nichts mit CONSTANTs zutun hätte, sondern ganz normal als Integers gespeichert werden würde.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

UserWithoutGLBasic

 :zzz:
Es war ja nur ein Beispiel und ist sowieso kein funktionierender Code!
Zwischen den GenSprite()-Aufrufen hätte ich sicher noch etwas stehen was z.B. etwas auf die Oberflächen der Sprites malt oder lädt- das ist doch wohl total egal. Und was ist "Dirty Hack" wenn ich Sprites als Buttons verwenden und jedem Button einen Namen geben möchte (die Konstante steht oben in den eckigen Klammern!).
Vieleicht kriegt jeder Button auch 4 Sprites, einen für gedrückt, einen für nicht gedrückt, einen für disabled, einen für Maus-drüber...
Und wenn ich noch einen Button dazufügen bzw. einschieben will muss ich komplett neu durchnummerieren?

Es geht auch überhaupt nicht um's Detail wofür ich Konstanten verwende - nämlich so gut wie alles was in meinem Programm feststehende Werte sind. Denen geb ich einen Namen. Was weiss ich denn, wofür ich letztes Jahr in irgendeinem If-Satz eine 7 eingesetzt habe?
Momentan nummeriere ich halt meine Konstanten manuell, das geht zwar auch - ist aber wie gesagt sehr unflexibel und umständlich insofern man jedes Mal wenn man ein neues Objekt einschiebt die ganzen folgenden Nummern ändern muss. Ausserdem ist dieses Verfahren sehr Tippfehler-anfällig. 

kanonet

Nun es wäre durchaus nicht falsch, hätte jemand erwartet, dass er erst mal alle SpriteIDs definieren kann und sie erst später verwendet. Wäre denkbar, funktioniert in GLBasic aber nicht. Daher mein Hinweis, nur für den Fall, war ja schließlich aus dem Beispiel nicht ersichtlich, ob dir das klar ist...

Was den 'dirty hack' betrifft hatte ich dich falsch verstanden, obwohl es nicht da steht, hatte ich unterstellt, dass du die SpriteIDs später auch als allgemeine ControlIDs verwenden willst. Mein Fehler.

Natürlich gibt es gar keinen Grund, warum alle Constants umbenannt werden sollten, wenn du einen dazwischen einfügst, was spricht dagegen, dass zwischen Button mit Wert 2 und Button mit Wert 3, Button mit Wert 45 erscheint? Im Kommentar unter/über den CONSTANTs vermerken was die höchste ID ist, Button einfügen mit jener ID und Kommentar korrigieren. Wie gesagt, der Constant Block muss ja keine aufsteigenden Nummern habe, es ist einzig wichtig, dass keine Nummer doppelt auftritt. Alles in allem ohne allzu viel Aufwand machbar, bei entsprechender Disziplin auch nicht zu Fehleranfällig.


Insgesamt würde ich mir anstelle des simplen ENUM eine erweiterte Programmierbarkeit des Preprozessors wünschen, dass man automatisiert Codeteile ersetzen oder einfügen kann, quasi ein kleines Programm dass über den Code läuft, bevor er compiliert wird. Damit könnte dann dein aufsteigendes durchnummerieren der Konstanten erledigt werden, aber auch viel komplexere Dinge.
(Ja ich weiß, dass ich das einfach selbst schreiben und vor dem kompilieren über das Codefile laufen lassen könnte...)
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

UserWithoutGLBasic

Quote from: kanonet on 2013-Mar-05
...Insgesamt würde ich mir anstelle des simplen ENUM eine erweiterte Programmierbarkeit des Preprozessors wünschen..

Dann Requeste das doch bitte in deinem eigenen Thread anstatt den - mir wichtigen - mit solchen Bemerkungen abzuwürgen.
Mir ist es auf jeden Fall so wichtig das ich GLBasic nicht kaufen werde wenn es das nicht hat.

Marmor


Schranz0r

sehe da wenig Chancen, dass da was in der Richtung kommt.  :x
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

kanonet

Hatte nicht vor deine Request abzuwürgen, sehe nichts, was dagegen spricht über ein Request zu diskutieren, Alternativen oder Workarounds aufzuzeigen, oder eigene Ergänzungen/weiterführende Wünsche zu äußern, die sich eben aus dem ursprünglichen ergeben haben. Allgemein gesprochen.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Denke mal es wurde alles gesagt.
Bevor hier noch weiter gestichelt wird, mache ich zu! :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard