/use Befehl Frage

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
  • Man soll die Droge, Qualitätsstufe und die Menge angeben und dies soll dann entsprechend genutzt werden. Irgendwie habe ich leider einen Error dabei:

    enum Inventar_Daten
    {
    //Bedarf Inventar
    Float:PolosChickenwings,
    Float:FreddysMargarithaPizza,
    Float:Sprunk,
    //Illegales Inventar
    Float:Cannabis[101],
    Float:CrystalMeth[101],
    Float:Heroin[101],
    Float:Cocaine[101],
    //Normales Inventar
    pMarkeOfficer,
    pSateliteHandy,
    pUniformOfficer,
    };


    else if(!sscanf(params,"sdf",produkt,qualitaet,menge))
    {
    for(new i = 0; i<MAX_INVENTAR; i++)
    {
    if(!strcmp(produkt, InventarName[playerid][Inventar_Name:i]) /*&& !isnull(produkt) && !isnull(InventarName[playerid][Inventar_Name:i])*/)
    {
    if(Inventar[playerid][Inventar_Daten:i] >= menge)
    {
    Inventar[playerid][Inventar_Daten:i][qualitaet] -= menge;
    Info[playerid][RpPoints] += InventarRPPlus[playerid][RPPlus_Daten:i];
    return 1;
    }
    else SCM(playerid,rot,"Nicht genügend dabei!");
    }
    if(i == MAX_INVENTAR)
    {
    SCM(playerid,rot,"Produkt nicht bekannt!");
    return 1;
    }
    }
    }

  • if(i == MAX_INVENTAR)

    Dieser Fall kann nicht eintreten, da du ja in der Schleife gesagt hast als Bedingung i<MAX_INVENTAR


    Wäre nett, wenn du die Zeile mit dem Fehler markieren könntest :)

    ast2ufdyxkb1.png


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

  • Hab einen neuen Fehler. Bei der ersten Funktion klappt es ohne Probleme, hier jedoch macht er Macken:

    enum RPPlus_Daten
    {
    PolosChickenwings = 1,
    FreddysMargarithaPizza = 1,
    Sprunk = 1,
    Cannabis = 3,
    CrystalMeth = 10,
    Heroin = 10,
    Kokain = 5
    }


    else if(!strcmp(produkt, InventarName[playerid][CrystalMeth]))
    {
    if(Inventar[playerid][CrystalMeth][qualitaet] >= menge)
    {
    Inventar[playerid][CrystalMeth][qualitaet] -= menge;
    Info[playerid][RpPoints] += InventarRPPlus[playerid][CrystalMeth];
    return 1;
    }
    }

    In der Zeile: Info[playerid][RpPoints] += InventarRPPlus[playerid][CrystalMeth];


    Code
    C:\Program Files\Grand Theft Auto San Andreas\gamemodes\bigcitylife.pwn(224) : error 032: array index out of bounds (variable "InventarRPPlus")
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    
    
    
    1 Error.
  • Die Wertzuweisungen im enum sind falsch, das darfst du so nicht machen.
    Zumal das Konstanten sind, wie es aussieht, macht auch ein [playerid] Array hier keinen Sinn.


    Am besten du machst die Konstanten einfach so fest:
    #define RP_PLUS_CrystalMeth 10
    #define RP_PLUS_Sprunk 1
    //etc...


    Und dann:
    Info[playerid][RpPoints] += RP_PLUS_CrystalMeth;

  • Ich brauch es in einem Enum damit ich es dynamisch abzählen kann für die vielen Inventare die keine Drogen sind sondern einfach nur Produkte zum Essen und trinken. Bei der Cannabis Funktion und der dynamischen Funktion klappt es auch wunderbar, aber nur hier nicht. Gibt es sonst eine andere Möglichkeit oder findest du den Fehler beim CrystelMeth?


    Edit: Wenn ich auf 5 runtergehe klappt es irgendwie.
    Edit 2: Irgendwie bekomme ich Errors bei Funktionen die anders genau so klappen?

  • Du hast das Prinzip von enums nicht verstanden.
    Ein enum ist lediglich eine Sammlung von Zeigern innerhalb eines Arrays.


    Wenn du 5 Werte im enum hast, und einen davon auf 10 setzt, dann klappt das nicht, da es keinen Index 10 zwischen 0 und 4 gibt.
    Daher ist es (in den meisten Fällen) nicht ratsam, enum-Werte zu verändern.


    Für deinen Fall macht es gar keinen Sinn.
    Dynamisch ist das was du vor hast ohnehin nicht. Das was ich dir vorgeschlagen habe, hat genau den gleichen Coding-Aufwand, funktioniert aber und ist korrekt so.


    Wenn du es dynamisch machen willst, zeige bitte die Stellen, die deiner Meinung nach dynamisch aufgebaut sind, und wie du das dort einbauen willst.


  • enum Inventar_Name
    {
    PolosChickenwings[128],
    FreddysMargarithaPizza[128],
    Sprunk[128],
    Cannabis[128],
    CrystalMeth[128],
    Heroin[128],
    Kokain[128]
    }
    enum RPPlus_Daten
    {
    PolosChickenwings,
    FreddysMargarithaPizza,
    Sprunk,
    Cannabis,
    CrystalMeth,
    Heroin,
    Kokain
    }
    enum Inventar_Daten
    {
    //Bedarf Inventar
    Float:PolosChickenwings,
    Float:FreddysMargarithaPizza,
    Float:Sprunk,
    //Illegales Inventar
    Float:Cannabis[101],
    Float:CrystalMeth[101],
    Float:Heroin[101],
    Float:Cocaine[101],
    //Normales Inventar
    pMarkeOfficer,
    pSateliteHandy,
    pUniformOfficer,
    };
    };




    new Info[MAX_PLAYERS][Account_Daten];
    new Inventar[MAX_PLAYERS][Inventar_Daten];
    new InventarName[MAX_PLAYERS][Inventar_Name];
    new InventarRPPlus[RPPlus_Daten];




    else
    {
    for(new i = 0; i<MAX_INVENTAR; i++)
    {
    if(!strcmp(produkt, InventarName[playerid][Inventar_Name:i]) /*&& !isnull(produkt) && !isnull(InventarName[playerid][Inventar_Name:i])*/)
    {
    if(Inventar[playerid][Inventar_Daten:i] >= menge)
    {
    Inventar[playerid][Inventar_Daten:i] -= menge;
    Info[playerid][RpPoints] += InventarRPPlus[RPPlus_Daten:i];
    return 1;
    }
    else return SCM(playerid,rot,"Nicht genügend dabei!");
    }
    if(i == MAX_INVENTAR)
    {
    SCM(playerid,rot,"Produkt nicht bekannt!");
    return 1;
    }
    }
    }


  • else if(!strcmp(produkt, InventarName[playerid][Kokain]))
    {
    if(Inventar[playerid][Kokain][qualitaet] >= menge) //<-Hier ist der Error
    {
    Inventar[playerid][Kokain][qualitaet] -= menge;
    Info[playerid][RpPoints] += InventarRPPlus[Kokain];
    return 1;
    }
    else return SCM(playerid,rot,"Nicht genügend vorhanden!");
    }

    Jetzt habe ich hier einen Error obwohl die selbe Funktion mit den anderen Drogen klappt. Keine Ahnung was da spuckt.

  • Ich scripte zwar erst seit gestern und bin gerade eig. noch der größte noob dabei, ABER ich würde sagen, dass die Fehler hier sind:


    C:\Program Files\Grand Theft Auto San Andreas\gamemodes\bigcitylife.pwn(258) : error 001: expected token: ")", but found "["


    +


    C:\Program Files\Grand Theft Auto San Andreas\gamemodes\bigcitylife.pwn(258) : error 001: expected token: ";", but found "]"


    Es fehlt dort erst irgendwo in Zeile 258 eine ")" und danach noch ein ";"



    //e: Du kannst ja mal den Code von Zeile 258 posten, da dort der Fehler liegt, falls du ihn nicht findest.

    MfG. Adrian

  • if(Inventar[playerid][Kokain][qualitaet] >= menge)

    Wie hast du denn "Inventar" und dessen enums jetzt deklariert? Oben waren es noch zwei Arrays, wenn das immernoch so ist, dann passt das hier mit drei Arrays nicht.



    Ich scripte zwar erst seit gestern und bin gerade eig. noch der größte noob dabei, ABER ich würde sagen, dass die Fehler hier sind:

    Die Fehler darfst du nicht immer wörtlich nehmen, oft sind das Folgefehler, die der Compiler auswirft, weil etwas anderes nicht passt.
    Hier ist die Vermutung, dass auf ein zweidimensionales Array mit drei Dimensionen zugegriffen wird. Kommt drauf an, wie das Array und enum deklariert ist.

  • Ne ist auch in 3 Dimensionen:

    enum Inventar_Daten
    {
    //Bedarf Inventar
    Float:PolosChickenwings,
    Float:FreddysMargarithaPizza,
    Float:Sprunk,
    //Illegales Inventar
    Float:Cannabis[101],
    Float:CrystalMeth[101],
    Float:Heroin[101],
    Float:Cocaine[101],
    //Normales Inventar
    pMarkeOfficer,
    pSateliteHandy,
    pUniformOfficer,
    };
    new Inventar[MAX_PLAYERS][Inventar_Daten];


    Denke jedenfalls das es so klappen sollte.

  • Im enum gibt es keinen Wert der "Kokain" heißt, daher der Fehler.
    "qualitaet" nehme ich an, ist eine Variable, die lokal definiert wurde.


    Versuche es so:
    if(Inventar[playerid][Cocaine][qualitaet] >= menge)


    Falls es nicht geht, poste bitte, wie "qualitaet" deklariert ist und wo/wie es seinen Wert bekommt.