it-swarm.com.de

Gibt es null wie etwas in Solidität

    struct buyer{
       uint amount;
       Status status;
    }

    mapping(address=>buyer) public buyers;
    mapping(uint=>address) buyerIndex;
    uint public buyerNum;
    //Order a product.
    function(){
      uint doubleValue=value*2;
      uint amount=msg.value/doubleValue; 
      if(buyers[msg.sender]==null){ //Error in this line
      buyer abuyer=buyer({amount:amount,status:Status.Created}); //Error in this line
      buyerNum++;
      buyerIndex[buyerNum]=msg.sender;
      buyers[msg.sender]=abuyer;
    }else{
      buyers[msg.sender].amount+=amount;
    }
      Order(msg.sender,amount*doubleValue,amount);

 }

Wenn ein Käufer nicht in der Käuferzuordnung erfasst wird, wird der KäuferNum ++; aber ich weiß nicht, wie ich feststellen kann, ob sich ein Käufer im Mapping befindet

15
Hao WU

Sie können die Variable none erstellen, um sie als NULL zu verwenden:

uint80 constant None = uint80(0); 
6
alper

Grundsätzlich ist jede Variable standardmäßig auf 0 gesetzt.

Sie sollten an mappingsdenken, da alle möglichen - Kombinationen standardmäßig auf 0 gesetzt sind.

In Ihrem speziellen Fall würde ich Folgendes verwenden:

if (buyers[msg.sender].amount == 0)
6
Viktor Camp

Nichts ist null in der Solidität.

Überprüfen Sie einfach die Länge der Adresse:

if(buyers[msg.sender].length == 0){
    // do your thing
}

Siehe auch diese Antwort zum Ethereum-Stack-Austausch .

2
Afri

Wie Viktor sagte, ist der Standardwert für alle möglichen Werte im Mapping null. Wenn also buyer noch nicht in das Mapping eingefügt wurde, ist der amount-Wert für diesen address Null. Dieser Ansatz hat jedoch einen Fehler. Wenn ein buyer existiert, aber nach einigen Operationen sein Kontostand zu Null wurde, werden Sie ihn so behandeln, als wäre er nicht vorhanden. 

Ich denke, der beste Ansatz ist, ein exists-Mitglied zur buyer-Struktur mit dem bool-Typ hinzuzufügen. Der Standardwert für dieses Mitglied ist false. Wenn der Käufer erstellt wird, initialisieren Sie ihn mit dem Wert true. So können Sie über dieses Mitglied genau prüfen, ob ein Käufer existiert oder nicht. 

Käufer Struktur: 

struct buyer{
   uint amount;
   Status status;
   bool exists;
}

Käufer initialisieren:

buyer memory b = buyer(0, status, true);

Prüfen Sie, ob ein Käufer existiert:

if(buyers[msg.sender].exists) {
  //so can buy
}
1

Anstatt einen der Werte zu verwenden oder einen zusätzlichen Booleschen Wert zu erstellen, können Sie die Bytegröße der Struktur überprüfen.

if( bytes( buyers[msg.sender] ).length > 0 ) {
    // buyer exists
}
1
einaralex