Array einträge verschieben

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

  • enum WantedInfo
    {
    name[24],
    time,
    reason[64]
    }


    new WantedHistory[50][WantedInfo] = {
    {Name1,"111","Reason1"},
    {Name2,"222","Reason2"},
    {Name3,"333","Reason3"}
    };


    Ist es Möglich das Array so zu bearbeiten das man alle einträge um einen Speicherplatz nach "unten schiebt" also

    WantedHistory[1][WantedInfo] = WantedHistory[0][WantedInfo]
    WantedHistory[2][WantedInfo] = WantedHistory[1][WantedInfo]

    Und im ersten einen neuen Eintrag macht?
    Das letzte fällt natürlich immer Weg da es vom Vorletzten besetzt wird.

  • for(new i; i < sizeof(WantedHistory); i++) {
    if(i != sizeof(WantedHistory) {
    WantedHistory[i][WantedInfo] = WantedHistory[i+1][WantedInfo]
    }
    }


    for(new i=1; i < sizeof(WantedHistory); i++) {
    if(i != sizeof(WantedHistory) {
    WantedHistory[i][WantedInfo] = WantedHistory[i-1][WantedInfo]
    }
    }
    Wenn überhaupt so, da er ja will, dass die Variable immer um eins zurückgesetzt wird.

  • Euch ist klar, dass ihr mit der Variante nur den selben Inhalt weitergebt?
    @[IRP]Steve_McGarrett:
    Das hier war schon richtig..Zumindest vom Grundgedanken her.

    WantedHistory[i][WantedInfo] = WantedHistory[i+1][WantedInfo];

    Da die Einträge bei 0 Anfangen. Du kannst wohl kaum einem Index den Wert -5 zuweisen. ;)
    Jedoch musst du die einzelnen Variablen speichern und dann wieder ausgeben [BE]axi92:
    Die Variablen dafür erstellst du vor der Schleife und lässt diese in ihr beschreiben.


    Gruß.

  • Das sollte so funktionieren


    stock AddEntry(aName[],aTime,aReason[]){
    new i = sizeof(WantedHistory)-1;
    for(; i != 0;--i){
    format(WantedHistory[i][name],MAX_PLAYER_NAME,WantedHistory[i-1][name]);
    format(WantedHistory[i][reason],64,WantedHistory[i-1][reason]);
    WantedHistory[i][time] = WantedHistory[i-1][time];
    }
    format(WantedHistory[i][name],MAX_PLAYER_NAME,aName);
    format(WantedHistory[i][reason],64,aReason);
    WantedHistory[i][time] = aTime;
    return 1;
    }


    Auf den Enumname kann man nicht direkt zugreifen um alle Werte zu übertragen

  • IPrototypeI Bei deiner Zeile 8,9,10 verstehe ich das "i" nicht das ist laut deiner definition 49 weil das array 50 plätze hat ich will den neuen Eintrag aber immer auf 0 haben.
    Oder lese ich etwas falsch?


    Ja du verstehst das ein wenig falsch sie Schleife fängt bei zum bsp beim index 49 an und verschiebt die ganzen werte um 1 nach oben , da er nach unten zählt, für den neuen Eintrag hat i den wert 0 sodass der 1 Eintrag immer gefüllt wird.


    Der Code ist getest und funktioniert auch ^^

  • Also erstens:
    Mehrdimensionale Arrays müssen komplett indiziert werden:
    new WantedHistory[10][WantedInfo] = {
    {"ac",111,"Reason1"},
    {"acds",222,"Reason2"},
    {"adfc",333,"Reason3"},
    {},
    {},
    {},
    {},
    {},
    {},
    {}
    };


    Und zweitens:
    Warum, IPrototypeI:, so umständlich?
    Das geht doch ganz einfach:
    for(new i=sizeof(WantedHistory)-1; i>0; i--) WantedHistory[i] = WantedHistory[i-1];
    Mehr ist es nicht. Stell dir mal vor du hast ein Enum mit 100 Einträgen, was das für ein Spaß wird die alle einzeln zu übertragen.


    Nach der Zeile einfach:
    format(WantedHistory[0][reason],64, "NEU");
    //...


    [BE]axi92:
    Du warst also ganz nah dran, ohne die Schleife sähe es so aus:
    WantedHistory[9] = WantedHistory[8];
    //...
    WantedHistory[2] = WantedHistory[1];
    WantedHistory[1] = WantedHistory[0];

  • Jeffry


    Gut zu wissen, ich dachte immer das ganze geht nur bei Arrays ohne Enum als Index, jedoch wurde ich eines besseren belehrt.



    stock AddEntry(aName[],aTime,aReason[]){
    new i = sizeof(WantedHistory)-1;
    for(; i != 0;--i){
    WantedHistory[i] = WantedHistory[i-1];
    }
    format(WantedHistory[i][name],MAX_PLAYER_NAME,aName);
    format(WantedHistory[i][reason],64,aReason);
    WantedHistory[i][time] = aTime;
    return 1;
    }

  • Gut zu wissen, ich dachte immer das ganze geht nur bei Arrays ohne Enum als Index, jedoch wurde ich eines besseren belehrt.


    Jo, das gute ist, es funktioniert auf allen Ebenen, zum Glück! Was das sonst für ein Aufwand wäre, ein dreidimensionales Array zu kopieren, das wäre wirklich nicht schön. :D


    Also sowas hier würde auch gehen:
    new WantedHistory2[10][WantedInfo];
    WantedHistory2 = WantedHistory;