Ethereum Solidity:在映射中检索结构数组的值

Ethereum Solidity:在映射中检索结构数组的值,ethereum,solidity,truffle,Ethereum,Solidity,Truffle,我有一些坚固的代码,我试图收集ID,它是存储在结构上的一个值。我有一个映射,其中键是一个地址,值是一个结构数组。每当我执行getMediaByAddress函数时,就会出现无效操作码错误。任何帮助都将不胜感激 pragma solidity ^0.4.24; contract MediaGallery { address owner; uint counter; struct MediaAsset { uint id; string name; address aut

我有一些坚固的代码,我试图收集ID,它是存储在结构上的一个值。我有一个映射,其中键是一个地址,值是一个结构数组。每当我执行
getMediaByAddress
函数时,就会出现
无效操作码错误
。任何帮助都将不胜感激

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;
}
pragma-solidity^0.4.24;
合同媒体画廊{
地址所有者;
单位计数器;
结构媒体资产{
单元id;
字符串名;
地址作者;
uint创建日期;
字符串[]标记;
字符串媒体哈希;
}
映射(地址=>MediaAsset[])公共媒体数据库;
构造函数(){
所有者=msg.sender;
}
函数addMedia(string _name,string _mediaHash)公共返回(bool success){
媒体资产内存当前媒体;
currentMedia.id=计数器;
currentMedia.name=\u name;
currentMedia.author=msg.sender;
currentMedia.createDate=现在;
currentMedia.mediaHash=\u mediaHash;
mediaDatabase[msg.sender].push(当前媒体);
返回true;
}
函数addTag(uint\u id,string\u tag)公共返回(bool success){
mediaDatabase[msg.sender][\u id].tags.push(\u tag);
返回true;
}
函数getMediaByAddress(地址_用户)公共视图返回(uint[]){
uint[]内存MediaAssetId=new uint[](mediaDatabase[\u user].length);
uint numberOfMediaAssets=0;

对于(uint i=1;i您正在尝试读取超过数组末尾的数据。您的循环变量
i
有一个off by one错误。它的最大值是
mediaDatabase[\u user]。长度
,即超过数组末尾的1。请尝试以下操作:

for (uint i = 0; i < mediaDatabase[_user].length; i++) {
for(uint i=0;i
感谢您捕捉到这一点。尽管我尝试了调整,但我仍然收到,
错误:处理事务时VM异常:无效操作码
您的合同在混音中似乎对我很好。我部署,调用了
addMedia
两次,然后调用了
getMediaByAddress
,传递了我过去调用
add>的地址媒体
。我得到了
0,0
计数器
从不递增,因此所有
MediaAsset
都有
id
0
)如果您仍然有问题,请提供完整的重新编译步骤。我应该说,在修复
for
循环后,它工作正常。是的。我未能重新编译。:-)