pragma solidity ^0.4.8;

library Library {
  struct data {
     unit val;
   }
}

-

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id] == address(0) ){ //error occurs!
            clusterContract[id] = list;
            return true;
        }
        return false; 
    }
}

判断语句if(clusterContract[id] == address(0))给出了错误。错误如下所示:

Operator == not compatible with types struct Library.data storage ref and address
E               if(clusterContract[id] == address(0) ){...

【问题】:我该怎么解决这个错误呢?

谢谢你宝贵的时间和帮助。

原文地址

2 人回答 0

2 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-07 16:16:53

你无法直接某个映射中是否存在任意键,因为它们都存在。

mapping(key => value)name;

创建一个命名空间,其中存在所有可能的键,并将值初始化为0 / false。

如果你想要检查是否显式设置了值,而不仅仅是默认值(0),那么你必须编写一段程序。 在某些情况下,value>0 就足够了,但如果0在你的应用程序中有意义,那么另一个结构体成员可以帮助你...bool isValue;,例如:

library Library {
  struct data {
     uint val;
     bool isValue;
   }
}

contract Array{

    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].isValue) throw; // duplicate key
        // insert this 
        return true; 
    }
}

我注意到“addCluster”具有合约工厂(正在进行中)的外观,因此你可能打算跟踪随时会被创建的合约。

我汇总了一些关于在Solidity中组织常见数据模式的不同方法。 看看下面这篇博客可能会有所帮助: Blog: Simple Storage Patterns in Solidity

希望能帮助到你。

||
||

回答发布于 2018-09-07 16:16:53

下面这个解决方案似乎有效,但我对任何建都秉持开放态度。

C中,因为在第一次为id创建映射的调用中不存在clusterContract [id] .flag,所以后面的代码都不起作用。 但在此示例中,clusterContract [id] .flag!= 1在初始步骤中返回了true为了从id中创建映射。 在clusterContract [id] .flagassigned被设置为1后, clusterContract [id] .flag!= 1返回false。

pragma solidity ^0.4.8;

library Library {
  struct data {
     uint val;
     uint8 flag;
   }
}

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].flag != 1 ){ 
            clusterContract[id] = list;
            clusterContract[id].flag = 1;
            return true;
        }
        return false; 
    }
}
||
||

回答发布于 2018-09-07 16:16:53

你无法直接某个映射中是否存在任意键,因为它们都存在。

mapping(key => value)name;

创建一个命名空间,其中存在所有可能的键,并将值初始化为0 / false。

如果你想要检查是否显式设置了值,而不仅仅是默认值(0),那么你必须编写一段程序。 在某些情况下,value>0 就足够了,但如果0在你的应用程序中有意义,那么另一个结构体成员可以帮助你...bool isValue;,例如:

library Library {
  struct data {
     uint val;
     bool isValue;
   }
}

contract Array{

    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].isValue) throw; // duplicate key
        // insert this 
        return true; 
    }
}

我注意到“addCluster”具有合约工厂(正在进行中)的外观,因此你可能打算跟踪随时会被创建的合约。

我汇总了一些关于在Solidity中组织常见数据模式的不同方法。 看看下面这篇博客可能会有所帮助: Blog: Simple Storage Patterns in Solidity

希望能帮助到你。

||
||

回答发布于 2018-09-07 16:16:53

下面这个解决方案似乎有效,但我对任何建都秉持开放态度。

C中,因为在第一次为id创建映射的调用中不存在clusterContract [id] .flag,所以后面的代码都不起作用。 但在此示例中,clusterContract [id] .flag!= 1在初始步骤中返回了true为了从id中创建映射。 在clusterContract [id] .flagassigned被设置为1后, clusterContract [id] .flag!= 1返回false。

pragma solidity ^0.4.8;

library Library {
  struct data {
     uint val;
     uint8 flag;
   }
}

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].flag != 1 ){ 
            clusterContract[id] = list;
            clusterContract[id].flag = 1;
            return true;
        }
        return false; 
    }
}
||
||

回答发布于 2018-09-07 16:16:53

你无法直接某个映射中是否存在任意键,因为它们都存在。

mapping(key => value)name;

创建一个命名空间,其中存在所有可能的键,并将值初始化为0 / false。

如果你想要检查是否显式设置了值,而不仅仅是默认值(0),那么你必须编写一段程序。 在某些情况下,value>0 就足够了,但如果0在你的应用程序中有意义,那么另一个结构体成员可以帮助你...bool isValue;,例如:

library Library {
  struct data {
     uint val;
     bool isValue;
   }
}

contract Array{

    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].isValue) throw; // duplicate key
        // insert this 
        return true; 
    }
}

我注意到“addCluster”具有合约工厂(正在进行中)的外观,因此你可能打算跟踪随时会被创建的合约。

我汇总了一些关于在Solidity中组织常见数据模式的不同方法。 看看下面这篇博客可能会有所帮助: Blog: Simple Storage Patterns in Solidity

希望能帮助到你。

||
||

回答发布于 2018-09-07 16:16:53

下面这个解决方案似乎有效,但我对任何建都秉持开放态度。

C中,因为在第一次为id创建映射的调用中不存在clusterContract [id] .flag,所以后面的代码都不起作用。 但在此示例中,clusterContract [id] .flag!= 1在初始步骤中返回了true为了从id中创建映射。 在clusterContract [id] .flagassigned被设置为1后, clusterContract [id] .flag!= 1返回false。

pragma solidity ^0.4.8;

library Library {
  struct data {
     uint val;
     uint8 flag;
   }
}

contract Array{
    using Library for Library.data;
    mapping(address => Library.data) clusterContract;

    function addCluster(address id) returns(bool){
        if(clusterContract[id].flag != 1 ){ 
            clusterContract[id] = list;
            clusterContract[id].flag = 1;
            return true;
        }
        return false; 
    }
}
||
||