Konstante in Variable
Übersicht

RAS-SyndromBetreff: Konstante in Variable |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal sorry, wenn ihr das hier schon zum X-ten mal lesen müsst.
(bin bisher hier noch nicht fündig geworden) Zum Problem: Ich habe eine Variable, welche den Namen einer Konstante enthält. Nun möchte ich in ein Array den Wert der Konstante einlesen (über die Variable). Das Array enthält allerdings dann nur den Namen der Konstante (an sich logisch) Meine Frage: Kennt jemand eine Möglichkeit bzw. ein Workaround um dieses Problem zu beseitigen? |
||
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich persönlich habe gerade Probleme mir das vorzustellen ![]() ![]() Hättest du vielleicht Code den du hier posten könntest? (Denn Code sagt mehr als Worte ![]() |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
so kommtst du nicht weiter....
Variablennamen existieren im ausführbarem Programm später gar nicht mehr. Sie existieren nur innerhalb der IDE (da wo du den Code schreibst), damit der Programmierer sich alles besser vorstellen kann. Also ist wahrscheinlich bereits dein Denkansatz falsch. Beschreibe uns mal, was dein Code später können soll. Dann zeigen wir Dir eine Lösung ohne Variablennamen auf. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
in vielen programmiersprachen würde die lösung "refractions" lauten.
damit kann man später noch auf variablen zugriff nehmen. in monkey geht das auf jeden fall - in blitzmax GLAUBE ich auch (kA kann nich wirklich bmax) in bb, bb+ und b3d geht es aber nicht. wenn du es trotzdem unbedingt verwenden willst bleibt dir nur ein workaround: speichere eine art mapping. wie du das machst bleibt dir überlassen, möglich wäre z.b. ein 2 dimensionales array mit je einem String wert "Konstantenname" und einem String, der den entsprechenden Wert enthält. bei der zuweisung später musst du diese map nach dem entsprechenden wert durchsuchen. also z.b. (nicht getestet, aus dem kopf...) Code: [AUSKLAPPEN] maxEntries = 10 Dim Map$ [maxEntries, 2] ; bis zu 10 konstanten können nun gespeichert werden Map$ [1, 1] = "width" Map$ [1, 2] = "1024" Map$ [2, 1] = "height" Map$ [2, 2] = "768" ; 2 Konstanten zugewiesen Print getValue$ ("width") ; Konstante auslesen Function getValue$ (varName$) For x = 1 to maxEntries if Map$ [x, 1] = varName$ then return Map$ [x, 2] Next Return "Variable not found." End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Fragestellung ist mir auch etwas zu abstrakt...
Was für ein Problem willst du damit lösen? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Intressant.
Ich glaube, die möglichkeiten sind in BlitzBasic ziemlich begrenzt wie mir scheint. Erstmal eine andere frage: WARUM muss es eine Konstante sein? Das einzige was mir einfallen würde, um namen (string) und wert (variable) zu verbinden, wären 2 gleichgroße arrays. Einen string array, einen Int array. Die wirst du aber per hand füllen müssen ![]() |
||
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() BlitzBasic: [AUSKLAPPEN] Type tConst eingefallen. Das trifft es eig. ziehmlich gut. |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
RAS-Syndrom |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wow, erstmal danke für eure zahlreichen Tipps.
Das ganze war in der Tat ein Denkfehler, da der Name einer Konstante/Variable ja nicht wirkliche eine Speicheradresse repräsentiert Und dass ich ausgerechnet Konstanten verwende hat folgenden Grund: Im Code verwende ich an diversen Stellen einen Wert. Wenn ich diesen jetzt doch aus irgendeinem Grund ändern wollte, müsste ich jede Stelle im Code suchen und ändern, so brauche ich lediglich den Wert der Konstante ändern (genau dafür sind die Dinger ja da) Werd wohl doch den Umweg über IF nehmen müssen... Trotzdem nochmal Danke für eure Hilfe |
||
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn du einfach nur konstanten verwenden willst macht man das für gewöhnlich so:
Code: [AUSKLAPPEN] Const pi# = 3.14 (...) r = 10 (...) Print 2 * pi# * r ^ 2 (...) da brauchts keine strings die das ganze repräsentieren und hin und her gecastet/sucht/etc. werden ![]() wenn du jetzt später der ansicht ist pi ist doch genau 3 - naja dann änderst du den wert eben oben. einfach alle konstanten am anfang des codes schön zusammengepackt definieren und dann passt das |
||
RAS-Syndrom |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ca. so handhabe ich das auch, aber dann bin ich auf die glorreiche Idee gekommen,
die Bezeichnungen der Konstanten auch in den (externen) Leveldaten zu benutzen, was dazu führt, dass sie nach dem Auslesen als String vorliegen und so nimmt das Unglück seinen Lauf... Wie dem auch sei, jetzt läuft's. |
||
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nur zur formellen klarstellung:
wenn du sie in externen leveldaten verwendest können es keine konstanten mehr sein ![]() konstanten werden 1:1 im später ausführbaren code eingebaut. sprich überall wo pi in deinem quelltext steht steht in der exe später einfach nur 3.14 wenn du daten aus externen dateien liest sind diese zur kompilierzeit nicht bekannt und können somit auch nicht hart eingebaut werden. demnach sind es danach "normale" variablen ![]() und für dieses problem ist in der tat das was ich vorgeschlagen habe oder der type-vorschlag von addi am besten geeignet wenn man keine reflections zur verfügung hat (und das hat man in bb leider nicht) |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
In diesem falle würde ich die Type variante bevorzugen.
Wenn du noch ein paar funktionen rumrum baust, kannst du eine ähnliche struktur nachbauen, wie sie BlitzMax mit dem Type TMap bietet. Aber auch in vielen 3d Libs gibt es eine solche art: Genannt UserData (oder ähnlich) Hier heißt es einfach, String zur identifizierung eines wertes. Also, um eine abgespekte version zu bauen, empfielt sich das Type, welches vorgeschlagen wurde. Dazu brauchst du noch eine kleine setter und eine getter funktion. Nun gehst du wie folgt vor: - erstelle das type / initialisiere / mach, was immer du meinst - Wiederhole: - Erstelle ein Const - Führe dein Set aus (AddConst("pi", pi) - Beim auslesen holst du dir den const wert: - GetConst(toLoad$) ABER: Wie bereits angemerkt, ist es hier keine konstante mehr. Was nun existiert, ist eine variable die den wert der Konstante enthält. Dieser ist theoretisch änderbar ( SetConst("pi", 3) ), aber solange du dich daran hälst, dein SetConst() am anfang nach dem "setzen" der const zu nutzen, hast du nichts zu befürchten. Anyways, wenns jetzt funktioniert: Wie sieht deine lösung aus? Ist evtl für leute intressant, die später über deine frage stolpern. Code bitte! ![]() |
||
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn du ganz sicher gehen willst, dass die werte "konstant" bleiben kannst du
1. jeden neuen wert zu beginn mit einem "null" wert füllen lassen bis er initialisiert wurde (-> erster aufruf von setConst) 2. erneute aufrufe von setConst nicht zulassen (-> wenn der wert der const nicht gleich dem null wert ist wurde er offensichtlich schonmal verändert -> error schmeißen) 3. wenn getConst den Null wert zurückgeben würde ebenfalls einen error schmeißen (-> konstante wurde nie initialisiert) was du für null verwendest bleibt dir überlassen. bei integern wäre z.b. MAX_INT sinnvoll (2^32 -1) |
||
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube mal, das ganze ist so gemeint, dass die Konstanten NICHT aus einer Level-Datei geladen werden, sondern sie nur durch die Leveldatei gebraucht werden. (Keine Ahnung wieso, irgendeine Begründung gibt es da sicherlich.) | ||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau darauf bezog ich mich.
Ich stelle mir das so vor, das es zb eine ini gibt: Code: [AUSKLAPPEN] [Core]
Name = Schwertkämpfer weapon_type = SWRD_LONG damage = 1337 SWRD_LONG wird in diesem fall öfters im code benötigt, zb für Select-Case bäume und schadensberechnungen. Um das ganze ohne if zu lösen, wollte er die CONST namen direkt verwenden. Leider wie bereits festgestellt nicht möglich. Aber: mit meinem ansatz und der erweiterung von BBpro2 könnte man das dann doch übersichtlich lösen. Obgleich die Rechen-arbeit dahinter etwas größer sein dürfte, es handelt sich um eine leveldatei. Und wofür braucht man sowas? Nicht zur laufzeit visualisierung oder sonstwas, sondern zum "in den ram laden" -> sprich, es wird nur einmal der aufwand des finden betriebens. Nun geht man hin, sagt GetIniString(ini, "weapon_type") und füttert den wert in GetConst() - e voila, man kriegt den verbundenen const. namen. Kleine anmerkung zu BBPro2: Wenn ichs richtig verstanden habe, soll jede bekannte constante als namen einmal "eingefügt" werden und mit einem nullwert versehen werden? Wenn man das ganze mit dem type koppelt, kann man vorher einfach alle durchgehen und prüfen, ob bereits ein type mit namen "Pi" existiert. SetConst("pi", pi) ;pürft ob bereits pi irwo gesetzt wurde. wenn nicht, ist alles cool. Isses ja auch. SetConst("pi", 3) ;prüft erneut. Oh mein gott, pi existiert bereits. Error schmeißen^^ GetConst("nicht_Existent") ;prüft, ob er nicht_Existent findet. wenn nicht: NULL wert (zb MAX_INT) zurückgeben und/oder error schmeißen. Muss doch nicht zwangsweise mehrarbeit sein =) |
||
RAS-Syndrom |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal möchte ich mich entschuldigen, wenn ich hier aufgrund meiner Ausdrucksweise für Verwirrung gesorgt habe.
Nova hat die Begebenheit schon recht gut beschrieben, d.h. die Konstante soll nicht mit Hilfe der Level-Datei geändert werden (wie/warum denn auch?), sondern wird lediglich in ihr verwendet, damit auch ein "Standart-User" die Möglichkeit hat, sie zu lesen und verändern, ohne sich mit kryptischen Zahlen auseinandersetzen zu müssen. Der Vorschlag von PhillipK erscheint mir zwar durchaus sinnvoll, aber im Moment denke ich, dass ich (vorerst) bei der IF-Lösung bleiben werde (hat schon seine Gründe) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group