Unknown Command Problem

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
  • Tag allerseids, habe da ein kleines Problem. Ich benutze folgenden Code:


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(shutdown, 8, cmdtext);
    return 1;
    }
    dcmd_shutdown (playerid, params[]) {
    if (GetPVarInt(playerid, "adminRank") < 9) return SendClientMessage(playerid, 0xFF0000FF, "Not allowed.");
    if (sscanf(params, "d", tempVar)) tempVar = 5;
    vehicleSave(-1);
    for (new i = 1; i <= sizeof(frakInfo); i ++) {
    format(query, sizeof(query), "UPDATE samp_fractions SET fractionMoney = '%i', rentGround = '%i', rentRank = '%i' WHERE fractionId = '%i' LIMIT 1", frakInfo[i][frakKasse], frakInfo[i][frakGehalt], frakInfo[i][frakBonus], i);
    mysql_query(query);
    }
    for (new j = 1; j <= sizeof(zoneInfo); j ++) {
    format(query, sizeof(query), "UPDATE samp_gangzones SET zoneOwnedByFrakId = '%i' WHERE zoneId = '%i' LIMIT 1", zoneInfo[j][zoneOwnedByFrakId], zoneInfo[j][zoneId]);
    mysql_query(query);
    }
    for (new k = 0; k < MAX_PLAYERS; k ++) {
    playerSave(k);
    }
    mysql_close();
    SendClientMessageToAll(0xFF000066, "Der Server wird nun neugestartet. Bis gleich!");
    SendRconCommand("gmx");
    return 1;
    }
    Dennoch bekomme ich inGame nur die Fehlermeldung "Unkown Command."


    Ich selbst sehe allerdings keinen Fehler in diesem Script, ihr vielleicht?


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Debugge doch mal den Code.
    Ich tippe aber mal auf die Schleife:
    for (new i = 1; i <= sizeof(frakInfo); i ++) {
    format(query, sizeof(query), "UPDATE samp_fractions SET fractionMoney = '%i', rentGround = '%i', rentRank = '%i' WHERE fractionId = '%i' LIMIT 1", frakInfo[i][frakKasse], frakInfo[i][frakGehalt], frakInfo[i][frakBonus], i);
    mysql_query(query);
    }

    Wieso du bei i = 1 anfängst,keine Ahnung.Allerdings ist <= nicht gut gewählt bei solchen Schleifen. Denn irgendwann wird i = sizeof(frakInfo) sein. Angenommen sizeof(frakInfo) gibt 5 zurück.
    Dann wäre i irgendwann bei dieser Schleife 5.
    Allerdings ist bei frakInfo[5] als gültiger Index nur 0 bis 4 möglich. Der Index 5 ist nicht möglich. Du musst nur <= umändern . Denk mal drüber nach.

  • Weil mySQL bei Primary Keys nunmal nicht bei 0, sondern mit 1 anfängt. Demnach ist der Array um 1 größer als nötig (aufgrund der 0) und fängt bei 1 an, statt der 0. Wie du darauf kommst dass <= nicht gut gewählt sein soll, kann ich absolut garnicht nachvollziehen, weil es nichts anderes als ein Operator ist, da tut sich garnichts in der Funktionsweise oder Belastung.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Das Problem hat nichts mit MySQL zu tun,sondern mit den Arrays die du nutzt.
    Du versuchst auf einen Index zuzugreifen,der nicht gültig ist. Das habe ich aber auch bereits geschrieben. Du solltest dir den Post auch genauer durchlesen. Dann hättest du verstanden,wo der Fehler liegt.

    Zitat

    Demnach ist der Array um 1 größer als nötig (aufgrund der 0) und fängt bei 1 an, statt der 0.


    Auch wenn das Array um 1 größer ist als nötig,wird dir sizeof trotzdem nur die Gesamte größe wiedergeben,auch wenn es 1 größer ist als du tatsächlich brauchst. Du gehst trotzdem einen Index zu weit.
    Wie auch immer, vielleicht hilft dir es ja den folgenden Code mal ausführen zu lassen:

    #include <a_samp>


    new
    aiTest[5] = {0,1,2,3,4};


    main()
    {
    for(new i = 1 /* 0 ist egal */ ; i <= sizeof(aiTest) ; i++) {
    printf("aiTest[%d] = %d",i,aiTest[i]);
    }
    printf("Fertig!");
    }
    Genau so funktioniert deine Code.Ich wette aber mit dir,dass "printf("Fertig!");" nie ausgeführt wird,da das Script vorher abstürzt.
    Wenn du jetzt aus <= ein < machst,passiert es nicht mehr.
    Warum ? Weil <= kleiner/gleich ist. Du lässt es so lange laufen,bis der Index der größe des Array entspricht. Den Index,der den gleichen Zahlenwert hat wie die Arraygröße, gibt es nicht.

    Zitat

    array[n] = 0 bis n-1