Array of Struct gibt immer 0x0 bei Index 0 zurück

Hier ist mein Mustervertragscode.

contract SimpleStore {

  uint public BetRound;
  uint public SelectedUser;

  struct Struct {
    uint _round;
    address _owner;
    uint _index;
    bool _active;
  }

  mapping(uint => Struct) public userIndexStruct;
  uint[] public userArray;

  function add(address _address) public {
    Struct storage accounts = userIndexStruct[userArray.length];
    accounts._round = BetRound+ 1;
    accounts._owner = _address;
    accounts._active = true;
    accounts._index = userArray.length;

    userArray.push(accounts._index);
  }

  function update(uint _index) public {
    userIndexStruct[_index]._round++;
  }

  function SetUsers() public returns (uint) {
      // If we reached the end of our array
      // it should mean we looped all users already
      // We need to increment the BetRound
      if(SelectedUser >= userArray.length ) {
          BetRound++;
          SelectedUser = 0;
      }

        for (uint i = SelectedUser; i < userArray.length; i++) {

          if (userIndexStruct[i]._round < BetRound) {
            if (userIndexStruct[i]._active) {
                // This is the user who is next to receive a reward.
                // Send rewards to the user, and then update his round.
                update(i);
                SelectedUser = i;
                // Return what user was selected
                return i;
            }
          }
        }

        // Our loop finished without result, we should move to the next round.
        BetRound++;
  }

}

Immer wenn ich meiner Struktur einen Benutzer hinzufüge, ist der erste Kontoindex 0.

userIndexStructWenn ich dies verifiziere, indem ich Index 0 in my und the eintrage userArray, gibt es die richtige Adresse zurück.

Jedes Mal, wenn meine SetUsersSchleife trifft 0, gibt sie jedoch address zurück 0x0, und in der nächsten Schleife gibt sie die tatsächlich gespeicherte index[0]Adresse zurück.

Könnte jemand bitte erklären, was passiert und warum es immer die 0x0-Adresse zurückgibt, wenn meine Schleife mit 0 beginnt, anstatt die richtige Adresse für meine Benutzer anzugeben, die in der Struktur mit Index 0 gespeichert sind?

Danke schön!

Gelöst!

Ich habe einfach vergessen, array.length -1 zu überprüfen . Gesichtspalme.

Vielen Dank an alle für die Zeit und Mühe!

Der von Ihnen bereitgestellte Smart-Contract-Code ist nicht vollständig. Bitte geben Sie den vollständigen Code an. Es hilft zu verstehen, was Sie erreichen wollen.
Die einzige fehlende Funktion war die Update-Funktion, ich habe sie bearbeitet und hinzugefügt.
Ich denke, die Übertragungsfunktion fehlt immer noch, Solidity Smart Contract wirft Fehler im Remix
Entschuldigung, vergessen, das herauszunehmen! Meine Güte, dieser Vertrag sollte die Transferfunktion nicht nutzen, es kam beim Herumspielen auf Geige rein. Jetzt bearbeiten.

Antworten (1)

  function add(address _address) public {
    Struct storage accounts = userIndexStruct[userArray.length];
    accounts._round = BetRound+ 1;
    accounts._owner = _address;
    accounts._active = true;
    accounts._index = userArray.length;

    userArray.push(accounts._index);
  }

Nehmen wir an, ich möchte die 1. Benutzerlänge userArray= 0 hinzufügen. Nun, da es keinen Eintrag in der Zuordnung userIndexStructmit dem Schlüssel 0 gibt, dh userIndexStruct[0]. Die verbleibenden Attribute von Struct(round, owner, active und index) werden also aktualisiert und index(0) wird in eingefügt userArray.

Sie verwenden nirgendwo im obigen Programm ein Array von Strukturen. Sie speichern Indizes im userArrayArray. Sie speichern Adressen in userIndexStructder Zuordnung und ich kann die richtigen Adressen nach dem Ausführen der SetUsersFunktion speichern.

Sie verwenden das Mapping nicht effektiv, da Sie nur Array-Indizes als Schlüssel speichern. Wenn der Schlüssel der Zuordnung ein anderer als Array-Indizes ist, müssen Sie die Zuordnung verwenden. In Ihrem Fall wird eine Reihe von Strukturen die Anforderungen erfüllen.

Beziehen Sie sich auf diese Frage, um mehr über Speichermuster in Solidität zu erfahren.

Danke für Ihre Antwort. Ich habe versucht, den im Speichermuster-Beitrag verwendeten Code zu verwenden, aber meine Ergebnisse sind dieselben. Nach jeder Schleife bekomme ich die Adresse 0x0 als Rückgabewert. Ich habe eine Geige mit detaillierten Informationen erstellt, zusammen mit dem Code, den ich aus dem obigen Beispiel erstellt habe. Bitte werfen Sie einen Blick auf ethfiddle.com/WabNnpZm24
Problem gelöst - Ich habe vergessen, wann ich die Array-Länge setze - 1. Ich fühle mich jetzt dumm.
Schön zu wissen, dass Ihr Problem gelöst ist.