inputtext in zahl umwandeln, wie?
also
ich möchte per inputtext eine variable die mit #define objecte 5000
setzen
hätte mir das so vorgestellt:
#undefined objecte
#define objecte inputtext
blos das geht ja nicht...
wie soll ich das machen?
inputtext in zahl umwandeln, wie?
also
ich möchte per inputtext eine variable die mit #define objecte 5000
setzen
hätte mir das so vorgestellt:
#undefined objecte
#define objecte inputtext
blos das geht ja nicht...
wie soll ich das machen?
So wie ich das von Blackfox mal verstanden habe, muss ein define Wert immer ein static Wert sein, sprich er kann nicht mit einer Variable, String (inputtext) definiert werden.
Du musst die Zahl einfach festlegen, anders geht es nicht.
Aber Blackfox kann dir das sicher auf einer etwas höheren, informelleren, Ebene erklären.
new objee=strval(inputtext);
new message[10];
SendClientMessage(playerid,COLOR_RED,"Deine Objecte Anzahl:");
format(message, sizeof(message), " %d", inputtext);
SendClientMessage(playerid, COLOR_RED, message);
objecte=objee;
vllt. eine möglichkeit... aber mhm.. klappt ned
Zitaterror 022: must be lvalue (non-constant)
warning 215: expression has no effect
Und eben genau der Fehler hier ist das Problem
must be lvalue (non-constant)
Das bedeutet, dass deine definierung nicht gültig ist.
Eben genau aus dem Grund, dass man für diesen Fall #define oder const benutzen muss und diese nicht mir variablen definiert werden können.
ich komm einfach nicht drauf, kann man nicht i-wie sowas wie define machen aber so dass man es dann mit #setdefine oder so xD kp
#undefine objecte
new integer=strval(inputtext);
#define objecte integer
funkt ned
undefindet symbol integer
Ein define lässt sich nicht ändern,da es mehr oder weniger nicht mehr existiert.
#define OBJECTS (5000)
for(new i ; i < OBJECTS ;i++) { }
Beim kompilieren wird direkt überall wo OBJECTS steht dies mit (5000) ersetzt.
for(new i ; i < (5000) ;i++) { }
Wenn du die Zahl ändern willst,dann benutzt lieber ein Variable.
und wie müsste ich das machen wenn die define auserhalb eines public ist?
Was hat es denn mit einem public zu tun? Mir ist sowieso nicht ganz klar wie deine Frage gestellt ist
Präprozessor Direktiven sind solange gültig solange der Code läuft unabhängig davon in welchem Bereich sie erstellt werden, sie bleiben definiert auch
wenn der Code den Bereich verlässt in dem sie erstellt wurden, zum löschen gibt es Funktionen ,,undef´´
Zudem können Präprozessor Eigenschaften nicht verändert werden, diese werden nur einmalig übersetzt & nur für den kompilierungsvorgang beachtet
Sprich sie dienen nur dem Compiler was , in der Ausgabe nützen sie nichts da sie nicht mehr existieren.
Wenn ich es mit ner variable erstelle bekomm ich 1 error
error 008: must be a constant expression; assumed zero
>
new objs[objecte][object], objectesehn[MAX_PLAYERS][objecte], obj[MAX_PLAYERS][objecte] ,TIMER, an=11;
Wenn du versuchst eine nicht konstante als Index für eine Variable zu verwenden sprich für feste Werte klappt das auch nicht.
Das liegt daran das der Compiler den Speicher reserviert der Später nicht geändert werden darf da es sonst zu kritischen Fehlern kommen kann.
blackfox antworte mal icq
Und wie mach ich des dass ich die variable/define setzen kann mit inputtext jetz?
Also der Präprozessor ist Zwischencode der nur im Compiler was bringt , da der Compiler dementsprechend handelt durch diese Makros,
diese werden im Endprodukt nicht einbezogen , weshalb als Index jetzt auch keine nicht Konstanten Werte angenommen werden:
Compiler Ablauf
#define deinmakro 50
new item[deinmakro];
Der Compiler macht daraus
new item[50];
sprich ersetzt den Wert gleich im Speicher, der Bezeichner wird dabei nicht einbezogen & läuft nur in der Cache nebenher danach wird der Präprozessor Code verworfen
genau das gleich passiert hier im Grunde :
#if blabla
// dein Code1
#endif
// dein Code 2
So der Compiler überprüft die Anweisung & das was sein muss , bei Rückgabe = Falsch wird der Code bis dem dazugehörigen #endif nicht mit in den Speicher einbezogen,
sprich es landet nicht im Endprodukt wenn ja dann wird es einbezogen , so nun wird aber der Präprozessor Code nicht mit einbezogen da
es im Endprodukt nicht mehr benötigt wird & die Ausgabe damit nichts anfangen könnte.
Sprich du kannst den Präprozessor während des Ablaufs / während der Laufzeit nicht beeinflussen , es lassen sich nur im Quellcode vorkehrungen treffen,
also Präprozessor = Compiler Optionen.
Compiler Ablauf
Kurz und knapp , du hast keine Möglichkeit den Speicher einer Variable zu verändern jedenfalls nicht in Pawn du musst mit Konstanten Werten arbeiten,
da diese Sprache nicht auf einer JIT Engine arbeitet sondern vorher reserviert & alle Vorkehrungen trifft, wären wir bei Lua & Suqirrel ,
sehe das ganze anders aus da alles nochmal Just in Time kompiliert wird also Live
Wie gesagt der Präprozessor lässt sich während der Laufzeit nicht ändern , er ist Konstant / fest ,
normale Variablen seitens Pawn sind nicht im geschützten Speicher.
new bla = 200;
new index[bla]; // << Fehler Konstante wird erwartet
Der Grund ist, wie gesagt , der Speicher muss eine Konstante Angabe enthalten da er sich während der Laufzeit ebenfalls nicht verändern lässt,
deutlicher :
new var1 = 12;
new var2 = 13;
Im Speicher
nur als Beispiel
so würde sich var1 nun verschieben sprich in der Größe , hier ist die Größe je nach Datentyp festgelegt , in dem Fall Integer
würde diese aber nun Dynamisch den Datentyp ändern würde es verehrende folgen haben,
var1 verschiebt sich nun in den Speicherabschnitt von var2 was Falsche Werte ergeben würden & somit Fatal für den Code wäre
genau gesagt würde der Code hängen oder var2 würde fehlende oder Falsche Werte haben.
daher muss die Angabe Konstant sein , alles muss vorher reserviert werden so kann es auch nicht zu solche Fatalen Fehlern kommen.
grade das hat er erklärt.
also ist es ned möglich und GameStreamer v2 kommt ned raus
Sag Kye das er eine andere Sprache implementieren soll die eine JIT Engine besitzt ,
wo alles während der Laufzeit verarbeitet & zugeteilt wird.