Fehler im Switch

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
  • Nabend,


    nach zig Jahren widme ich mich nun wieder SAMP. Ich möchte nichts großartiges, nur ein bisschen herumprobieren und mir nebenbei einen kleinen Testserver für weitere Dinge zusammen basteln. Als Grundlage nehme ich das grandlarc Script. Da ich Code gerne auslagere (Und die Includes dafür ideal sind), erstellte ich mir ein Include mit folgendem Inhalt:


    In der Datei "dzl_vardefs.inc", welche sowohl in diesem Include als auch im Gamemode selbst geladen wird befindet sich folgendes:


    Und nun die entstehenden Fehler:

    Code
    ../include/dzl_skinutil.inc(9) : error 002: only a single statement (or expression) can follow each "case"
    ../include/dzl_skinutil.inc(10) : error 014: invalid statement; not in switch
    ../include/dzl_skinutil.inc(10) : warning 215: expression has no effect
    ../include/dzl_skinutil.inc(10) : error 001: expected token: ";", but found ":"
    ../include/dzl_skinutil.inc(10) : error 029: invalid expression, assumed zero
    ../include/dzl_skinutil.inc(10) : fatal error 107: too many error messages on one line


    Mir ist aufgefallen, dass diese Fehler nur entstehen, sobald ich auf die definierten Konstanten in der dzl_vardefs.inc zugreife (Sowohl im Include als auch im grandlarc Script). Sobald ich diese durch z.B. einfach 0 ersetze, funktioniert es einwandfrei. Aber unter anderem dafür definiert man sich doch globale Variablen via #define, oder nicht?


    Viele Grüße,
    Deazl_

    2 Mal editiert, zuletzt von Deazl_ () aus folgendem Grund: Code-Highlighting geändert

  • C
    // Dialogs
    #define DIALOG_VEHICLE_INFO 11001;
    // Skin Groups
    #define SKIN_GROUP_CIVIL 	12001;
    #define SKIN_GROUP_MEDIC 	12002;
    #define SKIN_GROUP_POLICE 	12003;
    #define SKIN_GROUP_ARMY 	12004;

    Hier sind Semikolons hinter, die da nicht hingehören. Schreibe das so:


    C
    // Dialogs
    #define DIALOG_VEHICLE_INFO 11001
    // Skin Groups
    #define SKIN_GROUP_CIVIL 	12001
    #define SKIN_GROUP_MEDIC 	12002
    #define SKIN_GROUP_POLICE 	12003
    #define SKIN_GROUP_ARMY 	12004
  • Whoups, vielen Dank @AirM4X. Da hat mir die Gewohnheit wohl einen Strich durch die Rechnung gemacht ;)


    Eine weitere, ich hoffe einfache Frage hätte ich noch: Wie siehts aus wenn ich ein zweidimensionales Float-Array habe (beispielsweise gRandomSpawns_LosSantos) und dieses in eine neue Variable klonen möchte? Möglicherweise hilft dieser Schnipsel die Frage etwas besser zu verstehen:

  • Ich würde für Medic, Police, Army und Zivilisten jeweils ein eigenes Array erstellen und daraus dann jeweils eine Random-Position suchen.
    Das ist am Ende zwar mehr Code, aber dann hast du es geordnet und kommst damit auch nicht durch einander.


    So wie du es nämlich machst, funktioniert das nicht. Du willst spawnsList einen Wert zu weisen, obwohl das ein zweidimensionales Array ist. ;)

  • Hey,


    jede Kategorie hat seine eigenen Spawns. Jedes Array ist gleich aufgebaut, jedoch hat die erste Dimension jeweils eine unterschiedliche Größe. Die zweite ist immer gleich. Beispiel:

    Code
    new Float:gMedicalSpawns[3][4] = {
    	{1568.2250,-1693.5483,5.8906,177.0983},
    	{-1604.8442,732.9442,-5.2344,37.6041},
    	{1609.5922,1820.9641,10.8280,348.1614}
    };


    Ich möchte jeweils diesen Array quasi in eine neue Variable Klonen bzw. diesen Array übergeben. RAM-Technisch gesehen ist das zwar eher Kontraproduktiv, jedoch würde ich gerne das ganze Array in dieser Variable haben.

  • Ah, jetzt weiß ich was du vor hast. Das geht aber nicht so, schreibe das dann so:


    Ja, das ist länger. Du musst ja immer einzeln z.B. auf gRandomSpawns_LasVenturas zu greifen. ;)
    Klonen geht nicht so ohne weiteres, da müsstest du die Werte erst alle zwischenspeichern, was aber weniger Sinn macht. ;)

  • Heyho @AirM4X,


    ich bin gestern leider nicht mehr dazu gekommen noch zu antworten. Vielen Dank für deine Lösung. So funktionierts. Jedoch hätte ich eine kleine Frage:
    Was die Programmierung, egal bei was, angeht bin ich wer der Codeverdopplung vermeidet. Also erstellte ich mir eine extra Methode (In einem Include welches ich eingebunden habe) an welchen ich eine Spieler-ID sowie ein Eindimensionales Array übergeben kann. Das Array wird korrekt übergeben. Die Daten darin sind auch korrekt, jedoch sawne ich, wenn ich diese Methode nutze, irgendwo in SF im Boden. Anschließend erscheint "Stay within the world boundaries". Nutze ich den selben Code direkt dort wo ich die Methode eigentlich aufrufen würde habe ich dieses Problem nicht. Dazu kommt, dass die Koordinaten zwar korrekt sind, ich auf der Minimap jedoch irgendwie abseits im Wasser angezeigt werde.


    Hier meine Methode in meiner dzl_playerutil.inc:


    Mein Methodenaufruf:
    SpawnPlayerAtLocation(playerid, gMedicalSpawns[1]);


    Testweise habe ich den switch-case Block auskommentiert:



    Ebenfalls ist mir aufgefallen, dass egal welchen Skin ich habe bei GetSkinGroup immer der Wert vom Zivilisten zurückkommt:

    Einmal editiert, zuletzt von Deazl_ ()

  • C
    stock SpawnPlayerAtLocation(playerid, location[])
    {
        printf("%f, %f, %f, %f", location[0],location[1],location[2],location[3]);
        SetPlayerPos(playerid,
            location[0],
            location[1],
            location[2]);
        SetPlayerFacingAngle(playerid, location[3]);
    }



    Das kann so nicht funktionieren. Du möchtest bestimmt, wenn man gMedicalSpawn[0] eingibt, das die Koordinaten aus der ersten Zeile bei location[0], location[1] und location[2] sind, richtig?
    Das wird nicht funktionieren, daher mache das so:

    C
    stock SpawnPlayerAtLocation(playerid,Float:location1,Float:location2,Float:location3,Float:location4)
    {
        printf("%f, %f, %f, %f", location1,location2,location3,location4);
        SetPlayerPos(playerid,
            location1,
            location2,
            location3);
        SetPlayerFacingAngle(playerid, location4);
    }

    So kannst du dann folgendes machen:

    Code
    SpawnPlayerAtLocation(playerid,gMedicalSpawn[0][0],gMedicalSpawn[0][1],gMedicalSpawn[0][2],gMedicalSpawn[0][3]);


    Die andere Funktion sollte, wenn ich das richtig verstanden habe, so lauten:

    Wenn du bei spawnPlatz 0 einträgst, dann wird eine random Position von gMedicalSpawns gesucht. Bei 1 dann von gPoliceSpawns, usw.


    Das Problem mit dem Skin:
    Lasse dir deine skin-id mal printen: