2017-06-14 33 views
0

我想从一个函数返回多个数组。 我的代码看起来是这样的:返回多个数组稳定性

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); 
} 

但我不能从上面的函数获取任何数据。我在做错了什么?有没有其他的方法可以从一个函数返回多个数组?

回答

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); 
} 
+0

感谢@Abhishek!它的工作。 – santosh

0

由于以太坊虚拟机的限制,您目前只能返回一个固定大小的阵列。请使用官方实力faq的代码示例查看答案。