Include funktioniert nicht richtig?

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
  • Hey leute, ich hab mal wieder ein kleines und stehe grade irgendwie auf dem Schlauch.
    Ich hab mein GameMode jetzt zu übersicht in diverse Includes aufgeteilt.
    Diese PWN-Dateien liste ich alle in einer Datei auf die ich dann in den gamemode Inkludiere.


    Beispiel: Eine dieser "Sammel-Dateien":

    //=================================================================


    // Forwards / Pointer
    forward KickPlayer(playerid);

    //=================================================================


    // Variablen
    #include <..\..\gamemodes\Scripts\System\AntiCheat\Variables\AntiCheatData.pwn>


    //=================================================================


    // Allgemeine Funktionen
    #include <..\..\gamemodes\Scripts\System\AntiCheat\Functions\KickEx.pwn>


    Diese Datei kommt Inkludiere ich anschließend in meinem GameMode.
    Jetzt hab ich aber das Problem, dass Variablen und Forwards nicht übernommen werden.
    Sprich, wenn ich das ganze wie hier gezeigt Inkludiere krieg ich nen Fehler, wenn ich versuche die in der "Variablen-Datei" erstellten Variablen in einem Callback nutzen möchte funktioniert das nicht.
    Auch die Forwards werden nicht akzeptiert, obwohl alles vor dem Inkludieren der Callbacks eingebunden wird.


    Irgendwelche Ideen?

  • obwohl alles vor dem Inkludieren der Callbacks eingebunden wird.

    Reihenfolge beim Inkludieren:
    Variablen > Funktionen > Callbacks


    Hier die Fehlermeldung(en)

    Code
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(1) : warning 235: public function lacks forward declaration (symbol "OnPlayerAccountCheck")
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(4) : error 017: undefined symbol "mysql"
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(6) : error 017: undefined symbol "pUserData"
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(6) : warning 215: expression has no effect
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(6) : error 001: expected token: ";", but found "]"
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(6) : error 029: invalid expression, assumed zero
    SA-MP 0.3.7 Project\pawno\include\..\..\gamemodes\Scripts\Events_Costum\playerEvents\OnPlayerAccountCheck.pwn(6) : fatal error 107: too many error messages on one line
  • Ich geb dir am besten mal alle Dateien:


    Zusammenfassung (Laden eines einzelnden System-Bereiches, hier die Spielerdatenspeicherung)
    //==================================================================================================


    // Pointer
    forward OnPlayerAccountCheck(playerid);


    //==================================================================================================


    // Variables
    #include <..\..\gamemodes\Scripts\System\UserData\Variables\SavingLoadingVariables.pwn>

    //==================================================================================================


    // Account Functions
    #include <..\..\gamemodes\Scripts\System\UserData\Functions\CheckPlayerAccount.pwn>
    #include <..\..\gamemodes\Scripts\System\UserData\Functions\LoadPlayerAccount.pwn>


    Datei mit den Variablen:
    //==================================================================================================


    // Konstanten
    #define PUBTYPE_INT (0)
    #define PUBTYPE_BOOL (1)
    #define PUBTYPE_FLOAT (2)


    //==================================================================================================


    // UserData Storage
    enum _pUserData {
    // Statische Daten
    pID,
    pName[MAX_PLAYER_NAME],
    pPassword[129],
    pPasswordHash[17],
    //Variable Daten
    pAdminLevel,
    }
    new pUserData[MAX_PLAYERS][_pUserData];


    //==================================================================================================


    // UserData Saving System
    enum _pUserDB {
    pubFieldName[56],
    bool:pubSaved,
    pUserData:pubSavedVariable,
    pubFieldType
    }


    new pUserDB[1][_pUserDB] = {
    // Allgemeines
    {"AdminLevel", true, pAdminLevel, PUBTYPE_INT}
    };


    Und der "Callback" für den Account-Check:
    public OnPlayerAccountCheck(playerid)
    {
    new rows, fields;
    cache_get_data(rows, fields, mysql);
    if(rows) {
    GetPlayerName(playerid, pUserData[playerid][pName], MAX_PLAYER_NAME),
    cache_get_field_content(0, "Password", pUserData[playerid][pPassword], mysql, 129),
    cache_get_field_content(0, "PasswordHash", pUserData[playerid][pPasswordHash], mysql, 17),
    pUserData[playerid][playerid][pID] = cache_get_field_content_int(0, "pID"),
    ShowPlayerLoginDialog(playerid);
    }
    else {
    ShowPlayerRegisterDialog(playerid);
    }
    return 1;
    }


    Das ganze wird wie oben zu sehen in folgender Reihenfolge Inkludiert:
    Variablen & Funktionen finden sich zum vereinfachten Inkludieren in einer Datei.
    Der Callback wird als letztes Inkludiert.


    Hier auch noch mal dazu eine Veranschaulichung:
    //=====================================================================================================================
    // Inkludieren aller Systeme
    #include <..\..\gamemodes\Scripts\System\Usefull\loadSystem.pwn>
    #include <..\..\gamemodes\Scripts\System\UserData\loadSystem.pwn>
    #include <..\..\gamemodes\Scripts\System\AntiCheat\loadSystem.pwn>

    //=====================================================================================================================
    // Inkludieren aller Events
    #include <..\..\gamemodes\Scripts\Events_Game\loadGameEvents.pwn>
    #include <..\..\gamemodes\Scripts\Events_Costum\loadCostumEvents.pwn>

    //=====================================================================================================================

  • Markier mal bitte die Fehlerzeilen :D


    Edit
    In der Zeile:
    GetPlayerName(playerid, pUserData[playerid][pName], MAX_PLAYER_NAME),
    Da muss ein Simikolon am Ende hin.


    Außerdem ist die Variable "mysql" (wahrscheinlich deine Connection) nicht definiert.

    ik bin der vito c:

  • Das Semikolon macht keinen Unterschied. Du kannst mit einem Kommar die Performance deines Scripts verbessern.
    Der Pawn-Compiler macht sozusagen "Funktionsblöcke" bis zu einem Kommar und sucht dann die nächste funktion.
    Durch ein Semikolon leitest Du automatisch den nächsten "Funktionsblock" ein, was performance kostet.


    Funktioniert aber nur mit Funktionen, genau so wie Du mehrere Variablen mit Kommars trennen kannst.
    Also z.B
    new var1, var2;
    Habs grade trotzdem mal Probeweise durch ein Semikolon ersetzt, Fehler bleibt der selbe.



    Das mit der MySQL-Variable ist klar. Es geht nur gezielt um den Include-Fehler.

  • Okay D:
    Wieder was dazu gelernt, habs mal gesehen aber nie so angewendet. War nur auf den ersten Blick.


    Nun ich sehe keine wirklichen Fehler beim Includieren, habe es damals genauso gemacht.


    Ich bin auch müde grade, werde mir das morgen nochmal anschauen.
    Ggf auch per Teamviewer (vllt bin ich nicht schlauer als du aber finde Dinge, die du übersiehst)
    Oder du findest den Fehler selber, wenn ja. Sag mir woran es gelegen hat.


    Nachti!

    ik bin der vito c:

  • Ein Problem wird sein, dass einige Dateien identisch heißen.
    Ein weiteres Problem könnte die Codierung der Dateien darstellen.


    Genau kann man das ohne direkt davor zu sitzen auch nicht sagen.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski