Array of Struct siempre devuelve 0x0 en el índice 0

Aquí está mi código de contrato de muestra.

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++;
  }

}

Cada vez que agrego un usuario a mi estructura, el índice de la primera cuenta es 0.

Si verifico esto ingresando el índice 0 en my userIndexStructy el userArray, devuelve la dirección correcta.

Sin embargo, cada vez que mi SetUsersbucle llega 0, devuelve la dirección 0x0y el siguiente bucle devuelve la index[0]dirección almacenada real.

¿Podría alguien explicar qué está sucediendo y por qué siempre devuelve la dirección 0x0 cuando mi ciclo comienza con 0, en lugar de dar la dirección correcta para mis usuarios almacenados en la estructura con índice 0?

¡Gracias!

¡Resuelto!

Simplemente olvidé verificar array.length -1 . Facepalm.

¡Gracias a todos por el tiempo y el esfuerzo!

El código de contrato inteligente que proporcionó no está completo, proporcione el código completo. Te ayudará a entender lo que quieres lograr.
La única función que faltaba era la función de actualización, la edité y la agregué.
Creo que todavía falta la función de transferencia, el contrato inteligente de solidez arroja un error en el remix
Lo siento, se me olvidó sacar eso! Mi error, este contrato no debería usar la función Transferir, se introdujo cuando jugaba con el violín. Editando ahora.

Respuestas (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);
  }

Digamos que quiero agregar la longitud del usuario 1 de userArray= 0. Ahora, como no hay una entrada en el mapeo userIndexStructcon la clave 0, es decir userIndexStruct[0]. Por lo tanto, los atributos restantes de Struct(redondo, propietario, activo e índice) se actualizarán y el índice (0) se insertará en userArray.

No está utilizando una matriz de estructura en ninguna parte del programa anterior. Está almacenando índices en userArrayuna matriz. Está almacenando direcciones en userIndexStructel mapeo y puedo obtener las direcciones adecuadas almacenadas después de ejecutar SetUsersla función.

No está utilizando el mapeo de manera efectiva ya que solo está almacenando índices de matriz como clave. Si la clave de la asignación es distinta de los índices de matriz, deberá utilizar la asignación. En su caso, la matriz de estructuras satisfará los requisitos.

Consulte esta pregunta para comprender más acerca de los patrones de almacenamiento en solidez.

Gracias por la respuesta. Traté de usar el código usado en la publicación del patrón de almacenamiento, pero mis resultados son los mismos. Después de cada bucle, obtengo la dirección 0x0 como valor de retorno. Creé un violín con información detallada, junto con el código que creé a partir del ejemplo anterior. Eche un vistazo a ethfiddle.com/WabNnpZm24
Problema resuelto : olvidé cuándo hago un bucle para establecer la longitud de la matriz: 1. Me siento estúpido ahora.
Me alegra saber que tu problema está resuelto.