Run time Error [Bitte um Hilfe]

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Run time Error [Bitte um Hilfe]

    Guten Tag,
    ich habe mir gestern ein Script gedownloadet und dort kam immer beim Starten des Servers folgendes Problem:
    [22:35:44] [debug] Run time error 4: "Array index out of bounds"
    [22:35:44] [debug] Accessing element at index 65535 past array upper bound 1999
    [22:35:44] [debug] AMX backtrace:
    [22:35:44] [debug] #0 001c5e8c in ?? ()
    [22:35:44] [debug] #1 00222ffc in ?? ()
    [22:35:44] [debug] #2 00003418 in ?? ()



    Könnte mir einer Bitte Helfen würde mich Sehr Freuen!
  • Habe gerade leider keine Möglichkeit in TeamViewer zu gehen.
    Interessant wäre aber noch, wann der Fehler kommt. Immer nur beim Serverstart oder auch mal zu einem anderen Zeitpunkt?

    [22:35:44] [debug] #0 001c5e8c in ?? ()
    [22:35:44] [debug] #1 00222ffc in ?? ()
    [22:35:44] [debug] #2 00003418 in ?? ()

    Und dort zeigt er auch nie mehr Informationen an?
  • Habe mich gerade nochmal zu dem Crashdetect-Plugin erkundigt (da ich es selbst noch nie verwendet habe).
    Kompilier das Script mal mit dem Debug-Level 3 (-d3), indem du im Ordner vom Compiler eine Datei "pawn.cfg" erstellst, in die du "-d3" reinschreibst und das Script neu kompilierst.
    Dann sollte das Plugin genauere Informationen zur Crash-Ursache ergeben.

    Damit können wir uns die ganze Sucharbeit evtl. ersparen.

    (Die "pawn.cfg" kannst du dann später wieder löschen, damit das Script wieder normal kompiliert wird)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Piranha ()

  • [18:06:22] [debug] Run time error 4: "Array index out of bounds"
    [18:06:22] [debug] Accessing element at index 65535 past array upper bound 1999
    [18:06:22] [debug] AMX backtrace:
    [18:06:22] [debug] #0 0024735c in ?? ()
    [18:06:22] [debug] #1 002bad54 in ?? ()
    [18:06:22] [debug] #2 00003ff0 in ?? ()
    [18:06:22] Script[gamemodes/gta_suchtis.amx]: Run time error 4: "Array index out of bounds"

    Zitat aus der Debug.txt:
    [18:06:22] CMySQLHandler::Query(SELECT a_new FROM samp_vehicle WHERE id = '248') - Successfully executed.
    [18:06:22] >> mysql_store_result( Connection handle: 1 )
    [18:06:22] CMySQLHandler::StoreResult() - Result was stored.
    [18:06:22] >> mysql_fetch_row_format( Connection handle: 1 )
    [18:06:22] >> mysql_query( Connection handle: 1 )
    [18:06:22] CMySQLHandler::Query(SELECT use_new FROM samp_vehicle WHERE id = '248') - Successfully executed.
    [18:06:22] >> mysql_store_result( Connection handle: 1 )
    [18:06:22] CMySQLHandler::StoreResult() - Result was stored.
    [18:06:22] >> mysql_fetch_row_format( Connection handle: 1 )
    [18:06:22] >> mysql_query( Connection handle: 1 )
    [18:06:22] CMySQLHandler::Query(SELECT use_new FROM samp_vehicle WHERE id = '248') - Successfully executed.
    [18:06:22] >> mysql_store_result( Connection handle: 1 )
    [18:06:22] CMySQLHandler::StoreResult() - Result was stored.
    [18:06:22] >> mysql_fetch_row_format( Connection handle: 1 )
  • Mehr Informationen sind ja nun leider nicht bei rausgekommen. :/
    Die Debug.txt ist aber ganz hilfreich.

    Im Script danach suchen:

    SQL-Abfrage

    1. SELECT use_new FROM samp_vehicle WHERE id =

    Und dort müsste (wahrscheinlich) danach oder davor ein Array mit der Größe MAX_VEHICLES (bzw. 2000) verändert werden.
    Vermutlich wird die VehicleID als Index verwendet, ohne davor abzufragen, ob die VehicleID überhaupt gültig ist (ungültig = 65535, oder auch 0xFFFF). Daher kommt der Fehler
    Einfach diese Abfrage noch hinzufügen.

    Mal ein Beispiel, wie es prinzipiell sein könnte:
    [pwn]new ServerVehicles[MAX_VEHICLES];
    public OnPlayerConnect(playerid) {
    new playerveh = GetPlayerVehicleID(playerid); // Spieler ist in keinem Fahrzeug also "playerveh = 65535"
    ServerVehicles[playerveh] = 1; // verursacht dann (vermutlich) den Fehler
    }[/pwn]
    Korrekt:
    [pwn]new ServerVehicles[MAX_VEHICLES];
    public OnPlayerConnect(playerid) {
    new playerveh = GetPlayerVehicleID(playerid); // Spieler ist in keinem Fahrzeug also "playerveh = 65535"
    if(playerveh != INVALID_VEHICLE_ID) { // eine solche Abfrage sollte rein, um Fehler zu verhindern
    ServerVehicles[playerveh] = 1;
    }
    }[/pwn]
  • Das ist das einzigste was mit samp_vehicles zutun hat.

    [pwn]forward LoadServerCars();
    stock LoadServerCars() {
    new string[10];
    for (new idx = 1; idx < sizeof(Vehicle); idx ++) {
    format(string, sizeof(string),"%d",idx);
    Vehicle[idx][v_use_new] = mysql_GetIntByString("samp_vehicle","use_new","id",string);
    Vehicle[idx][vID] = mysql_GetIntByString("samp_vehicle","id","id",string);
    Vehicle[idx][vModel] = mysql_GetIntByString("samp_vehicle","model","id",string);
    Vehicle[idx][v_X] = mysql_GetFloatByString("samp_vehicle","x","id",string);
    Vehicle[idx][v_Y] = mysql_GetFloatByString("samp_vehicle","y","id",string);
    Vehicle[idx][v_Z] = mysql_GetFloatByString("samp_vehicle","z","id",string);
    Vehicle[idx][v_A] = mysql_GetFloatByString("samp_vehicle","a","id",string);
    strmid(Vehicle[idx][vPlate], mysql_GetStringByString("samp_vehicle","plate","id",string), 0, strlen(mysql_GetStringByString("samp_vehicle","plate","id",string)), 255);
    Vehicle[idx][vC1] = mysql_GetIntByString("samp_vehicle","color1","id",string);
    Vehicle[idx][vC2] = mysql_GetIntByString("samp_vehicle","color2","id",string);
    Vehicle[idx][v_GasNow] = mysql_GetIntByString("samp_vehicle","tank_now","id",string);
    Vehicle[idx][v_GasMax] = mysql_GetIntByString("samp_vehicle","tank_max","id",string);
    Vehicle[idx][vJob] = mysql_GetIntByString("samp_vehicle","job","id",string);
    Vehicle[idx][vRank] = mysql_GetIntByString("samp_vehicle","rank","id",string);
    Vehicle[idx][vLicense] = mysql_GetIntByString("samp_vehicle","license","id",string);
    Vehicle[idx][vInterior] = mysql_GetIntByString("samp_vehicle","interior","id",string);
    Vehicle[idx][v_X_new] = mysql_GetFloatByString("samp_vehicle","x_new","id",string);
    Vehicle[idx][v_Y_new] = mysql_GetFloatByString("samp_vehicle","y_new","id",string);
    Vehicle[idx][v_Z_new] = mysql_GetFloatByString("samp_vehicle","z_new","id",string);
    Vehicle[idx][v_A_new] = mysql_GetFloatByString("samp_vehicle","a_new","id",string);
    Vehicle[idx][v_use_new] = mysql_GetIntByString("samp_vehicle","use_new","id",string);
    Vehicle[idx][v_Towed] = mysql_GetIntByString("samp_vehicle","use_new","id",string);

    //printf("ID: %d, Model: %d, Plate: %s", Vehicle[idx][vID], Vehicle[idx][vModel], Vehicle[idx][vPlate]);
    CreateVehicleForServer(
    Vehicle[idx][vModel],
    Vehicle[idx][v_X],
    Vehicle[idx][v_Y],
    Vehicle[idx][v_Z],
    Vehicle[idx][v_A],
    Vehicle[idx][vC1],
    Vehicle[idx][vC2],
    Vehicle[idx][vInterior],
    Vehicle[idx][vJob],
    Vehicle[idx][vLicense],
    Vehicle[idx][vRank]);

    }
    printf("* Server vehicles sucessfully loaded. *");
    }
    [/pwn]

    [pwn]forward SaveServerCar(idx);
    public SaveServerCar(idx)
    {
    if(idx > sizeof(Vehicle)) return 1;
    if (IsANeewbieBike(idx)) return 1;
    new string[10], Float:X, Float:Y, Float: Z, Float: A, query[300];
    GetVehiclePos(idx, X,Y,Z);
    GetVehicleZAngle(idx, A);
    if(IsVehicleInRangeOfPoint(idx, 10.0, Vehicle[idx][v_X] ,Vehicle[idx][v_Y], Vehicle[idx][v_Z])) {
    Vehicle[idx][v_use_new]=0;
    format(string, sizeof(string), "%s",Vehicle[idx][vPlate]);
    } else {
    Vehicle[idx][v_use_new] = 1;
    format(string, sizeof(string), "%s",Vehicle[idx][vPlate]);
    format(query, sizeof(query), "UPDATE samp_vehicle SET x_new=%f WHERE plate='%s'",X,string);
    mysql_query(query);
    format(query, sizeof(query), "UPDATE samp_vehicle SET y_new=%f WHERE plate='%s'",Y,string);
    mysql_query(query);
    format(query, sizeof(query), "UPDATE samp_vehicle SET z_new=%f WHERE plate='%s'",Z,string);
    mysql_query(query);
    format(query, sizeof(query), "UPDATE samp_vehicle SET a_new=%f WHERE plate='%s'",A,string);
    mysql_query(query);
    }
    format(query, sizeof(query), "UPDATE samp_vehicle SET tank_now=%f WHERE plate='%s'",spawncar_gas[idx],string);
    mysql_query(query);
    format(query, sizeof(query), "UPDATE samp_vehicle SET use_new=%d WHERE plate='%s'",Vehicle[idx][v_use_new],string);
    mysql_query(query);
    format(query, sizeof(query), "UPDATE samp_vehicle SET v_Towed=%d WHERE plate='%s'",Vehicle[idx][v_Towed],string);
    mysql_query(query);
    Vehicle[idx][v_GasNow] = spawncar_gas[idx];
    format(query, sizeof(query), "UPDATE samp_vehicle SET tank_now=%.1f WHERE plate='%s'",Vehicle[idx][v_GasNow],string);
    mysql_query(query);
    return mysql_free_result();
    }[/pwn]

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Marcel2311 ()

  • Wie wird das Array "Vehicle" deklariert?
    Kommt der Server soweit, dass er noch die folgende Nachricht ausgeben kann?
    [pwn]printf("* Server vehicles sucessfully loaded. *");[/pwn]
    Den Code von "CreateVehicleForServer" würde ich mir auch nochmal genauer ansehen.

    Und vielleicht nochmal ein paar Infos zur Datenbank mit den Fahrzeugen:
    z.B. wieviele Datensätze?
  • @Piranha:
    ----------
    Loaded log file: "server_log.txt".
    ----------

    SA-MP Dedicated Server
    ----------------------
    v0.3x, (C)2005-2013 SA-MP Team

    [18:49:10] filterscripts = "" (string)
    [18:49:10]
    [18:49:10] Server Plugins
    [18:49:10] --------------
    [18:49:10] Loading plugin: mysql
    [18:49:10]

    > MySQL plugin R5 successfully loaded.

    [18:49:10] Loaded.
    [18:49:10] Loading plugin: crashdetect
    [18:49:10] CrashDetect v4.10 is OK.
    [18:49:10] Loaded.
    [18:49:10] Loaded 2 plugins.

    [18:49:10]
    [18:49:10] Filterscripts
    [18:49:10] ---------------
    [18:49:10] Loaded 0 filterscripts.

    [18:49:10] 5
    [18:49:10] Serverscript by Sc4ut & Jony & Fear
    [18:49:10] _____________________
    [18:49:10] By: Fear & parts of Astro
    [18:49:10]
    [18:49:10] MySQL-Verbindung wurde erfolgreich hergestellt.
    [18:49:10] MySQL by Jony
    [18:49:10] ________________________
    [18:49:10] * Stable Version *
    [18:49:10] Incoming connection: 127.0.0.1:49193
    [18:49:10] Incoming connection: 127.0.0.1:49192
    [18:49:19] [debug] Run time error 4: "Array index out of bounds"
    [18:49:19] [debug] Accessing element at index 65535 past array upper bound 1999
    [18:49:19] [debug] AMX backtrace:
    [18:49:19] [debug] #0 001c5f0c in ?? ()
    [18:49:19] [debug] #1 0022307c in ?? ()
    [18:49:19] [debug] #2 00003418 in ?? ()
    [18:49:19] Script[gamemodes/gta_suchtis.amx]: Run time error 4: "Array index out of bounds"
    [18:49:19] Number of vehicle models: 68
    [18:49:19] [npc:join] DRIVING_COP_2 has joined the server (0:127.0.0.1)
    [18:49:19] [npc:join] DRIVING_COP_1 has joined the server (1:127.0.0.1)

    [pwn]public CreateVehicleForServer(modelid, Float:X, Float:Y, Float:Z, Float:R, color1, color2, interior, jobid, license, rank)
    {
    new v = CreateVehicle(modelid,Float:X,Float:Y,Float:Z,Float:R,color1,color2,-1);
    spawncar_job[v] = jobid;
    spawncar_license[v] = license;
    spawncar_rank[v] = rank;
    spawncar_interior[v] = interior;
    spawncar_model[v] = modelid;
    if(interior != 0)
    {
    LinkVehicleToInterior(v, interior);
    }
    if(modelid == 428) {
    if(jobid == 1) {
    spawncar_Cash[v] = 0;
    }
    }
    if(jobid == 10)
    {
    if(modelid == 440)
    {
    PlayerHaul[v][pCapasity] = 100;
    }
    if(modelid == 413)
    {
    PlayerHaul[v][pCapasity] = 100;
    }
    if(modelid == 414 || modelid == 498 || modelid == 499
    || modelid == 609)
    {
    PlayerHaul[v][pCapasity] = 150;
    }
    if(modelid == 456 || modelid == 456)
    {
    PlayerHaul[v][pCapasity] = 250;
    }
    if(modelid == 455)
    {
    PlayerHaul[v][pCapasity] = 300;
    }
    }
    NoFuel[v] = 0;
    spawncar_maxgas[v] = GetVehicleTankInhalt(v);
    if(Vehicle[v][v_GasNow] == 0 ) {
    Vehicle[v][v_GasNow] = GetVehicleTankInhalt(v);
    }
    spawncar_gas[v] = Vehicle[v][v_GasNow];
    spawncar_gastype[v] = GetPlayerVehicleTypeForFill(v);

    spawncar_item_type[0][v] = 0;
    spawncar_item_type[1][v] = 0;
    spawncar_item_type[2][v] = 0;
    spawncar_item_amount[0][v] = 0;
    spawncar_item_amount[1][v] = 0;
    spawncar_item_amount[2][v] = 0;

    spawncar_item_id[0][v] = 0;
    spawncar_item_id[1][v] = 0;
    spawncar_item_id[2][v] = 0;

    if(Vehicle[v][v_Towed] != 0) {
    spawncar_towed[v] = 3;
    } else {
    spawncar_towed[v] = 0;
    }
    if(jobid == 444) {
    for(new i=0; i<MAX_PLAYERS; i++) {
    if(IsPlayerConnected(i)) {
    gCarLock[v] = 1;
    LockCar(v);
    vehiclelocked[v]=1;
    }
    }
    if(v == 246) {
    driving_cop_car = v;
    }
    if(v == 247) {
    driving_cop_car2 = v;
    }
    /*if(v == 250) {
    boatcar_npc = v;
    }*/
    }
    spawncar_not_in_use[v] = 0;
    spawncar_OnOff[v] = 0;
    spawncar_sirene[v] = 0;
    spawncar_Lights[v] = 0;
    SetVehicleNumberPlate(v, Vehicle[v][vPlate]);
    vehiclelocked[v] = 0;
    if(modelid == 509)
    {
    spawncar_OnOff[v] = 1;
    new engine,lights2,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(v,engine,lights2,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(v,VEHICLE_PARAMS_ON,lights2,alarm,doors,bonnet,boot,objective);
    }
    if(Vehicle[v][v_use_new] == 1)
    {
    if(spawncar_towed[v] != 0) {
    SetVehiclePos(v, Vehicle[v][v_X_new], Vehicle[v][v_Y_new], Vehicle[v][v_Z_new]);
    SetVehicleZAngle(v, Vehicle[v][v_A_new]);
    } else {
    new vehplace = random(sizeof(ADAC_DEPOT_SPAWNS));
    SetVehiclePos(v, ADAC_DEPOT_SPAWNS[vehplace][0],ADAC_DEPOT_SPAWNS[vehplace][1],ADAC_DEPOT_SPAWNS[vehplace][2]);
    SetVehicleZAngle(v, ADAC_DEPOT_SPAWNS[vehplace][3]);
    }
    }
    return v;
    }[/pwn]

    [Blockierte Grafik: http://i.imagebanana.com/img/l1jcpebg/blablabla.png]

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Marcel2311 ()

  • Gut, so langsam kann ich mir denken, woran es liegt. ;)

    Die Datenbank hat nur 247 Einträge. Wie man aus dem Auszug der Debug.txt entnehmen kann, stürzt es nach dem Versuch, die Daten
    der ID 248 auszulesen, ab. Der Grund dafür ist, dass die ganzen Variablen, womit das Fahrzeug erstellt wird (CreateVehicleForServer) vermutlich auf -1 gesetzt werden, weil die
    Datenbank keine ID 248 findet.
    [pwn]Vehicle[idx][vModel]
    Vehicle[idx][v_X]
    Vehicle[idx][v_Y]
    // ... diese ganze Daten sind dann alle -1[/pwn]

    In der Funktion CreateVehicleForServer passiert dann so etwas (in etwa):
    [pwn]new v = CreateVehicle(-1,-1,-1,-1,-1,-1,-1,-1);[/pwn]
    Ein Fahrzeug kann aber schlecht das Model -1 haben, also wird kein Fahrzeug erstellt und CreateVehicle gibt INVALID_VEHICLE_ID (0xFFFF bzw. 65535) zurück.
    Diesen Wert nimmt die Variable "v" nun an und arbeitet damit weiter.

    Dann entsteht nämlich der Fehler:
    [pwn]spawncar_job[v] = jobid; // entspricht => spawncar_job[65535] = jobid;[/pwn]
    Das Array spawncar_job ist MAX_VEHICLES (2000) groß - durch die Variable v wird aber versucht das 65535. Element des Arrays anzusprechen
    --> folglich entsteht der ganze Fehler.


    Lösungsansatz:
    Um es uns möglichst einfach zu machen und da ich nicht weiß, wie genau das Script im Einzelnen arbeitet, überspringen wir in der Funktion
    LoadServerCars die Fahrzeuge, bei denen z.B. das Model -1 (oder auch kleiner als 400 - um direkt weitere Probleme abzufangen) ist.

    [pwn]stock LoadServerCars() {
    new string[10];
    for (new idx = 1; idx < sizeof(Vehicle); idx ++) {
    format(string, sizeof(string),"%d",idx);
    Vehicle[idx][vModel] = mysql_GetIntByString("samp_vehicle","model","id",string);

    if(Vehicle[idx][vModel] < 400) {
    continue; // break wäre auch möglich, jedoch könnte es sein, dass in der Datenbank die ID's auch Lücken haben
    }

    Vehicle[idx][vID] = mysql_GetIntByString("samp_vehicle","id","id",string);
    Vehicle[idx][v_X] = mysql_GetFloatByString("samp_vehicle","x","id",string);
    Vehicle[idx][v_Y] = mysql_GetFloatByString("samp_vehicle","y","id",string);
    Vehicle[idx][v_Z] = mysql_GetFloatByString("samp_vehicle","z","id",string);
    Vehicle[idx][v_A] = mysql_GetFloatByString("samp_vehicle","a","id",string);
    strmid(Vehicle[idx][vPlate], mysql_GetStringByString("samp_vehicle","plate","id",string), 0, strlen(mysql_GetStringByString("samp_vehicle","plate","id",string)), 255);
    Vehicle[idx][vC1] = mysql_GetIntByString("samp_vehicle","color1","id",string);
    Vehicle[idx][vC2] = mysql_GetIntByString("samp_vehicle","color2","id",string);
    Vehicle[idx][v_GasNow] = mysql_GetIntByString("samp_vehicle","tank_now","id",string);
    Vehicle[idx][v_GasMax] = mysql_GetIntByString("samp_vehicle","tank_max","id",string);
    Vehicle[idx][vJob] = mysql_GetIntByString("samp_vehicle","job","id",string);
    Vehicle[idx][vRank] = mysql_GetIntByString("samp_vehicle","rank","id",string);
    Vehicle[idx][vLicense] = mysql_GetIntByString("samp_vehicle","license","id",string);
    Vehicle[idx][vInterior] = mysql_GetIntByString("samp_vehicle","interior","id",string);
    Vehicle[idx][v_X_new] = mysql_GetFloatByString("samp_vehicle","x_new","id",string);
    Vehicle[idx][v_Y_new] = mysql_GetFloatByString("samp_vehicle","y_new","id",string);
    Vehicle[idx][v_Z_new] = mysql_GetFloatByString("samp_vehicle","z_new","id",string);
    Vehicle[idx][v_A_new] = mysql_GetFloatByString("samp_vehicle","a_new","id",string);
    Vehicle[idx][v_use_new] = mysql_GetIntByString("samp_vehicle","use_new","id",string);
    Vehicle[idx][v_Towed] = mysql_GetIntByString("samp_vehicle","use_new","id",string);
    // [...][/pwn]


    // PS: Zur Sicherheit könnte man auch noch unter "CreateVehicleForServer" eine Abfrage nach "CreateVehicle" machen, ob "v" gleich "INVALID_VEHICLE_ID ist und wenn ja, dann vorzeitig mit "return" abbrechen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Piranha ()

  • Das ist normalerweise dazu da, um Speicher für lokale Variablen bzw. für den Stack und den Heap zu reservieren.

    Der Wert scheint mir aber etwas hoch zu sein.
    Nimm die Zeile mal raus und kompilier das Script nochmal.
    Dann sollte wahrscheinlich so eine Tabelle mit so Daten erscheinen wie diese hier:

    [pwn]Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase

    Header size: 5724 bytes
    Code size: 991264 bytes
    Data size: 21176520 bytes
    Stack/heap size: 16384 bytes; estimated max. usage=4332 cells (17328 bytes)
    Total requirements:22189892 bytes
    <<< Process finished.
    ================ READY ================[/pwn]
    Diese Tabelle mal posten.