Ist es in einem Vertrag mit Solidity möglich, einen Zeiger auf eine Speichervariable in einer Speichervariablen (oder an einer anderen geeigneten Stelle) zu speichern und von verschiedenen Funktionen aus darauf zuzugreifen?
Betrachten Sie das folgende Beispiel in Solidity-Pseudocode:
contract AContract {
struct AStruct {
uint a_field;
}
AStruct variable_a;
AStruct variable_b;
AStruct storage pointer_to_either_a_or_b;
modifier AModifier()
{
if (condition_a)
{
pointer_to_either_a_or_b = variable_a;
}
else
{
pointer_to_either_a_or_b = variable_b;
}
}
function AFunctionUsingPointerToAorB100() internal AModifier()
{
pointer_to_either_a_or_b.a_field = 100;
}
function AFunctionUsingPointerToAorB200() internal AModifier()
{
pointer_to_either_a_or_b.a_field = 200;
}
}
Immer wenn ich versuche, das Schlüsselwort "storage" für eine Speichervariable zu verwenden, erhalte ich den folgenden Kompilierungsfehler für "AStruct storage pointer_to_either_a_or_b":
Fehler: Erwarteter Bezeichner, "Storage" erhalten
Gibt es eine Möglichkeit, dies zu umgehen, z. B. den Zeiger an einer anderen Stelle im Code zu platzieren?
Das Entfernen des Schlüsselworts storage at AStruct storage pointer_to_either_a_or_b;
würde den Fehler beheben (da state-Variablen immer storage sind), aber Sie werden nicht in der Lage sein, das zu erreichen, was Sie zu tun versuchen.
Der Grund ist; Da AStruct pointer_to_either_a_or_b;
es sich um eine Speichervariable handelt, wird durch Zuweisen eines Werts eine unabhängige Kopie erstellt, kein Verweis auf variable_a
oder . Es wird hiervariable_b
in den Solidity-Dokumenten erwähnt .
Zuweisungen zwischen Speicher und Speicher und auch zu einer Zustandsvariablen ( auch von anderen Zustandsvariablen ) erzeugen immer eine unabhängige Kopie.
Ich weiß nicht, was Ihre tatsächliche Anforderung ist, aber je nachdem, was Sie hier gepostet haben, werde ich keinen Modifikator (und keine Zeiger) verwenden, sondern so etwas versuchen,
function sample(uint _val) public // val = 100 or 200
{
if (condition_a)
{
variable_a.a_field = _val;
}
else
{
variable_b.a_field = _val;
}
}
Hoffe das hilft!
FYI: Wie ich weiß, sind lokale Variablen, die in Modifikatoren deklariert sind, innerhalb der Funktion nicht zugänglich.
getPointer()
da der zurückgegebene Wert eine Kopie der Variablen ist und nicht auf die Zustandsvariable zeigt und diese ändert
pabloruiz55