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 userIndexStruct
y el userArray
, devuelve la dirección correcta.
Sin embargo, cada vez que mi SetUsers
bucle llega 0
, devuelve la dirección 0x0
y 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!
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 userIndexStruct
con 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 userArray
una matriz. Está almacenando direcciones en userIndexStruct
el mapeo y puedo obtener las direcciones adecuadas almacenadas después de ejecutar SetUsers
la 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.
soham lawar
De ruige
soham lawar
De ruige