返回多个数组的实体

时间:2017-06-14 11:23:36

标签: solidity

我正在尝试从函数返回多个数组。 我的代码看起来像这样:

struct Document{
    bytes32 _documentNumber;
    bytes32 _documentStatus;
    uint _documentScore;
}
mapping(bytes32=>Document) public mapDocuments; // Holds Docno as key 
mapping(address=>bytes32[]) public mapUserDocNos; // Holds User address as key with valuehaving  array of all document nos
mapping(bytes32=>DocumentDetails) public mapDocumentDetails; // Holds Docno as key

//我将数据存储在地图中,如下所示:

    function addDocument(address _user, bytes32 _docNo, 
    bytes32 _documentStatus,uint _documentScore,
    uint _createdDateStr) returns (bool status){

    DocumentDebuggingLog(block.timestamp, "Step 1",_user);

    Document memory document;
    DocumentDebuggingLog(block.timestamp, "Step 2",_user);
    document._customerAccountAddress= _user;
    document._documentNumber= _docNo;
    document._documentScore=_documentScore;
    document._documentStatus=_documentStatus;
    mapDocuments[_docNo]=document;
    mapUserDocNos[_user].push(_docNo);
    return true;
}

//尝试检索:

function getDocumentListByUser(address _user) returns (bytes32[] _docNumber,
    bytes32[] _docStatus,uint[] _docScore){
    bytes32[] _documentNumber;
    bytes32[] _documentStatus;
    uint[] _documentScore;
    DocumentDebuggingLog(block.timestamp, "step 1 in getDocumentListByUser",_user);
    for(uint i=0;i<mapUserDocNos[_user].length;i++){
    //bytes32 dockey=  mapUserDocNos[_user][i];
    //DocumentDebuggingLog(block.timestamp, dockey,_user);  
    _documentNumber.push( mapDocuments[mapUserDocNos[_user][i]]._documentNumber);
    _documentStatus.push( mapDocuments[mapUserDocNos[_user][i]]._documentStatus);
    _documentScore.push( mapDocuments[mapUserDocNos[_user][i]]._documentScore);
    }

    return (_documentNumber,_documentStatus,_documentScore);
}

但是我无法从上面的函数中获取任何数据。我做错了什么?还有其他方法可以从函数中返回多个数组吗?

2 个答案:

答案 0 :(得分:0)

由于以太坊虚拟机的限制,您目前只能返回固定大小的数组。请使用官方可靠性faq中的代码示例查看答案。

答案 1 :(得分:0)

尝试在函数getDocumentListByUser

中更改以下内容
FROM:
bytes32[] _documentNumber;
bytes32[] _documentStatus;
uint[] _documentScore;
TO:
uint256 arrLength = mapUserDocNos[_user].length
bytes32[] memory _documentNumber = new bytes32[](arrLength);
bytes32[] memory _documentStatus = new bytes32[](arrLength);
uint[] memory _documentScore = new uint[](arrLength);


Try below:
function getDocumentListByUser(address _user) returns (bytes32[] _docNumber, bytes32[] _docStatus,uint[] _docScore) {
    uint256 arrLength = mapUserDocNos[_user].length
    bytes32[] memory _documentNumber = new bytes32[](arrLength);
    bytes32[] memory _documentStatus = new bytes32[](arrLength);
    uint[] memory _documentScore = new uint[](arrLength);
    DocumentDebuggingLog(block.timestamp, "step 1 in getDocumentListByUser",_user);
    for(uint i=0;i<mapUserDocNos[_user].length;i++){
    //bytes32 dockey=  mapUserDocNos[_user][i];
    //DocumentDebuggingLog(block.timestamp, dockey,_user);  
    _documentNumber.push( mapDocuments[mapUserDocNos[_user][i]]._documentNumber);
    _documentStatus.push( mapDocuments[mapUserDocNos[_user][i]]._documentStatus);
    _documentScore.push( mapDocuments[mapUserDocNos[_user][i]]._documentScore);
    }

    return (_documentNumber,_documentStatus,_documentScore);
}