我对编程很陌生,我试图访问位于另一个智能契约中的结构,但我收到了以下错误。
"TypeError:成员“地址”在元组(地址、int16、int8、uint256、bool、int256、address)中找不到或看不见。-> Auction.sol:45:23:
是否可以访问不同契约映射中的结构?
我的代码如下:
pragma solidity ^0.8.3;
contract Registry {
mapping(int => User) public users;
int8 public userCount = 0;
struct User {
address Address;
int16 Longitude;
int8 Latitude;
uint Transformer_ID;
bool Is_Prosumer;
int Peak_Power;
address Smart_Meter;
}
function addUser(int16 _longitude, int8 _latitude, uint _transformerID, bool _isProsumer, int _peakPower, address _smartMeter) public {
users[userCount] = User(msg.sender, _longitude, _latitude, _transformerID, _isProsumer, _peakPower, _smartMeter);
userCount ++;
}
}
contract Auction {
Registry r;
address registryAddr;
function RegistryRead(address addr) public {
registryAddr = addr;
r = Registry(r);
}
function verify(address addr, address bid) public returns (bool) {
int i; bool x = false;
int8 max = r.userCount();
for(i = 0; i == max; i ++)
if(bid == r.users(i).Address) x = true;
return x;
}
}发布于 2021-05-13 15:01:36
这是因为当拍卖契约读取users时,它只获取数组的数据类型,而不是您在Resigtry契约中使用的名称。像这样理解它;
uint => (address, int16, int8, uint, bool, int, address)因此拍卖合同不能查找地址。
解决方案:您可以使用
(address userAddress,,,,,,) = r.users(i);
if(bid ==userAddress) {
x = true;
}或者,添加一个getUser函数,说明returs用户键入:
contract Registry {
mapping(int => User) public users;
int8 public userCount = 0;
struct User {
address Address;
int16 Longitude;
int8 Latitude;
uint Transformer_ID;
bool Is_Prosumer;
int Peak_Power;
address Smart_Meter;
}
function addUser(int16 _longitude, int8 _latitude, uint _transformerID, bool _isProsumer, int _peakPower, address _smartMeter) public {
users[userCount] = User(msg.sender, _longitude, _latitude, _transformerID, _isProsumer, _peakPower, _smartMeter);
userCount ++;
}
function getUser(int _id) public view returns(User memory) {
return users[_id];
}
}
contract Auction {
Registry r;
address registryAddr;
function RegistryRead(address addr) public {
registryAddr = addr;
r = Registry(r);
}
function verify(address bid) public view returns (bool) {
int i; bool x = false;
int8 max = r.userCount();
for(i = 0; i <= max; i ++) {
if(bid == r.getUser(i).Address) {
x = true;
}
}
return x;
}
}https://ethereum.stackexchange.com/questions/98866
复制相似问题