Solidity合约中getPurchaseOrderForVendor函数返回结构体数组编译报错求助
解决Solidity返回结构体数组的编译错误
我来帮你搞定这个编译问题!你遇到的错误核心是返回类型的声明不符合Solidity的语法要求,哪怕启用了ABIEncoderV2也得严格遵循规则。
错误原因拆解
你写的函数返回语句是:
function getPurchaseOrderForVendor(string vendorNameInput) constant returns (struct[])
这里的struct[]是无效写法——编译器根本不知道你指的是哪个结构体,必须明确写出你定义的结构体具体名称,也就是PurchaseOrderStruct[]。
修复后的完整代码示例
结合你的合约片段,修正后的代码应该是这样的:
pragma solidity ^0.4.21; pragma experimental ABIEncoderV2; contract InvoiceSettlement { struct PurchaseOrderStruct { uint8 requisitionNumber; uint8 poNumber; string vendorName; // 建议添加这个字段,否则没法根据输入筛选订单 } PurchaseOrderStruct[10] public PurchaseOrderStructArray; // 修正后的函数 function getPurchaseOrderForVendor(string vendorNameInput) public constant returns (PurchaseOrderStruct[]) { // 初始化动态内存数组存储结果 PurchaseOrderStruct[] memory result = new PurchaseOrderStruct[](0); // 遍历数组筛选对应供应商的订单 for(uint i = 0; i < PurchaseOrderStructArray.length; i++){ if(keccak256(abi.encodePacked(PurchaseOrderStructArray[i].vendorName)) == keccak256(abi.encodePacked(vendorNameInput))){ // 因为0.4.x版本memory数组不能直接push,这里需要先扩容再赋值 PurchaseOrderStruct[] memory temp = new PurchaseOrderStruct[](result.length + 1); for(uint j = 0; j < result.length; j++){ temp[j] = result[j]; } temp[result.length] = PurchaseOrderStructArray[i]; result = temp; } } return result; } }
额外提醒
- 我给
PurchaseOrderStruct加了vendorName字段,不然你没法根据输入的vendorNameInput筛选订单,这是实际逻辑里必须的前提。 - Solidity 0.4.x版本的动态
memory数组不支持直接push,所以我用了临时数组扩容的方式来添加元素,如果你用更高版本(比如0.5+)可以直接用push简化逻辑。 - 字符串比较不能直接用
==,所以这里用了keccak256哈希对比的方式,这是Solidity里字符串相等判断的标准写法。
内容的提问来源于stack exchange,提问作者Vpn_Kp
相关产品推荐
相关产品推荐

