31
    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);

 }

バイヤーがバイヤー マッピングに記録されていない場合は、buyerNum++; しかし、バイヤーがマッピングに含まれているかどうかを確認する方法がわかりません

4

5 に答える 5

14

solidity では、すべての変数が0デフォルトで に設定されています。

mappings 可能なすべての組み合わせがデフォルトで設定されていると考える必要があり0ます。

あなたの特定のケースでは、私は以下を使用します:

if (buyers[msg.sender].amount == 0)
于 2017-11-19T02:34:48.163 に答える
10

整数の場合:

none変数を作成して、次のように使用できますNULL

uint256 constant NULL = 0;

チェックのコード例:

function isNULL(uint256 variable) internal returns (bool) {
    return variable == NULL;
}

の場合bytes32:

次の場合は、別のアプローチに従うことができますbytes

bytes32 constant NULL = "";

コード片の例:

pragma solidity ^0.6.0;

mapping(address => bytes32) public Countries;   

function isCountriesInitialized(address _user) external view returns (bool) 
{
    if (Countries[_user] == NULL) // Returns true if `Countries[_user]` is not initialized
        return false;

    return true;
}

solidity >=v0.6.0では、マップされていなくても長さとして 32 が返されることがあります。

戻り値の例:

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

于 2016-10-21T12:56:12.840 に答える
2

値の 1 つを使用したり、追加の を作成したりする代わりに、 のサイズをboolean確認できます。bytestructure

if (bytes(buyers[msg.sender]).length > 0) {
    // buyer exists.
}
于 2019-03-04T21:06:05.127 に答える