"state" Machine (Code Information/Optimierung)

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
  • Guten Morgen liebe Breadfishler,


    dieses Tutorial ist eigentlich nur aus Langweile entstanden, aber ich hoffe trotzdem, dass ich einigen von euch noch etwas zeigen kann.
    Das was ich hier nutze, gilt eigentlich nur als Code Optimierung und man muss es nicht zwingend nutzen, aber dennoch zeige ich es euch, einfach damit ihr sowas mal gesehen habt und grob wisst was es macht :)


    Allgemeines:
    Also state ist eigentlich eine Funktion, mit der man gleiche Funktionen mehrmals definieren kann, um sie in verschiedenen Situationen zu nutzen.


    Machen wir mal eine Gegenüberstellung, normal nutzt man ja Variablen, sprich das sähe so aus:


    //Alter Code
    #include <a_samp>
    new var = 0; //Hier deklarieren wir die neue Variable
    main()
    {
    var = 1; //Hier setzen wir den Wert auf 1
    SetTimer("Test", 1000*5, 0);
    }
    forward Test();
    public Test()
    {
    switch(var)
    {
    case 0: print("Falsch !"); //Da der Wert 1 ist und nicht 0 wird das nicht aufgerufen
    case 1: print("Richtig !"); //Das hier wird aufgerufen, da der Wert 1 ist
    }
    }
    Das würde jetzt nach 5 Sekunden "Richtig !" printen ;)


    Mit unserem state Statement, würde es so aussehen:


    //Neuer Code
    #include <a_samp>
    main()
    {
    state call:test; //Hier setzten wie den state "call" auf "test"
    SetTimer("Test", 1000*5, 0);
    }
    forward Test();
    public Test() <call:test1> //Wird nicht aufgerufen, da call nicht "test1" ist sondern "test"
    {
    print("Falsch !");
    }
    public Test() <call:test> //Wird aufgerufen, da call auf "test" ist
    {
    print("Richtig !");
    }
    Hier würde auch nach 5 Sekunden gerpintet werden "Richtig !".


    Grund für die Nutzung:
    Der Grund warum man dies nutzen sollte, ist eigentlich nur die Übersicht :)


    Der extra Callback:
    Ein großes Feature hat dieses Statement noch, es hat nämlich einen eigenen Callback:


    //Nutzung dieses Callbacks
    #include <a_samp>
    main()
    {
    state call:me; //setzten "call" auf "me"
    }
    entry() <call:me> //Erklärung wieso das aufgerufen wird, steht unten drunter:
    {
    print("hi");
    }
    Das würde jetzt sobald "main()" geladen wird "hi" printen, da immer "entry()" aufgerufen wird, sobald man state bla:bla; schreibt und es an das entry anhängt ;)


    Mehrere Definierungen:
    Man kann auch folgendes tun:


    #include <a_samp>
    main()
    {
    state call:Level1; //Setzen "call" auf "Level1"
    state call:Level2; //Setzen "call" jetzt auf "Level2"
    state call:Level3; //Setzen "call" und jetzt auf "Level3"
    }
    public OnGameModeInit() <call:Level1, call:Level2> //Wird nur aufgerufen wenn call Level1 oder Level 2 wäre
    {
    print("Wird leider nicht gerpintet, da call:Level 3 ist und nicht 1 oder 2 !");
    return 1;
    }
    public OnGameModeInit() <call:Level3> //Da call: als letztes Level 3 war/ist, wird das hier aufgerufen:
    {
    print("Juhuuu !");
    return 1;
    }


    Alltags Beispiele:
    Zu guter letzt noch ein paar Beispiele wo man es gebrauchen kann ;)
    Allgemein kann man es nur für Globale Sachen nutzen:


    //Hier ein Beispiel zu dem ooc-Chat
    #include <a_samp>
    #include <ocmd>
    main() {
    state oState:none; //Setzen "oState" auf "none"
    }


    ocmd:oooc(playerid, params[]) <oState:none> //Wird zuerst aufgerufen, da "oState" auf "none" ist
    {
    #pragma unused params
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,-1,"Du bist kein Admin !");
    oState:aktiv; //Setzen "oState" auf "aktiv"
    SendClientMessageToAll(-1,"Ein Admin hat den ooc-Chat aktiviert !");
    return 1;
    }
    ocmd:oooc(playerid, params[]) <oState:aktiv> //Wird absofort aufgerufen, da "oState" auf "aktiv" ja ist
    {
    #pragma unused params
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,-1,"Du bist kein Admin !");
    oState:none;
    SendClientMessageToAll(-1,"Ein Admin hat den ooc-Chat deaktiviert !");
    return 1;
    }
    ocmd:o(playerid, params[]) <oState:none> return SendClientMessage(playerid,-1,"Der ooc-Chat ist momentan deaktiviert !"); // Wenn "oState" auf "none" ist


    ocmd:o(playerid, params[]) <oState:aktiv> //Wenn "oState" auf "aktiv" ist
    {
    new string[128];
    if(sscanf(params,"s",string)) return SendClientMessage(playerid,-1,"/o [text]");
    return SendClientMessageToAll(-1,string);
    }


    Ich hoffe euch hat es ein wenig geholfen und gefallen, würde mich über ein paar Kommentare freuen :)


    mfg. :thumbup:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    3 Mal editiert, zuletzt von Schwabbel ()

  • dennoch versteh ich kein wort davon.


    Mhm...ich habe eigentlich versucht es so gut zu erklären wie es geht :S


    Mhm, lies es evtl nochmal ^^


    Aber danke für die Information :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Was vorallem wichtig ist:
    Wegen diesem Teil gibt es diese seltsamen "unlösbaren" Errors wenn man eine Variable "state" nennen will...
    Hat mich schon viel Zeit gekostet xD


    xD Keywords werden nicht umsonst blau angezeigt bei pawno. Daher kann man sich schon denken das solch eine bennung einen besonderen stellenwert hat.


    Zum Tutorial muss ich sagen ih kannte das ganze schon seit einer längeren Zeit habe ja auch Kaliber mal darauf auch aufmerksam gemacht :D
    und nutzt es auch in manchen fällen selbst.
    Dein Alltagsbeispiel hättest du anderes gestalten können meiner meinung nach.
    Das man wenn man den o chat aktiviert hat automatisch bei OnPlayerText im o-chat schreibt, wäre meines erachtens sinnvoller gewesen.
    Aber nun gut das kann jeder selbst entscheiden was im zur verwendung sinnvoll erscheint.
    Was mich hier etwas stört ist warum hier auch nicht beschrieben wird warum dies hier schneller ist. Ich mag generell keine Tutorials die
    auf dem "es ist halt so" Aspekt aufbauen.



    Mehr kann man auch nochmal hier nachlesen im "orginalen" Tutorial ( dies hier ist eher mehr eine veranschaulichung)
    http://forum.sa-mp.com/showthread.php?t=86850

  • ( dies hier ist eher mehr eine veranschaulichung)


    Ja, halt ein Tutorial, wie man es benutzt keine Fachgerechte Erklärung wie es funktioniert ^^


    xD Keywords werden nicht umsonst blau angezeigt bei pawno.


    Da ist das Problem, was ich besonders schade finde, wird nicht blau angezeigt :(


    Was mich hier etwas stört ist warum hier auch nicht beschrieben wird warum dies hier schneller ist.


    Ja, da konnte ich nicht speziell drauf eingehen, da das nichtmal in der Pawno.pdf richtig erklärt wurde, aber so wie ich das mitbekommen habe ist es schneller weil es mit "native Speed" arbeitet ^^


    Aber danke für dein Feedback :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • xD Keywords werden nicht umsonst blau angezeigt bei pawno. Daher kann man sich schon denken das solch eine bennung einen besonderen stellenwert hat.


    Kann man eben nicht, da Pawno kein eigenes PAWN Syntax Highlighting hat sondern das Syntax Highlighting von C/C++, und da ist das kein Keyword.
    Und bei Pawnfox habe ich es vergessen als Keyword zu markieren :D

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Kann man eben nicht, da Pawno kein eigenes PAWN Syntax Highlighting hat sondern das Syntax Highlighting von C/C++, und da ist das kein Keyword.
    Und bei Pawnfox habe ich es vergessen als Keyword zu markieren :D


    Anthrax schon hast du eine idee für ein update von PawnFox ^^ oder du verwendest es privat


    Nun gut zu der Sache zu den Keywords in Notepad ++ wird es angezeigt jetzt für state in pawno habt ihr recht da wird das leider nicht angezeigt
    mein fehler bin gerade nur davon ausgegangen die Datentypen werden auch angenommen char , int , float und co

  • nichtmal auf obwohl das auch sehr interessant ist als auch das man bedingungen hinzufügen kann


    Stimmt nicht, ist doch oben aufgeführt schau mal genauer ;)




    state (a == 2) a:b


    oder


    state (c == 1)a:b


    Das hat mit state doch gar nichts zu tun, das sind doch nur Operatoren, alias if-Abfragen :D


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Stimmt nicht, ist doch oben aufgeführt schau mal genauer ;)



    Das hat mit state doch gar nichts zu tun, das sind doch nur Operatoren, alias if-Abfragen :D


    mfg. :thumbup:


    == ist ein Operator
    dennoch ist (c == 1) eine Bedingung welche den automata auf den neuen state setzt


    state call:test1;
    state (c == 1) call:test;



    forward Test();
    public Test() <call:test1>
    {
    print("Falsch !");
    }
    public Test() <call:test>
    {
    print("Richtig !");
    }


    also was wird aufgerufen wenn du eine die variabel c deklarierst mit dem wert 1