Was ist der Null-, Leer- oder Nullwert einer Struktur?

Wenn ich eine Zuordnung von string => benutzerdefinierte Struktur habe, wie überprüfe ich, ob ein Wert in der Zuordnung definiert ist?

Die Dokumente besagen, dass "jeder mögliche Schlüssel existiert und einem Wert zugeordnet ist, dessen Byte-Darstellung alle Nullen sind".

Was ist der Nullwert einer benutzerdefinierten Struktur, so dass man bedingt auf ihre Existenz prüfen kann?

Ja in der Tat. Danke Soll ich das Thema löschen?
Nein, nur themenfremde oder unverständliche Fragen sollten gelöscht werden. Duplikate sind sehr nützlich, da es mehrere Möglichkeiten gibt, eine Frage zu formulieren.

Antworten (4)

Sie überprüfen, ob ein Wert im Mapping definiert ist, indem Sie überprüfen, ob er nicht Null ist.

Wenn ein explizites Setzen von Null für Ihre Anwendung von Bedeutung ist, benötigen Sie Hilfsdaten (oder Strukturen), um nachzuverfolgen, wann ein Wert von Null explizit gesetzt wurde.

Ein leichter Ansatz wäre bool, der Struktur eine Eigenschaft hinzuzufügen (z. B. mit dem Namen initialized) und sie auf festzulegen, truewenn die Null explizit festgelegt wird. Da alle bools standardmäßig falsch (0) sind, können Sie mit dem Wert prüfen true.

Überprüfen Sie alternativ, ob jedes Mitglied der Struktur null ist. Wenn ein Mitglied a ist string, wandeln Sie es um bytesund prüfen Sie dann, ob seine Länge Null ist .

Ein Beispiel finden Sie unter Testen, ob eine Strukturstatusvariable festgelegt ist

Je nach Anwendung kann eine andere Datenstruktur oder Zuordnung erforderlich sein.


Hier ist ein verwandtes Beispiel für die Verwendung eines Paares, um die Bedeutung von Null zu überprüfen :

contract C {
    uint[] counters;
    function getCounter(uint index)
        returns (uint counter, bool error) {
            if (index >= counters.length) return (0, true);
            else return (counters[index], false);
        }
    function checkCounter(uint index) {
        var (counter, error) = getCounter(index);
        if (error) { ... }
        else { ... }
    }
}
Zur Verdeutlichung (da sich dies von den anderen Sprachen unterscheidet, in denen ich arbeite), kann ich nach structMapping[key].initalized == false suchen, auch wenn dieser Schlüssel nicht in der Zuordnung definiert wurde?
Ja, der Standardwert für alles in der Ethereum Virtual Machine (auf der Solidity basiert) ist Null. (Alles, was nicht initialisiert ist, ist Null, im Gegensatz zu anderen Sprachen, in denen Werte "Müll" sein können.)
Wäre es möglich, einen String anstelle eines bool zu verwenden? (Sprichwort: Ich habe eine Aufzählung, für die ich nur String-Eigenschaften habe) Dann: Womit sollten Sie die String-Struktur vergleichen? (mit anderen Worten: Was ist der Standardwert für eine Zeichenfolge)
@lajarre Gut, dass du gefragt hast ethereum.stackexchange.com/questions/5683/…
In der Lage zu sein, den Wert beliebiger Mitglieder zu testen, bevor Sie wissen, ob die Struktur initialisiert ist, bedeutet auch, dass Sie die Antwort auf diese Frage möglicherweise gar nicht erst wissen müssen – Sie können einfach sofort Mitglieder zuweisen. Ich weiß, ich spüre auch schon den Schlag des Segfaults in meinem Gesicht, aber Solidity ist sein eigenes Biest.

„Leer“ gibt es eigentlich nicht. Ein nicht initialisierter Index der Zuordnung ist einfach gleich dem "Null"-Wert des richtigen Typs.

Um zu prüfen, ob ein Wert zugewiesen wurde, prüfen Sie einfach, ob balances[msg.sender]== 0. Wenn ein Benutzer auf den Vertrag zugreift, der Saldo jedoch 0 sein sollte, können Sie eine Adresse => int256-Zuordnung verwenden und -1 für Salden von 0 verwenden

function checkArray(bytes a) returns (bool){
    if ((a) && (a.length > 0))
        return true;
    return false;
}
Gib mir einen Fehler: Operator && not compatible with types bytes memory and boolsolidity 0.4.7

Für einen vorzeichenlosen Indexwert eines Arrays von Strukturen (z. B. Kunde) können Sie Folgendes tun, um zu überprüfen, ob der Eintrag in einem bestimmten Array von Strukturen vorhanden ist:

 struct Customer {
    string userName;
    string dataHash;
    address bank;
    int256 upVotes;
}

Customer[] public customers; 

...
//assuming we have some customers added (customers.length>0)
...

function getCustomerIndex(string memory userName) internal view returns(bool, uint256) {
    for(uint i=0; i<customers.length; i++) {
        if (stringEquals(customers[i].userName, userName)){
            return (true, i);
        }
    }
    return (false, 0);
}

Das explizite (false, 0) deutet darauf hin, dass der Kunde mit dem angegebenen Benutzernamen nicht im Strukturarray des Kunden gefunden wird.

Jetzt kann ich in meinem anderen Code die obige Funktion wie folgt verwenden:

// return 1 implies customer found and removed from struct Customer array
// return 0 implies no customer found in the struct Customer array
function removeCustomer(string calldata userName) external returns (uint8) {
        (bool result, uint256 index) = getCustomerIndex(userName);
        if (result){
            for (uint i=index+1; i<customers.length-1; i++){
                customers[i-1] = customers[i];
            }
            customers.length--;
            return 1;
        }
        return 0;
    }