inputtext in zahl umwandeln, wie?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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 :S

    Zitat

    error 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

  • und wie müsste ich das machen wenn die define auserhalb eines public 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´´

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • 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.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Wenn ich es mit ner variable erstelle bekomm ich 1 error :S


    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.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • :/ blackfox antworte mal icq


    Und wie mach ich des dass ich die variable/define setzen kann mit inputtext jetz? 8|

  • 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


    • Kommentare rausschneiden & stellen wie Leerzeichen etc. > Code Optimierung
    • Lexikalische Analyse > Fehler Überprüfung & Zusammensetzung
    • Code wird interpretiert & alles nötige wird definiert / deklariert
    • Code wird vom Compiler umgewandelt & im Speicher zusammengesetzt
    • Binäre Ausgabe erfolgt.


    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

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • 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

    Code
    var1 | var2
    0x8272 | 0x772


    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.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • grade das hat er erklärt.
    also ist es ned möglich und GameStreamer v2 kommt ned raus ;(