Solidity函数返回参数数量不匹配报错求助
问题解决
首先,你遇到的编译错误根源很明确:
你的函数_createPsoukrace的returns声明只定义了2个返回值类型:(string memory, uint),但return语句里却返回了11个值,数量完全不匹配,这就是编译器报错的直接原因——返回值数量只看returns声明和return语句的个数是否一致,和结构体、函数参数的变量数量无关。
另外还有两个必须修正的隐藏问题:
- 函数加了
view修饰符,但你在函数里执行了psoukraces.push()修改链上状态变量的操作,view函数不允许修改状态,必须去掉这个修饰符。 - 结构体里的
strenghth拼写错误,少了一个t,应该改成strength,否则结构体初始化时会和参数里的strength不匹配。
如果你的需求是创建Psoukrace实例并返回它,修正后的代码可以这样写:
pragma solidity ^0.8.0; contract PsoukraceFactory { struct Psoukrace { string name; string title; uint level; uint HP; uint defence; uint dodge; uint luck; uint intelligence; uint strength; // 修正拼写错误 uint attack; uint speed; } Psoukrace [] public psoukraces; // 去掉view修饰符,修改returns为返回结构体类型 function _createPsoukrace( string memory name, string memory title, uint level, uint HP, uint defence, uint dodge, uint luck, uint intelligence, uint strength, uint attack, uint speed) public returns (Psoukrace memory) { Psoukrace memory newPsoukrace = Psoukrace(name, title, level, HP, defence, dodge, luck, intelligence, strength, attack, speed); psoukraces.push(newPsoukrace); return newPsoukrace; // 返回刚创建的结构体实例 } }
如果你的需求是返回那11个固定测试值,就要把returns声明改成对应11个值的类型:returns(string memory, string memory, uint, uint, uint, uint, uint, uint, uint, uint, uint),这样return语句的数量就和声明匹配了,但通常返回结构体的写法更清晰易读。
内容的提问来源于stack exchange,提问作者Joe Beginnz
相关产品推荐
相关产品推荐

