Solidity:在映射中检索结构数组的值
Solidity: Retrieving values of Array of Structs in Mapping
我有一些 solidity 代码,我试图在其中收集 id,这些 id 是存储在 Struct 上的值。我有一个映射,其中键是一个地址,值是一个结构数组。每当我执行 getMediaByAddress
函数时,我都会得到一个 invalid OpCode error
。任何帮助将不胜感激。
pragma solidity ^0.4.24;
contract MediaGallery {
address owner;
uint counter;
struct MediaAsset {
uint id;
string name;
address author;
uint createDate;
string[] tags;
string mediaHash;
}
mapping(address => MediaAsset[]) public mediaDatabase;
constructor () {
owner = msg.sender;
}
function addMedia(string _name, string _mediaHash) public returns (bool success) {
MediaAsset memory currentMedia;
currentMedia.id = counter;
currentMedia.name = _name;
currentMedia.author = msg.sender;
currentMedia.createDate = now;
currentMedia.mediaHash = _mediaHash;
mediaDatabase[msg.sender].push(currentMedia);
return true;
}
function addTag(uint _id, string _tag) public returns (bool success) {
mediaDatabase[msg.sender][_id].tags.push(_tag);
return true;
}
function getMediaByAddress(address _user) public view returns (uint[]) {
uint[] memory mediaAssetIds = new uint[](mediaDatabase[_user].length);
uint numberOfMediaAssets = 0;
for(uint i = 1; i <= mediaDatabase[_user].length; i++) {
mediaAssetIds[numberOfMediaAssets] = mediaDatabase[_user][i].id;
numberOfMediaAssets++;
}
return mediaAssetIds;
}
}
您正在尝试读取数组末尾的内容。您的循环变量 i
有一个差一错误。它的最大值是 mediaDatabase[_user].length
,即数组末尾后 1。试试这个:
for (uint i = 0; i < mediaDatabase[_user].length; i++) {
我有一些 solidity 代码,我试图在其中收集 id,这些 id 是存储在 Struct 上的值。我有一个映射,其中键是一个地址,值是一个结构数组。每当我执行 getMediaByAddress
函数时,我都会得到一个 invalid OpCode error
。任何帮助将不胜感激。
pragma solidity ^0.4.24;
contract MediaGallery {
address owner;
uint counter;
struct MediaAsset {
uint id;
string name;
address author;
uint createDate;
string[] tags;
string mediaHash;
}
mapping(address => MediaAsset[]) public mediaDatabase;
constructor () {
owner = msg.sender;
}
function addMedia(string _name, string _mediaHash) public returns (bool success) {
MediaAsset memory currentMedia;
currentMedia.id = counter;
currentMedia.name = _name;
currentMedia.author = msg.sender;
currentMedia.createDate = now;
currentMedia.mediaHash = _mediaHash;
mediaDatabase[msg.sender].push(currentMedia);
return true;
}
function addTag(uint _id, string _tag) public returns (bool success) {
mediaDatabase[msg.sender][_id].tags.push(_tag);
return true;
}
function getMediaByAddress(address _user) public view returns (uint[]) {
uint[] memory mediaAssetIds = new uint[](mediaDatabase[_user].length);
uint numberOfMediaAssets = 0;
for(uint i = 1; i <= mediaDatabase[_user].length; i++) {
mediaAssetIds[numberOfMediaAssets] = mediaDatabase[_user][i].id;
numberOfMediaAssets++;
}
return mediaAssetIds;
}
}
您正在尝试读取数组末尾的内容。您的循环变量 i
有一个差一错误。它的最大值是 mediaDatabase[_user].length
,即数组末尾后 1。试试这个:
for (uint i = 0; i < mediaDatabase[_user].length; i++) {