可靠地返回结构数组

Viv*_*mbi 3 ethereum solidity smartcontracts

这是我的合约代码。在这里,我试图存储特定旅行的坐标。同时存储信息合约执行良好。但是当我检索数据时,它应该给出坐标数组。但它抛出一个错误。

原因:'uint256 类型的数据不足'

contract TripHistory {
       struct Trip {
           string lat;
           string lon;
       }
        mapping(string => Trip[]) trips;

        function getTrip(string _trip_id) public view returns (Trip[]) {
            return trips[_trip_id];
        }
        function storeTrip(string _trip_id, string _lat, string _lon) public  {
           trips[_trip_id].push(Trip(_lat, _lon));
        }

}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么。有没有其他方法可以实现我在这里尝试的目标?

PS:我是 Solidity 的新手。

Kha*_*med 6

Solidity 不直接支持第一个返回结构。相反,您需要返回结构中的每个单独元素,如下所示。

Function xyz(uint256 _value) returns(uint256 User.x, uint256 User.y)
public {}
Run Code Online (Sandbox Code Playgroud)

但是有一个实验性功能可以帮助您返回结构。您需要做的就是在第一个 pragma 行之后添加以下内容

pragma experimental ABIEncoderV2;
Run Code Online (Sandbox Code Playgroud)

然后继续你的代码。这应该可以在不更改代码的情况下工作。

可以在此链接中找到 abiencoderv2 返回结构的示例

  • 使用指向 abiencoderv2 参考实现的链接更新了我的答案 (2认同)