[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • liegt an strins(ert) da eine Zeichenfolge bis zu einer stelle ersetzt/hinzugefügt wird,
    stelle die Zeichenfolge zurück durch ein Escape Zeichen sprich '\0' oder nutze strmid wobei das
    ja eigentlich im Grund bzw. zum Teil das selbe tut.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • ICh wollt das mit dem zurücksetzten machen


    Aber wenn ich das so machen, kommt das gleiche Ergebnis wie oben



    strins(badwords[i],dini_Get(file,string),0);
    format(string,sizeof(string),"\0");
    printf("Insertet: %s",badwords[i]);


    badwords zurückzusetzen wäre doch irgentwie unlogisch, weil dann würd ich das eben reinkopierte wort doch direkt wieder löschen


    @dit: Das hats gebracht XD :thumbup:


    new badwords[maxbadwords][16];
    Einfach hier nen String rausgemacht


    @dit:
    Noch ne andere Frage wenn ich anstatt des #define maxbadwords 30
    das hier mache
    new const maxbadwords = 30;
    new badwords[maxbadwords][16]; //zeile 287
    Kommt der Error

    Zitat

    (287) : error 008: must be a constant expression; assumed zero

    Einmal editiert, zuletzt von Hagi ()

  • Nein, das sollte es nicht.


    funktioniert theoretisch beides


    @dit:


    Jetzt nochmal hierauf zurück


    new const maxbadwords = 30;
    new badwords[maxbadwords][16]; //zeile 287

    Zitat

    (287) : error 008: must be a constant expression; assumed zero

    Einmal editiert, zuletzt von Hagi ()

  • const heißt also, dass egal wie groß ich die variable mache er immer auf den kleinstmöglichen wert geht ?


    Andere Frage:
    Habe ne Abfrage gemacht ob in einem String ein Badwort drin ist.


    Sollte ein BAdwort drin sein, bekommen das die anderen nicht zu sehen, denn dann wird ***** Beleidigung ***** returnt.
    Nur wenn kein badWord drin ist, bekomm ich den Fehler


    stock badwordscheck(playerid,text[])
    {
    for(new i = 0;i<maxbadwords;i++)
    {
    if(strfind(text,badwords[i],true) != -1)
    {
    new string[128],pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof(pname));
    format(string,sizeof(string),"%s wurde wegen einer Beleidigung gekickt",pname);
    SendClientMessageToAll(lila,string);
    Kick(playerid);
    new bstring[32];
    format(bstring,32,"***** Beleidigung *****");
    return bstring;
    }
    }
    new ntext[256];
    format(ntext,sizeof(ntext),"%s",text);
    return ntext; // hier der error zeile 7398
    }


    Bekomme den Error hier


    Zitat

    (7398) : error 047: array sizes do not match, or destination array is too small

  • Entweder liegt es daran das die Rückgabe-Größen sich unterscheiden oder an dem
    das das Ziel sprich die Variable an die, die Rückgabe erfolgen soll zu klein ist.


    Schau dir mal Zeile 12 & 17 an einmal 32 Zeichen & 256 es könnte eventuell daran liegen.
    Am besten wäre sowieso eine Array für beide Rückgaben zu verwenden um den Ressourcenverbrauch etwas einzudämmen.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Ich habe mir ein Menü erstellt für einen Busfahrbot. Wenn man in den Bus einsteigt überprüft er die Koordinate an welcher Bushaltestelle er einstieg. Dementsprechend wird bei jeder Bushaltestelle ein anderes Menü geöffnet. In diesem Menü sind alle weiteren Haltestellen bis zum Endhalt auszuwählen mit Preisen. Wenn ich allerdings zu wenig Geld habe für eine Fahrkarte wird das Menü nochmal aufgerufen, allerdings kann ich dort garnichts mehr auswählen. Kann mir jemand bitte bei weiterhelfen?
    if(GetPlayerMoney(playerid) < 12)
    {
    SendClientMessage(playerid,ROT,"Sie haben nicht genug Geld für dieses Ticket!");
    ShowMenuForPlayer(bus1,playerid);
    return 1;
    }
    else
    {
    SendClientMessage(playerid,CREME,"Busfahrer Adolf: Hier ist Ihr Ticket zum Wasserkraftwerk. Das macht 12$!");
    ticket4[playerid] = 1;
    SetTimer("timer4",5000,true);
    GivePlayerMoney(playerid,-12);
    return 1;
    }


    Mit freundlichen Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    Einmal editiert, zuletzt von Padarom ()

  • Das heißt also, dass auf oben bezogen, ich nicht bestimmen kann wie groß die Variable


    const maxbadwords = 30;


    entgültig sein soll, damit nicht zu viel Speicher verbraucht werden kann.
    Denn es soll natürlich nur maximal so groß sein, wie auch wörter vorhanden sind.


    Ich hab es so probiert
    maxbadwords = dini_Int(file,"maxbadwords");
    mit dem Fehler

    Zitat

    (798) : error 022: must be lvalue (non-constant)

  • maxbadwords soll für die Array sein oder ?
    sprich für die Größe ?
    Also daher kannst du nur Konstante Werte nutzen da du eine Array durch den Speicher nicht mehr beliebig vergrößern oder verkleinern kannst.
    diese Konstanten Variablen können nicht mehr verändert werden & behalten ihren Wert, sprich geschützter Speicher,
    selbst wenn du Statische Variablen benutzt bringt das nichts, denn Größen bzw. der Speicher dafür muss immer reserviert werden.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Das heißt, man müsste eine non-static variable nehmen, doch das funktioniert ja nicht.


    Und man kann dann ja theoretisch nur den define verändern ?
    Was aber auch nicht funktioniert, da man ja kein define mit einer variable machen kann
    #define maxbadwords hierdievariable

  • Wozu eine Variable ? Wie gesagt Arraywerte haben nur einen entgültigen Index sprich er kann nicht mehr durch den Speicher verändert werden.
    Sprich Arrays lassen sich nicht beliebig in der Größe verändern, egal wie , man kann es nicht ^^

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Ich möchte das gerne haben, da meine BAdwordsliste ja unendlich groß werden kann, sprich ich muss im script das static maxbadwords sehr hoch halten, damit immer alle badwords geladen werden.
    Doch ein großes static bedeutet doch immer einen großen specherverlust bzw ressourcenverbrauch.


    Daher würde ich gerne in der Datei wo die badwords stehen direkt reinschreiben wie viele wörter es sind, diese INformation geladen werden und als maximale arraygröße geladen werden.

  • Wie gesagt, das ist leider nicht Möglich, du kannst einen Array nicht größer machen als er Konstant schon festgelegt wurde also musst
    du wohl oder übel einen Maximalen Wert festlegen.


    In Sprachen wie Lua oder Squirrel ginge das da diese im Speicher kompiliert werden, Pawn kompiliert alles schon vorher & deshalb bleibt auch alles fest vorhanden & deshalb wird
    auch alles fest reserviert.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • kleine Frage


    ich verwende z.B.
    new Killer[MAX_PLAYERS];
    das hat bei mir immer den Wert 1 oder 0
    ist es Ressourcenschonender wenn ich da
    new bool:Killer[MAX_PLAYERS];
    mach :?:
    bool ist doch dafür da wenn es immer auf 1 oder 0 gesetzt wird


    Ist bool ressourcenschonender alls normal variable ??????????

    Einmal editiert, zuletzt von Markus20 ()