Fehler bei multidimensionalen Array

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.
    Undzwar hab' ich das Problem, dass mein multidimensionales Array nicht will.


    Oben im Script definiere ich es so:

    new TicketID = 1;
    new TicketText [][128];


    Und bei meinem Support Befehl mach ich folgendes:

    ocmd:support(playerid, params[]) {
    new text[128];
    if(pData[playerid][pEingeloggt] == 0) return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du musst eingeloggt sein, um Befehle auszuführen!");
    if(sscanf(params, "s[128]", text)) return SendClientMessage(playerid, COLOR_USING, "[Benutzung]{FFFFFF} /support [Text]");
    if(pData[playerid][pTicket] == 1) {
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Du hast dein Supportticket gelöscht!");
    TicketID = TicketID-1;
    pData[playerid][pTicket] = 0;
    } else {
    new msg[64], msg2[160];

    TicketText[TicketID][128] = { text };

    pData[playerid][pTicketID] = TicketID;
    format(msg, sizeof(msg), "[Support]{FFFFFF} Du hast ein Supportticket eröffnet (ID: %d)", TicketID);
    format(msg2, sizeof(msg2), "[Support]{FFFFFF} %s", text);
    SendClientMessage(playerid, COLOR_SUPPORT, msg);
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Deine Frage:");
    SendClientMessage(playerid, COLOR_SUPPORT, msg2);
    TicketID++;
    }
    return 1;
    }


    Error ist folgender:

    Code
    C:\Users\Timo\Desktop\Pawn\gammodes\blueberry.pwn(316) : error 032: array index out of bounds (variable "TicketText")
    C:\Users\Timo\Desktop\Pawn\gammodes\blueberry.pwn(316) : error 006: must be assigned to an array
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    
    2 Errors.


    Ich bitte um Hilfe
    LG
    Maydo


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • Achso, fail:

    ocmd:support(playerid, params[]) {
    new text[128];
    if(pData[playerid][pEingeloggt] == 0) return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du musst eingeloggt sein, um Befehle auszuführen!");
    if(sscanf(params, "s[128]", text)) return SendClientMessage(playerid, COLOR_USING, "[Benutzung]{FFFFFF} /support [Text]");
    if(pData[playerid][pTicket] == 1) {
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Du hast dein Supportticket gelöscht!");
    TicketID = TicketID-1;
    pData[playerid][pTicket] = 0;
    } else {
    new msg[64], msg2[160];

    TicketText[TicketID][128] = { text }; // <--- Das da

    pData[playerid][pTicketID] = TicketID;
    format(msg, sizeof(msg), "[Support]{FFFFFF} Du hast ein Supportticket eröffnet (ID: %d)", TicketID);
    format(msg2, sizeof(msg2), "[Support]{FFFFFF} %s", text);
    SendClientMessage(playerid, COLOR_SUPPORT, msg);
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Deine Frage:");
    SendClientMessage(playerid, COLOR_SUPPORT, msg2);
    TicketID++;
    }
    return 1;
    }


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • Zitat

    TicketText[TicketID] = text;

    Errors habe ich so keine. Allerdings sendet er trotzdem nicht mein erstelltes Ticket:

    Code
    [18:05:27] [Benutzung]{FFFFFF} /support [Text]
    [18:05:36] [Support]{FFFFFF} Du hast ein Supportticket eröffnet (ID: 1)
    [18:05:36] [Support]{FFFFFF} Deine Frage:
    [18:05:36] [Support]{FFFFFF} Ich brauche Hilfe, weil ich dumm bin
    [18:05:44] |------ Offene Tickets ------|
    [18:05:51] [AdminCMD] Ryan hat den Dienst als Administrator begonnen!
    [18:05:53] |------ Offene Tickets ------|



    ocmd:support(playerid, params[]) {
    new text[128];
    if(pData[playerid][pEingeloggt] == 0) return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du musst eingeloggt sein, um Befehle auszuführen!");
    if(sscanf(params, "s[128]", text)) return SendClientMessage(playerid, COLOR_USING, "[Benutzung]{FFFFFF} /support [Text]");
    if(pData[playerid][pTicket] == 1) {
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Du hast dein Supportticket gelöscht!");
    pData[playerid][pTicket] = 0;
    } else {
    new msg[64], msg2[160];

    TicketText[TicketID] = text;

    pData[playerid][pTicketID] = TicketID;
    format(msg, sizeof(msg), "[Support]{FFFFFF} Du hast ein Supportticket eröffnet (ID: %d)", TicketID);
    format(msg2, sizeof(msg2), "[Support]{FFFFFF} %s", text);
    SendClientMessage(playerid, COLOR_SUPPORT, msg);
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Deine Frage:");
    SendClientMessage(playerid, COLOR_SUPPORT, msg2);
    TicketID++;
    }
    return 1;
    }


    ocmd:tickets(playerid, params[]) {
    if(pData[playerid][pAdmin] > 0){
    SendClientMessage(playerid, COLOR_SUPPORT, "|------ Offene Tickets ------|");
    for(new i;i<MAX_PLAYERS;i++){
    if(pData[i][pTicket] == 1) {
    new zeile[128], status[24];

    switch(pData[i][pTicketOffen])
    {
    case 0: status = "Wird bearbeitet";
    case 1: status = "Offen";
    }
    format(zeile, sizeof(zeile), "(%d) %s (%s), Frage: %s", pData[i][pTicketID], GetName(i), status, TicketText[pData[i][pTicketID]]);
    SendClientMessage(playerid, 0xFFFFFFFF, zeile);
    }
    }
    return 1;
    } else {
    return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du hast nicht die nötigen Berechtigungen dazu!");
    }
    }


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • new TicketText [][128];Seit wann kann man arrays so deklarieren?


    Die Längenangabe kann nur dann weg gelassen werden, wenn du der variable direkt beim erstellen einen wert zuweist. Bspw.
    new foo[] = "bar";


    Versuch mal die Größe anzugeben, bspw per MAX_PLAYERS (da du ja offensichtlich für jeden Spieler eine Dimension brauchst).


    Zu Zeile 316 siehe selEcT's 2. Vorschlag. Wobei die längenangaben da auch nicht ganz richtig sind:
    strmid(TicketText[TicketID], text, 0, 128);
    Bitte bedenke, das man Strings nicht per = kopieren sollte.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Mir wird weiterhin bei /tickets nix angezeigt.
    Woran kann das liegen? (Code steht 2 Beiträge über mir)


    //EDIT:

    ocmd:support(playerid, params[]) {
    new text[128];
    if(pData[playerid][pEingeloggt] == 0) return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du musst eingeloggt sein, um Befehle auszuführen!");
    if(sscanf(params, "s[128]", text)) return SendClientMessage(playerid, COLOR_USING, "[Benutzung]{FFFFFF} /support [Text]");
    if(pData[playerid][pTicket] == 1) {
    SendClientMessage(playerid, COLOR_SUPPORT, "[Support]{FFFFFF} Du hast dein Supportticket gelöscht!");
    pData[playerid][pTicket] = 0;
    } else {
    new msg[64], msg2[160];

    strmid(TicketText[TicketID], text, 0, 128);

    pData[playerid][pTicketID] = TicketID;
    format(msg, sizeof(msg), "[Support]{FFFFFF} Du hast ein Supportticket eröffnet (ID: %d). Deine Frage:", TicketID);
    format(msg2, sizeof(msg2), "[Support]{FFFFFF} %s", text);
    SendClientMessage(playerid, COLOR_SUPPORT, msg);
    SendClientMessage(playerid, COLOR_SUPPORT, msg2);

    TicketID++;
    }
    return 1;
    }


    ocmd:tickets(playerid, params[]) {
    if(pData[playerid][pAdmin] > 0){
    SendClientMessage(playerid, COLOR_SUPPORT, "|------ Offene Tickets ------|");
    for(new i;i<MAX_PLAYERS;i++){
    if(pData[i][pTicket] == 1) {
    new zeile[128], status[24];

    switch(pData[i][pTicketOffen])
    {
    case 0: status = "Wird bearbeitet";
    case 1: status = "Offen";
    }
    format(zeile, sizeof(zeile), "(%d) %s (%s), Frage: %s", pData[i][pTicketID], GetName(i), status, TicketText[pData[i][pTicketID]]);
    SendClientMessage(playerid, 0xFFFFFFFF, zeile);
    }
    }
    return 1;
    } else {
    return SendClientMessage(playerid, COLOR_ERROR, "[Fehler]{FFFFFF} Du hast nicht die nötigen Berechtigungen dazu!");
    }
    }

    Keine Errors


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • Ich glaube du hast da einen kleinen Denkfehler drin.
    Die Maximalgröße von Arrays in SA-MP ist 1024 (jedenfalls laut Wiki). Das würde bedeuten, das selbst wenn du das Array so groß machst, du nicht mehr als 1024 Tickets verarbeiten kannst bevor du theoretisch deinen Server neustarten müsstest.
    Da du ja (das entnehmen ich jedenfalls so deinem Code) jeden Spieler nur ein Ticket auf einmal zur Verfügung stellen willst, mach das ganze doch einfach auch per Enum. Da du ja sowieso schon pData[i][pTicket] zum abfragen benutzt, kannst du das gleich alles damit machen.


    Wenn du pTicket als string mit einer länge von 128 deklarierst, kannst du damit gleich alles machen: Abfragen ob ein Ticket existiert und ein Ticket drin speichern.


    Abfragen:if( strlen(pData[playerid][pTicket]) == 0 )
    {
    //Der spieler hat kein Ticket. Kann also ein neues erstellen.
    }
    else
    {
    //Der Spieler hat bereits ein ticket.
    }
    Zuweisen:strmid(pData[playerid][pTicket], text, 0, 128);
    Löschen:strdel(pData[playerid][pTicket], 0, 128);


    So würde ich es jedenfalls machen.




    Warum dein Code nicht geht kann mehrere Ursachen haben.
    Du weist pData[i][pTicketOffen] beispielsweise nie einen wert zu, du kopierst strings mit = , und du solltest definitiv noch eine Abfrage einbauen ob der Spieler überhaupt Online ist.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Ich glaube du hast da einen kleinen Denkfehler drin.
    Die Maximalgröße von Arrays in SA-MP ist 1024 (jedenfalls laut Wiki). Das würde bedeuten, das selbst wenn du das Array so groß machst, du nicht mehr als 1024 Tickets verarbeiten kannst bevor du theoretisch deinen Server neustarten müsstest.


    Die Aussage stimmt nicht du kannst den string so groß machen wie du willst musst jedoch auf die zugesicherten memory für stack und heap achten. Soweit wie mir mal gesagt wurde nimmt sich pawno auch trotz #pragma dynamic den memory was es braucht an memory.


    Ich denk mal eher das die Leute nicht in der Lage sind bei String Length auf die Überschrift zu achten und da steht textdraws das bedeutet im zusammenhang es ist nur möglich 1024 Zeichen
    auf einem textdraw anzuzeigen. Daher hat das nix mit deklarierten arrays zu tun man sollte nur aufpassen bei string-funktionen wie format was bei 4028 Zeichen crashen soll nach double0seven.

  • bei ocmd:tickets fragst du ab:
    if(pData[pTicket] == 1)


    aber du setzt sie bei ocmd:support nicht auf 1



    Danke euch Beiden.
    Grade auch dir maddin. Ich habe mit der Zeit den Überblick verloren und hab es mir schwieriger vorgestellt, als es ist. Eine Frage hätte ich noch:


    Warum sollte man Variablen mit "strmid"und nicht einfach per "=" Operator zuweisen?


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

    Einmal editiert, zuletzt von Maydo () aus folgendem Grund: Formatierung