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.
userIndexStruct
Wenn ich dies verifiziere, indem ich Index 0 in my und the eintrage userArray
, gibt es die richtige Adresse zurück.
Jedes Mal, wenn meine SetUsers
Schleife 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!
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 userIndexStruct
mit 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 userArray
Array. Sie speichern Adressen in userIndexStruct
der Zuordnung und ich kann die richtigen Adressen nach dem Ausführen der SetUsers
Funktion 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.
Soham Lawar
De ruige
Soham Lawar
De ruige