Array Out of Bounds

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
  • Guten Tag


    Crahsdetect gibt mir den Fehler wieder, der verursacht wird, weil ich ein Array überschreite (oder unterschreite?). Nur weiß ich nicht genau an welcher stelle dies Geschieht.
    Ich weiß das es in diesem Abschnitt passieren muss:
    new Query[100];
    format(Query,sizeof(Query),"SELECT * FROM `accounts` WHERE `Nickname` = '%s'", pName[playerid]);
    mysql_query(Query);
    mysql_store_result();
    while(mysql_fetch_row(Query, "|"))
    {
    sscanf(Query, "p<|>{is[30]s[35]}s[15]iiiiliiiiiliiffffffiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiii}lls[100]s[20]s[20]iils[20]s[15]iiiiis[75]s[30]iiis[15]",
    Spieler[playerid][RegDate], Spieler[playerid][Zivilskin], Spieler[playerid][Fraktionsskin], Spieler[playerid][Duty], Spieler[playerid][Adminlvl], Spieler[playerid][Leaderverwaltung], Spieler[playerid][Bargeld], Spieler[playerid][Bankgeld], Spieler[playerid][Konto],
    Spieler[playerid][Level], Spieler[playerid][Fraktion], Spieler[playerid][Leader], Spieler[playerid][Rang], Spieler[playerid][Spawnchange], Spieler[playerid][Leben], Spieler[playerid][Armour], Spieler[playerid][LastX], Spieler[playerid][LastY],
    Spieler[playerid][LastZ], Spieler[playerid][LastA], Spieler[playerid][LastInt], Spieler[playerid][LastVirt], Spieler[playerid][LastHour], Spieler[playerid][LastMinute], Spieler[playerid][LastSecond], Spieler[playerid][LastYear], Spieler[playerid][LastMonth],
    Spieler[playerid][LastDay], Spieler[playerid][ban], Spieler[playerid][tban], Spieler[playerid][bangrund], Spieler[playerid][tbantime], Spieler[playerid][tbandate], Spieler[playerid][warns], Spieler[playerid][Tutorial], Spieler[playerid][Perso],
    Spieler[playerid][Geschlecht], Spieler[playerid][GebDate], Spieler[playerid][Mute], Spieler[playerid][OOCMute], Spieler[playerid][Wanteds], Spieler[playerid][Wantedpoints], Spieler[playerid][Susptime],Spieler[playerid][Verbrechen], Spieler[playerid][Klaeger],
    Spieler[playerid][Drogen], Spieler[playerid][Mats], Spieler[playerid][Handy], Spieler[playerid][Handynummer]);
    }
    mysql_free_result();


    Dies ist der fehler:

    Zitat

    [debug] Run time error 4: "Array index out of bounds"
    [13:51:03] [debug] Accessing element at index 49 past array upper bound 29
    [13:51:03] [debug] AMX backtrace:
    [13:51:03] [debug] #0 001015bc in ?? () from Server.amx
    [13:51:03] [debug] #1 00000035 in public OnDialogResponse () from Server.amx


    Und um die Variablen richtig zu kontrollieren, hier meine enum:
    enum AccountInfo //Allgemeine Account Info
    {
    Passwort[35],
    RegDate[15],
    Zivilskin,
    Fraktionsskin,
    Duty,
    Adminlvl,
    bool:Leaderverwaltung,
    Bargeld,
    Bankgeld,
    Konto,
    Level,
    Fraktion,
    bool:Leader,
    Rang,
    Spawnchange,
    Float:Leben,
    Float:Armour,
    Float:LastX,
    Float:LastY,
    Float:LastZ,
    Float:LastA,
    LastInt,
    LastVirt,
    LastHour,
    LastMinute,
    LastSecond,
    LastDay,
    LastMonth,
    LastYear,
    bool:ban,
    bool:tban,
    bangrund[100],
    tbantime[15],
    tbandate[15],
    warns,
    Tutorial,
    bool:Perso,
    Geschlecht[20],
    GebDate[15],
    Mute,
    OOCMute,
    Wanteds,
    Wantedpoints,
    Verbrechen[75],
    Klaeger[MAX_PLAYER_NAME],
    Susptime,
    Kanister,
    Mats,
    Drogen,
    Handy,
    Handynummer[15],
    pWaffe[13],
    pAmmo[13],
    }
    new Spieler[MAX_PLAYERS][AccountInfo];


    Wäre gut wenn jemand den Fehler weiter eingrenzen könnte.



    Liebe Grüße

  • Nö kein stück zu klein!


    So wie die Zeichenfolge da steht, hat sie knapp 50 Zeichen. Max_Player_Name hat knapp 25 Zeichen, macht gerundet 75. Ich habe 100 angegeben immer noch ausreichend, um auf nummer sicher zu gehen.


    Ich habe den Fehler anscheinend behoben bekommen aber nun passiert folgendes: Der Server schmiert ab sobald dieser scriptabschnitt abgearbeitet werden soll. Ohne jegliche Fehlermeldung in der log.

  • Ich dachte mir so: Das einzige wo überhaupt ein Array so eine größe hat die überschritten werden kann, sind die Strings.
    Habe alle größen mal verglichen in der enum und in der Datenbank und alle angepasst und nun scheint es zu laufen, ich teste es jedoch noch, zumindest gibt er mir kein solchen fehler mehr um log, was genauso schei*e ist weil der server sich nun komplett beim connecten aufhängt, könnte auch daran liegen das durch diesen fehler ein fehler in der Datenbank folgt. Ich werde es nochmal testen.


    //edit:

    Query ist viel zu klein?
    new Query[520];


    Was mir gerade eingefallen ist: könntest doch recht haben, da das ergebnis doch in der Query dann gespeichert ist oder?

  • Ich dachte mir so: Das einzige wo überhaupt ein Array so eine größe hat die überschritten werden kann, sind die Strings.
    Habe alle größen mal verglichen in der enum und in der Datenbank und alle angepasst und nun scheint es zu laufen, ich teste es jedoch noch, zumindest gibt er mir kein solchen fehler mehr um log, was genauso schei*e ist weil der server sich nun komplett beim connecten aufhängt, könnte auch daran liegen das durch diesen fehler ein fehler in der Datenbank folgt. Ich werde es nochmal testen.


    //edit:


    Was mir gerade eingefallen ist: könntest doch recht haben, da das ergebnis doch in der Query dann gespeichert ist oder?


    Ja wie, wäre es wenn du es mal Testest :D, ich habe in letzten Tage viele solch Probleme hier gesehen & meist lag es nur daran das der Query zu klein war, war ebenfalls bei mir genau so.


    /E Mach denn Query bei deinem SavePlayer stock auch größer. & setz da snoch drunter, da du ja query anwendest,
    mysql_query(query);

    Einmal editiert, zuletzt von PsyDom ()

  • Ich habe es mal getestet, es könnte sein das dies der Fehler mit dem crashdetect war.


    Der server kackt genau dann ab, wenn er das aus der Datenbank in die variablen schreibt mithilfe von sscanf, also bei der while Schleife.
    Ich weiß nun noch ob die größe immernoch zu klein ist, ich hatte sie auf 750 Zeichen gesetzt, da es aber ziemlich große Tabelle ist, könnte das immernoch zu klein sein, was ich mir aber fast nicht vorstellen kann.

  • mysql_query(query);
    setzt das noch ende des Codes hin, da du ja mit query arbeitest^^


    new query[520];
    format(query,sizeof(query),"SELECT * FROM `accounts` WHERE `Nickname` = '%s'", pName[playerid]);
    mysql_store_result();
    while(mysql_fetch_row(query, "|"))
    {
    sscanf(Query, "p<|>{is[30]s[35]}s[15]iiiiliiiiiliiffffffiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiii}lls[100]s[20]s[20]iils[20]s[15]iiiiis[75]s[30]iiis[15]",
    Spieler[playerid][RegDate], Spieler[playerid][Zivilskin], Spieler[playerid][Fraktionsskin], Spieler[playerid][Duty], Spieler[playerid][Adminlvl], Spieler[playerid][Leaderverwaltung], Spieler[playerid][Bargeld], Spieler[playerid][Bankgeld], Spieler[playerid][Konto],
    Spieler[playerid][Level], Spieler[playerid][Fraktion], Spieler[playerid][Leader], Spieler[playerid][Rang], Spieler[playerid][Spawnchange], Spieler[playerid][Leben], Spieler[playerid][Armour], Spieler[playerid][LastX], Spieler[playerid][LastY],
    Spieler[playerid][LastZ], Spieler[playerid][LastA], Spieler[playerid][LastInt], Spieler[playerid][LastVirt], Spieler[playerid][LastHour], Spieler[playerid][LastMinute], Spieler[playerid][LastSecond], Spieler[playerid][LastYear], Spieler[playerid][LastMonth],
    Spieler[playerid][LastDay], Spieler[playerid][ban], Spieler[playerid][tban], Spieler[playerid][bangrund], Spieler[playerid][tbantime], Spieler[playerid][tbandate], Spieler[playerid][warns], Spieler[playerid][Tutorial], Spieler[playerid][Perso],
    Spieler[playerid][Geschlecht], Spieler[playerid][GebDate], Spieler[playerid][Mute], Spieler[playerid][OOCMute], Spieler[playerid][Wanteds], Spieler[playerid][Wantedpoints], Spieler[playerid][Susptime],Spieler[playerid][Verbrechen], Spieler[playerid][Klaeger],
    Spieler[playerid][Drogen], Spieler[playerid][Mats], Spieler[playerid][Handy], Spieler[playerid][Handynummer]);
    mysql_query(query);
    }
    mysql_free_result();

  • Das vorgehen verstehe ich nicht ganz. Man muss doch mit mysql_query erstmal eine Query ausführen, welche dann das ergebnis der Query mit mysql_store_result speichert und mit mysql_free_result wieder freigibt. mithilfe der whileschleife arbeite ich dann einfach mit dem ergebnis.

  • Machs wiefolgt:


    new Query[512];
    mysql_store_result();
    mysql_fetch_row_format(Query);
    mysql_free_result();
    sscanf(Query, "p<|>{is[30]s[35]}s[15]iiiiliiiiiliiffffffiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiii}lls[100]s[20]s[20]iils[20]s[15]iiiiis[75]s[30]iiis[15]",
    Spieler[playerid][RegDate], Spieler[playerid][Zivilskin], Spieler[playerid][Fraktionsskin], Spieler[playerid][Duty], Spieler[playerid][Adminlvl], Spieler[playerid][Leaderverwaltung], Spieler[playerid][Bargeld], Spieler[playerid][Bankgeld], Spieler[playerid][Konto],
    Spieler[playerid][Level], Spieler[playerid][Fraktion], Spieler[playerid][Leader], Spieler[playerid][Rang], Spieler[playerid][Spawnchange], Spieler[playerid][Leben], Spieler[playerid][Armour], Spieler[playerid][LastX], Spieler[playerid][LastY],
    Spieler[playerid][LastZ], Spieler[playerid][LastA], Spieler[playerid][LastInt], Spieler[playerid][LastVirt], Spieler[playerid][LastHour], Spieler[playerid][LastMinute], Spieler[playerid][LastSecond], Spieler[playerid][LastYear], Spieler[playerid][LastMonth],
    Spieler[playerid][LastDay], Spieler[playerid][ban], Spieler[playerid][tban], Spieler[playerid][bangrund], Spieler[playerid][tbantime], Spieler[playerid][tbandate], Spieler[playerid][warns], Spieler[playerid][Tutorial], Spieler[playerid][Perso],
    Spieler[playerid][Geschlecht], Spieler[playerid][GebDate], Spieler[playerid][Mute], Spieler[playerid][OOCMute], Spieler[playerid][Wanteds], Spieler[playerid][Wantedpoints], Spieler[playerid][Susptime],Spieler[playerid][Verbrechen], Spieler[playerid][Klaeger],
    Spieler[playerid][Drogen], Spieler[playerid][Mats], Spieler[playerid][Handy], Spieler[playerid][Handynummer]);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ah Okay.. Ich bin vorher immer alles mit ner While Schleife durchgegangen.


    Also kann nun lieber die schleifen mit dieser Funktion ersetzen.


    //edit: Er gibt mir folgenden Error:

    Zitat

    "File or function is not found"
    [15:28:59] [debug] mysql_fetch_row_format

  • Wollte ich gerade sagen, habe auch gerade gesehen das das nur für BlueG ist.


    Ich benutze das StrickenKid.


    //edit:


    Ich habe es nun folgendermaßen:

    new Query[512];
    print("Test 1");
    mysql_real_escape_string(pName[playerid], pName[playerid]);
    print("Test 2");
    format(Query,sizeof(Query),"SELECT * FROM `accounts` WHERE `Nickname` = '%s'", pName[playerid]);
    print("Test 3");
    mysql_query(Query);
    print("Test 4");
    mysql_store_result();
    print("Test 5");
    mysql_fetch_row(Query, "|");

    print("Test 6");

    sscanf(Query, "p<|>{is[30]s[35]}s[15]iiiiliiiiiliiffffffiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiii}lls[100]s[20]s[20]iils[20]s[15]iiiiis[75]s[30]iiis[15]",
    Spieler[playerid][RegDate], Spieler[playerid][Zivilskin], Spieler[playerid][Fraktionsskin], Spieler[playerid][Duty], Spieler[playerid][Adminlvl], Spieler[playerid][Leaderverwaltung], Spieler[playerid][Bargeld], Spieler[playerid][Bankgeld], Spieler[playerid][Konto],
    Spieler[playerid][Level], Spieler[playerid][Fraktion], Spieler[playerid][Leader], Spieler[playerid][Rang], Spieler[playerid][Spawnchange], Spieler[playerid][Leben], Spieler[playerid][Armour], Spieler[playerid][LastX], Spieler[playerid][LastY],
    Spieler[playerid][LastZ], Spieler[playerid][LastA], Spieler[playerid][LastInt], Spieler[playerid][LastVirt], Spieler[playerid][LastHour], Spieler[playerid][LastMinute], Spieler[playerid][LastSecond], Spieler[playerid][LastYear], Spieler[playerid][LastMonth],
    Spieler[playerid][LastDay], Spieler[playerid][ban], Spieler[playerid][tban], Spieler[playerid][bangrund], Spieler[playerid][tbantime], Spieler[playerid][tbandate], Spieler[playerid][warns], Spieler[playerid][Tutorial], Spieler[playerid][Perso],
    Spieler[playerid][Geschlecht], Spieler[playerid][GebDate], Spieler[playerid][Mute], Spieler[playerid][OOCMute], Spieler[playerid][Wanteds], Spieler[playerid][Wantedpoints], Spieler[playerid][Susptime],Spieler[playerid][Verbrechen], Spieler[playerid][Klaeger],
    Spieler[playerid][Drogen], Spieler[playerid][Mats], Spieler[playerid][Handy], Spieler[playerid][Handynummer]);


    print("Test 7");
    mysql_free_result();
    print("Test 8");
    Laut den Test-Prints bleibt der Server bei der Funktion mysql_fetch_row stehen.

    Zitat

    [15:49:44] Test 1
    [15:49:44] Test 2
    [15:49:44] Test 3
    [15:49:44] Test 4
    [15:49:44] Test 5

    Einmal editiert, zuletzt von Simon ()

  • Teste mal das
    new Query[512],Load[128];
    print("Test 1");
    mysql_real_escape_string(pName[playerid], pName[playerid]);
    print("Test 2");
    format(Load,sizeof(Load),"SELECT * FROM `accounts` WHERE `Nickname` = '%s'", pName[playerid]);
    print("Test 3");
    mysql_query(Load);
    print("Test 4");
    mysql_store_result();
    print("Test 5");
    mysql_fetch_row(Query, "|");


    print("Test 6");


    sscanf(Query, "p<|>{is[30]s[35]}s[15]iiiiliiiiiliiffffffiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiii}lls[100]s[20]s[20]iils[20]s[15]iiiiis[75]s[30]iiis[15]",
    Spieler[playerid][RegDate], Spieler[playerid][Zivilskin], Spieler[playerid][Fraktionsskin], Spieler[playerid][Duty], Spieler[playerid][Adminlvl], Spieler[playerid][Leaderverwaltung], Spieler[playerid][Bargeld], Spieler[playerid][Bankgeld], Spieler[playerid][Konto],
    Spieler[playerid][Level], Spieler[playerid][Fraktion], Spieler[playerid][Leader], Spieler[playerid][Rang], Spieler[playerid][Spawnchange], Spieler[playerid][Leben], Spieler[playerid][Armour], Spieler[playerid][LastX], Spieler[playerid][LastY],
    Spieler[playerid][LastZ], Spieler[playerid][LastA], Spieler[playerid][LastInt], Spieler[playerid][LastVirt], Spieler[playerid][LastHour], Spieler[playerid][LastMinute], Spieler[playerid][LastSecond], Spieler[playerid][LastYear], Spieler[playerid][LastMonth],
    Spieler[playerid][LastDay], Spieler[playerid][ban], Spieler[playerid][tban], Spieler[playerid][bangrund], Spieler[playerid][tbantime], Spieler[playerid][tbandate], Spieler[playerid][warns], Spieler[playerid][Tutorial], Spieler[playerid][Perso],
    Spieler[playerid][Geschlecht], Spieler[playerid][GebDate], Spieler[playerid][Mute], Spieler[playerid][OOCMute], Spieler[playerid][Wanteds], Spieler[playerid][Wantedpoints], Spieler[playerid][Susptime],Spieler[playerid][Verbrechen], Spieler[playerid][Klaeger],
    Spieler[playerid][Drogen], Spieler[playerid][Mats], Spieler[playerid][Handy], Spieler[playerid][Handynummer]);


    print("Test 7");
    mysql_free_result();
    print("Test 8");

    All in all it's just another brick in the wall