当前位置: 首页 > 知识库问答 >
问题:

返回实体中的结构数组

胥玮
2023-03-14

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

原因:'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));
        }

}

我在这里错过了什么。有没有其他方法来实现我在这里尝试的?

附言:我是固体新手。

共有3个答案

薛泰
2023-03-14

就像jlo在这个链接里说的,0.8.0版本以后,可以返回一个struct。jlo描述了如何设置和返回struct数组的元素。这里我描述了如何设置、重置和返回一个struct类型变量。

我测试了它,我的测试环境是:

    < li >专用以太网 < li>Geth版本1 . 10 . 9-稳定(用于专用网络) < li>Slocjs编译器版本0.8.7 < li>web3js版本1.5.1

请注意,您必须首先在协定内的任何函数外部定义结构类型。

超级直观的示例代码如下:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
    
contract testContract {


    struct funcResultType {
        uint[] var1;
        string[] var2;
        string message;
    }

    funcResultType private funcResult;


    function testSetFunc(string memory inputVar) public payable {
        funcResult.var1.push(123);
        funcResult.var2.push(inputVar);
        funcResult.message = "Done!";
    }

    function testResetFunc() public payable {
        delete funcResult; // reset variales
    }

    function testGetFunc() public view returns (funcResultType memory){
        return funcResult;
    }
}

在控制台中使用Web3js进行测试的结果如下:

如您所见,整个变量都是可访问的。我在此链接中将其web3js代码上传到Github中。

锺离霖
2023-03-14

在solidity中不可能返回结构数组。

宋瀚海
2023-03-14

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

Function xyz(uint256 _value) returns(uint256 User.x, uint256 User.y)
public {}

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

pragma experimental ABIEncoderV2;

然后继续您的代码。这应该不会对代码进行任何更改。

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

 类似资料:
  • 问题内容: 以下是gcc 4.4.4下的简单代码段错误 将最后一行更改为 工作良好。使用编译时,这两个版本均可使用。我是在简单地调用未定义的行为,还是在标准中进行了某些更改,从而使代码可以在C99下工作?为什么在C89下崩溃? 问题答案: 我相信C89 / C90和C99中的行为均未定义。 是数组类型的表达式,特别是。 C99 6.3.2.1p3说: 除非它是 sizeof 运算符或一元 & 运算

  • 我开始在JPA2.1中使用新的实体图特性来指定必须加载的惰性集合。考虑以下课程: 当我执行命名查询以获得实体图提示下的实体列表时,我会得到一个包含重复实体的集合。如何仅加载一次A实体。 我正在使用: 冬眠4.3.5

  • 问题内容: 对于以下C代码: 对于Win32,我得到以下反汇编: 对于Linux32: 我试图了解呼叫后呼叫者的行为方式的差异。为什么Linux32中的调用程序会执行这些额外的操作? 我假设两个目标都将遵循cdecl调用约定。cdecl不会为返回结构的函数定义调用约定吗? 编辑: 我添加了被调用者的实现。可以肯定的是,您可以看到Linux32被调用方会弹出其参数,而Win32被调用方不会: Win

  • 我正在读clean architecture的书,我想把它应用到我写的一些软件中。在该软件中,和等实体扮演着非常重要的角色。出于这个原因,为了避免重复,跨代码共享这些实体是有意义的,但这也违反了清洁体系结构的规则。 在这种情况下,什么是正确的决定?我应该在中添加一个“shared/entities”文件夹吗? 我正在做的项目主要是在flutter编程,如果这对答案很重要的话。

  • 问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要

  • jna 中 structure 结构体怎么读取, 在回调函数中 我收到对方返回一个 pointer 是海康的sdk NET_DVR_SetDVRMessageCallBack_v50 的回调函数 有个 pAlarmInfo:Pointer 类型, 想接收为 NET_DVR_ACS_ALARM_INFO 类型, 要怎么做 我试过这样读取, 但没有讲到到