Probleme mit einem Arrey

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
  • Hallo


    Ich habe einen Command von Strcmp in DCMD umgeschrieben und nun habe ich ein kleines Problem. Ich kann mit einer Nummer ein 3er Koordinatenpaar aus einem Arrey auswählen und diese abspeichern. Ich will also die Zahl die man eingibt ins Arrey eingeben:


    C:\Users\Simon\Desktop\dudalus232.pwn(8944) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8945) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8946) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8947) : error 032: array index out of bounds (variable "Typen")
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.


    new Typen[][haus_typ] =
    {
    {1,223.043991,1289.259888,1082.199951}, //Schlecht
    {2,225.756989,1240.000000,1082.149902}, //Schlecht
    {3,235.508994,1189.169897,1080.339966}, //Gut
    {7,225.630997,1022.479980,1084.069946} //Sehr Gut
    };


    dcmd_chaus(playerid,params[])
    {
    new spielzeit, vworld;
    if(sscanf(params, "dddd",kosten,spielzeit,haus,vworld)) SendClientMessage(playerid, COLOR_WHITE,"Verwendung: /chaus [Kosten] [Spielzeit in h] [Haus] [Virtual World]");
    else if(!IsPlayerAdmin(playerid)) return 1;
    else if(spielzeit < 0) return SendClientMessage(playerid,COLOR_GREY,"Die Spielzeit muss minimal bei 0 Stunden liegen!");
    else
    {
    new string[256];
    new Float:nowPos[3];
    new slotid = initHSlot();
    new fullid = (slotid==-1) ? (_cache_haus) : (slotid);
    GetPlayerPos(playerid,nowPos[0],nowPos[1],nowPos[2]);
    HausDaten[fullid][ax] = nowPos[0];
    HausDaten[fullid][ay] = nowPos[1];
    HausDaten[fullid][az] = nowPos[2];
    HausDaten[fullid][play_time] = spielzeit;
    HausDaten[fullid][kosten] = kosten;
    HausDaten[fullid][interior] = Typen[haus][interior];
    HausDaten[fullid][ix] = Typen[haus][haus_x];
    HausDaten[fullid][iy] = Typen[haus][haus_y];
    HausDaten[fullid][iz] = Typen[haus][haus_z];
    HausDaten[fullid][virtual_world] = vworld;
    HausDaten[fullid][verschlossen] = 1;
    HausDaten[fullid][nicht_zum_kauf] = 0;
    strmid(HausDaten[fullid][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    HausDaten[fullid][pickid] = CreatePickup(1273,1,nowPos[0],nowPos[1],nowPos[2],0);
    format(string,sizeof string,"Besitzer : Keiner\nScore : %d\nKosten : %d$",spielzeit,kosten);
    HausDaten[fullid][lbl_haus] = Create3DTextLabel(string,0x00FF00FF,nowPos[0],nowPos[1],nowPos[2],10.0,0,0);
    HausDaten[fullid][icon_id] = bCreateMapIcon(nowPos[0],nowPos[1],_,31,0);
    if(slotid==-1)_cache_haus++;
    SaveHCache();
    }
    return 1;
    }


    Ich habe jedoch noch eine andere Frage:
    Wenn ich mit sscanf und ohne else if Schleifen und am Ende mit einer else Schleife arbeite, kommt bei jedem Commands den ich eingebe die sscanf-Zeile. Wie kann ich da sumgehen, damit ich die else-if Schleifen und logischerweise auch das else nicht benutzen muss ?


    MfG dUDA

  • new Typen[][4] =
    {
    {1,223.043991,1289.259888,1082.199951}, //Schlecht
    {2,225.756989,1240.000000,1082.149902}, //Schlecht
    {3,235.508994,1189.169897,1080.339966}, //Gut
    {7,225.630997,1022.479980,1084.069946} //Sehr Gut
    };

  • new Typen[4][haus_typ] =
    {
    {1,223.043991,1289.259888,1082.199951}, //Schlecht
    {2,225.756989,1240.000000,1082.149902}, //Schlecht
    {3,235.508994,1189.169897,1080.339966}, //Gut
    {7,225.630997,1022.479980,1084.069946} //Sehr Gut
    };
    Und zeig mal bitte enum hapy_typ

  • Hallo


    Bei Neos Lösung kommen noch die Fehler:


    C:\Users\Simon\Desktop\dudalus232.pwn(8945) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8946) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8947) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8948) : error 032: array index out of bounds (variable "Typen")
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.


    enum haus_typ
    {
    interior,
    Float:haus_x,
    Float:haus_y,
    Float:haus_z
    }


    MfG dUDA

  • Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
    Bei mir läuft das wunderbar

  • Bitte nicht doppelt die größe des Arrays festlegen. Belasse es bei "new Typen[][haus_typ] =".

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Code
    Hallo
    
    
    Neo, der Befehl, wo ich ins Typen reinspeichere bleibt aber
    
    
    Typen[][haus_typ] = blbalab


    Nein, die werden unter dem new Typen definiert.


    ray187: Das macht keinen Unterschied ob man die Größe selbst festlegt [4] oder ihn zählen lässt []

  • Hallo


    Ich habe dann aber imme rnoch dieses Problem:


    dcmd_chaus(playerid,params[])
    {
    new spielzeit, vworld;
    if(sscanf(params, "dddd",kosten,spielzeit,haus,vworld)) SendClientMessage(playerid, COLOR_WHITE,"Verwendung: /chaus [Kosten] [Spielzeit in h] [Haus] [Virtual World]");
    else if(!IsPlayerAdmin(playerid)) return 1;
    else if(spielzeit < 0) return SendClientMessage(playerid,COLOR_GREY,"Die Spielzeit muss minimal bei 0 Stunden liegen!");
    else
    {
    new string[256];
    new Float:nowPos[3];
    new slotid = initHSlot();
    new fullid = (slotid==-1) ? (_cache_haus) : (slotid);
    GetPlayerPos(playerid,nowPos[0],nowPos[1],nowPos[2]);
    HausDaten[fullid][ax] = nowPos[0];
    HausDaten[fullid][ay] = nowPos[1];
    HausDaten[fullid][az] = nowPos[2];
    HausDaten[fullid][play_time] = spielzeit;
    HausDaten[fullid][kosten] = kosten;
    HausDaten[fullid][interior] = Typen[haus][interior];
    HausDaten[fullid][ix] = Typen[haus][haus_x];
    HausDaten[fullid][iy] = Typen[haus][haus_y];
    HausDaten[fullid][iz] = Typen[haus][haus_z];
    HausDaten[fullid][virtual_world] = vworld;
    HausDaten[fullid][verschlossen] = 1;
    HausDaten[fullid][nicht_zum_kauf] = 0;
    strmid(HausDaten[fullid][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    HausDaten[fullid][pickid] = CreatePickup(1273,1,nowPos[0],nowPos[1],nowPos[2],0);
    format(string,sizeof string,"Besitzer : Keiner\nScore : %d\nKosten : %d$",spielzeit,kosten);
    HausDaten[fullid][lbl_haus] = Create3DTextLabel(string,0x00FF00FF,nowPos[0],nowPos[1],nowPos[2],10.0,0,0);
    HausDaten[fullid][icon_id] = bCreateMapIcon(nowPos[0],nowPos[1],_,31,0);
    if(slotid==-1)_cache_haus++;
    SaveHCache();
    }
    return 1;
    }


    C:\Users\Simon\Desktop\dudalus232.pwn(8945) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8946) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\dudalus232.pwn(8947) : error 032: array index out of bounds (variable "Typen")
    C:\Users\Simon\Desktop\dudalus232.pwn(8948) : error 032: array index out of bounds (variable "Typen")
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.

  • Weil das so auch nicht geht... Die sind ja schon definiert, die kannst du auch nicht ändern. Außerdem kann haus > 4 sein, deswegen der Error.


  • ray187: Das macht keinen Unterschied ob man die Größe selbst festlegt [4] oder ihn zählen lässt []


    Ist aber äußerst unnötig und in dem Moment indem du neue Blöcke hinzufügen willst reißt Dir da die Haare aus. Von daher, gar nicht erst anfangen. Vorallem bei großen Arrays und als Empfehlung für alle die nicht sehr firm mit scripten sind. Einfach ein schlechter Stil.



    Dudalus. Poste doch mal kurz die vier Zeilen. Ob haus>4 ist hat mit den Fehlermeldungen übrigens nichts zu tun - schon bei >3 wird es zu Fehlern kommen - aber nicht zu Compilerfehlern. Das merkste dann ingame wenn der restl. Code nicht mehr ausgeführt wird.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

    Einmal editiert, zuletzt von ray187 ()

  • Hallo


    Wenn es grösser als 4 ist, passiert doch einfach nichts. Ich poste jetzt nochmals alle Sachen:


    new Typen[4][haus_typ] =
    {
    {1,223.043991,1289.259888,1082.199951}, //Schlecht
    {2,225.756989,1240.000000,1082.149902}, //Schlecht
    {3,235.508994,1189.169897,1080.339966}, //Gut
    {7,225.630997,1022.479980,1084.069946} //Sehr Gut
    };


    enum haus_typ
    {
    interior,
    Float:haus_x,
    Float:haus_y,
    Float:haus_z
    }


    dcmd_chaus(playerid,params[])
    {
    new spielzeit, vworld;
    if(sscanf(params, "dddd",kosten,spielzeit,haus,vworld)) SendClientMessage(playerid, COLOR_WHITE,"Verwendung: /chaus [Kosten] [Spielzeit in h] [Haus] [Virtual World]");
    else if(!IsPlayerAdmin(playerid)) return 1;
    else if(spielzeit < 0) return SendClientMessage(playerid,COLOR_GREY,"Die Spielzeit muss minimal bei 0 Stunden liegen!");
    else
    {
    new string[256];
    new Float:nowPos[3];
    new slotid = initHSlot();
    new fullid = (slotid==-1) ? (_cache_haus) : (slotid);
    GetPlayerPos(playerid,nowPos[0],nowPos[1],nowPos[2]);
    HausDaten[fullid][ax] = nowPos[0];
    HausDaten[fullid][ay] = nowPos[1];
    HausDaten[fullid][az] = nowPos[2];
    HausDaten[fullid][play_time] = spielzeit;
    HausDaten[fullid][kosten] = kosten;
    HausDaten[fullid][interior] = Typen[haus][interior];
    HausDaten[fullid][ix] = Typen[haus][haus_x];
    HausDaten[fullid][iy] = Typen[haus][haus_y];
    HausDaten[fullid][iz] = Typen[haus][haus_z];
    HausDaten[fullid][virtual_world] = vworld;
    HausDaten[fullid][verschlossen] = 1;
    HausDaten[fullid][nicht_zum_kauf] = 0;
    strmid(HausDaten[fullid][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    HausDaten[fullid][pickid] = CreatePickup(1273,1,nowPos[0],nowPos[1],nowPos[2],0);
    format(string,sizeof string,"Besitzer : Keiner\nScore : %d\nKosten : %d$",spielzeit,kosten);
    HausDaten[fullid][lbl_haus] = Create3DTextLabel(string,0x00FF00FF,nowPos[0],nowPos[1],nowPos[2],10.0,0,0);
    HausDaten[fullid][icon_id] = bCreateMapIcon(nowPos[0],nowPos[1],_,31,0);
    if(slotid==-1)_cache_haus++;
    SaveHCache();
    }
    return 1;
    }

  • Wenn es größer als 3 ist wird der nachfolgende Code höchstwarsch. nicht mehr ausgeführt (wie gerade erwähnt). Einfach einen Check in die Funktion einbauen und schon ist das Problem gegessen.


    Es wäre äußerst hilfreich wenn du die Zeilennummern dazuschreiben würdest - oder einfach mal nur Zeile 8945-.49, denn:


    enum haus_typ
    {
    interior,
    Float:haus_x,
    Float:haus_y,
    Float:haus_z
    }
    new Typen[4][haus_typ] =
    {
    {1,223.043991,1289.259888,1082.199951}, //Schlecht
    {2,225.756989,1240.000000,1082.149902}, //Schlecht
    {3,235.508994,1189.169897,1080.339966}, //Gut
    {7,225.630997,1022.479980,1084.069946} //Sehr Gut
    };


    .. erzeugt keinen Compile-Fehler.


    Sind das dann wohl diese Zeilen?


    HausDaten[fullid][interior] = Typen[haus][interior];
    HausDaten[fullid][ix] = Typen[haus][haus_x];
    HausDaten[fullid][iy] = Typen[haus][haus_y];
    HausDaten[fullid][iz] = Typen[haus][haus_z];


    Der Fehler liegt daran dass du irgendwo "haus" deklarierst und es höher als 3 setzt. Warum wird das nicht in der Funktion deklariert?

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Hallo


    Problem gelöst, ein Enum hiess so *schäm in den Boden* :rolleyes:
    Danke aber für eure Hilfe


    MfG dUDA


    //Edit
    Es geht nochnicht ganz, denn als Preis wird immer 32 Dollar angezeigt O_o


    dcmd_chaus(playerid,params[])
    {
    new spielzeit, hkosten,vworld, hhaus;
    if(sscanf(params, "dddd",hkosten,spielzeit,hhaus,vworld)) SendClientMessage(playerid, COLOR_WHITE,"Verwendung: /chaus [Kosten] [Spielzeit in h] [Haus] [Virtual World]");
    else if(!IsPlayerAdmin(playerid)) return 1;
    else if(spielzeit < 0) return SendClientMessage(playerid,COLOR_GREY,"Die Spielzeit muss minimal bei 0 Stunden liegen!");
    else
    {
    new string[256];
    new Float:nowPos[3];
    new slotid = initHSlot();
    new fullid = (slotid==-1) ? (_cache_haus) : (slotid);
    GetPlayerPos(playerid,nowPos[0],nowPos[1],nowPos[2]);
    HausDaten[fullid][ax] = nowPos[0];
    HausDaten[fullid][ay] = nowPos[1];
    HausDaten[fullid][az] = nowPos[2];
    HausDaten[fullid][play_time] = spielzeit;
    HausDaten[fullid][kosten] = kosten;
    HausDaten[fullid][interior] = Typen[hhaus][interior];
    HausDaten[fullid][ix] = Typen[hhaus][haus_x];
    HausDaten[fullid][iy] = Typen[hhaus][haus_y];
    HausDaten[fullid][iz] = Typen[hhaus][haus_z];
    HausDaten[fullid][virtual_world] = vworld;
    HausDaten[fullid][verschlossen] = 1;
    HausDaten[fullid][nicht_zum_kauf] = 0;
    strmid(HausDaten[fullid][Besitzer],"Keiner",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    HausDaten[fullid][pickid] = CreatePickup(1273,1,nowPos[0],nowPos[1],nowPos[2],0);
    format(string,sizeof string,"Besitzer : Keiner\nScore : %d\nKosten : %d$",spielzeit,hkosten);
    HausDaten[fullid][lbl_haus] = Create3DTextLabel(string,0x00FF00FF,nowPos[0],nowPos[1],nowPos[2],10.0,0,0);
    HausDaten[fullid][icon_id] = bCreateMapIcon(nowPos[0],nowPos[1],_,31,0);
    if(slotid==-1)_cache_haus++;
    SaveHCache();
    }
    return 1;
    }


    //Edit 2
    Gelöst, habe etwas im falschen Script korrigiert ^^