Problem mit Werbungssystem

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
  • Ich habe ein kleines Werbungsystem im Textdraw geschrieben, bekomme aber immer 3 Errors :(


    ERRORS:
    Code:

    Code
    C:\Users\exod\Desktop\German Next Era Life - v2.5\gamemodes\GNE.pwn(51904) : error 032: array index out of bounds (variable "Werbung")
    C:\Users\exod\Desktop\German Next Era Life - v2.5\gamemodes\GNE.pwn(51905) : error 032: array index out of bounds (variable "Werbung")
    C:\Users\exod\Desktop\German Next Era Life - v2.5\gamemodes\GNE.pwn(51906) : error 032: array index out of bounds (variable "Werbung")


    enum werbeenum{
    wwerbung[50],
    wvon[24],
    wnum,
    bool:waktiv = false
    }
    new Werbung[5][werbeenum];


    ocmd:werbung(playerid, params[]){
    new id=GetFreeWerbeSlot();
    new xwerbung[50], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName,sizeof(pName));
    if(id != -1){
    //wwerbung, wvon, wnum
    if(sscanf(params, "s", xwerbung))return SendClientMessage(playerid, COLOR_GREEN, "Benutzung: /werbung [Werbetext])");
    if(strlen(xwerbung) > 50)return SendClientMessage(playerid, COLOR_RED, "Die Werbung darf nicht länger als 50 Stellen sein");
    strdel(Werbung[id][wwerbung], 0, strlen(Werbung[id][wwerbung]));
    strmid(Werbung[id][wwerbung], xwerbung, 0, strlen(xwerbung));
    Werbung[id][waktiv] = true;
    strdel(Werbung[id][wvon], 0, strlen(pName));
    strmid(Werbung[id][wvon], pName, 0, strlen(pName));
    Werbung[id][wnum] = PlayerInfo[playerid][pPnumber];
    }
    return 1;
    }


    GetFreeWerbeSlot(){
    for(new i=0;i<sizeof(Werbung);i++){
    if(!Werbung[i][waktiv])continue;
    return i;
    }
    return -1;
    }

  • Naja, das erklärt nicht den Error.
    Aber warum sollte es nicht funktionieren, wenn ich es auf True stelle ? etc.


    Wenn du keine Ahnung hast, dann unterlasse doch bitte solche unbegründeten Aussagen.
    Was ich beschrieben habe erklärt sehr wohl den Error, weil vordefinierte Werte in Enumeratoren nicht möglich sind. Das ist eine Tatsache. Falls du anderer Meinung bist, begründe diese bitte, bzw. füge einen Beweis dazu, anstatt falsche Behauptungen auszustellen.
    ...Das scheint zur Zeit zur Mode hier zu werden.

  • Was ich beschrieben habe erklärt sehr wohl den Error,



    Du kannst es so machen wie das Muster sagt
    enum Johannes {
    bool:wurst = true,
    bool:salami = false,
    Werner = 2
    };
    new Schinken[Johannes];
    Jedoch werden die Werte nicht angenommen nach mein Test
    printf("%d, %d, %d",Schinken[wurst],Schinken[salami],Schinken[Werner]);
    alles ergibt 0 also ein Error erzeugt sowas definitiv nicht!

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

  • Um es nochmal zu verdeutlichen mach ich mal nach dialogen nen enum
    normalerweise schaut es so aus
    enum{
    dialogeins,
    dialogzwei,
    dialogdrei
    }


    man kann aber im Enum sagen er soll ab 3 beginnen das dann so aussehen kann
    enum{
    dialogdrei = 3,
    dialogvier,
    dialogfuenf
    }
    Sprich er beginnt erst ab 3
    Und die aussage das man mit enums nix festlegen kann stimmt nur halb

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

  • Beavis: Ich danke dir für den Test. Da es mit strings nicht geht, bin ich davon ausgegangen, dass es auch für andere Typen nicht geht. Das war falsch. Anscheinend interessiert es den Compiler nicht.
    Es "funktioniert" nicht, weil der Wert dem enum-Wert zugeordnet wird, und nicht der variable an sich. Den Compiler stört es nicht. Gut zu wissen.


    Cydia: Ich nehme meine Aussage zurück, sorry. Trotzdem solltest du darauf achten, Begründungen beizusteuern. ;)


    Sofern bis heute Abend noch keine Lösung vorhanden ist, werde ich mich genauers damit beschäftigen.





    EDIT: Nach eigenem Test stellt sich heraus, dass es NICHT möglich ist, wie Anfangs gesagt. Siehe Posts weiter unten.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Teste mal das hier
    //statt
    strdel(Werbung[id][wwerbung], 0, strlen(Werbung[id][wwerbung]));
    strmid(Werbung[id][wwerbung], xwerbung, 0, strlen(xwerbung));
    //zu den
    format(Werbung[id][wwerbung],50,xwerbung);

    //Und statt
    strdel(Werbung[id][wvon], 0, strlen(pName));
    strmid(Werbung[id][wvon], pName, 0, strlen(pName));
    //zu den
    format(Werbung[id][wvon],24,pName);
    ich denke das die Fehler kommen durch das strlen das du in den strmid und strdel nutzt

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

  • So, jetzt hatte ich die Möglichkeit das ganze zu kompilieren. Ich ziehe meinen Rückzug zurück (wie auch immer...). Leider kann ich den gelöschten Post nicht wiederherstellen, aber was ich zu Anfang sagte, dass es an der Definition innerhalb des Enumerators liegt ist korrekt! Dies behebt alle Errors.


    Ursprünglich sagte ich:
    Der Fehler liegt daran, dass man keine Vordefinitionen in Enumeratoren machen kann. Mache daher aus:
    bool:waktiv = false
    Das hier:
    bool:waktiv


    Damit wäre der Fehler behoben.



    Hier der korrekte Beweis:
    Mit der Vordefinition:


    Ohne:



    Alle vorherigen "Beweise" müssen fehlerhaft, bzw. nicht korrekt ausgeführt, gewesen sein.



    Cydia: Nein, das ist nicht der Fall, da der Compiler Case-Sensitive ist. Beweis: http://pokit.org/get/img/a4c39…0f2606c35149a3913fbbc.jpg