首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于外部函数中的参数,数据位置必须是“calldata”,但没有给出任何参数。

对于外部函数中的参数,数据位置必须是“calldata”,但没有给出任何参数。
EN

Ethereum用户
提问于 2019-11-05 05:58:23
回答 1查看 5.5K关注 0票数 2

我试图用Remix编译我的代码,并试图修复它,但我仍然得到相同的错误:

对于外部函数中的参数,数据位置必须是“calldata”,但没有给出任何参数“。

问题在function createNewUser() external

代码语言:javascript
复制
event startMessage(string message);

function createNewUser (string _name, string _email, uint _aadhaar, string _sign) external {
  if((checkUser[msg.sender] == true)||(checkAadhaar[_aadhaar] == true))
  {
    startMessage('Failed !! User already Registered..');
  }
  else if((checkUser[msg.sender] != true)&&(checkAadhaar[_aadhaar] != true))
  {
    var newUser = Person(msg.sender, _name, _email, _aadhaar, _sign, new uint[](0), new uint[](0));
    addressToPerson[msg.sender] = newUser;

    checkUser[msg.sender] = true;
    checkAadhaar[_aadhaar] = true;

    startMessage('Welcome !! Successful Registration on Charter');
  }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-11-05 06:18:46

任一

代码语言:javascript
复制
function createNewUser (string memory _name, string memory _email, uint _aadhaar, string memory _sign) public

代码语言:javascript
复制
function createNewUser (string calldata _name, string calldata _email, uint _aadhaar, string calldata _sign) external

解释:

与传统计算机不同,EVM有许多不同的“内存”,每个内存都有自己的指令集。因此,一个人不能有“通用”内存指针,而是必须使用不同的指针类型,为不同的“记忆”。

在稳健性中,所有引用类型(如stringbytesstruct )都应该伴随显式说明符,告知编译器引用实际引用的“内存”。有关详细信息,请参阅文档中的参考类型部分。

基本上,“外部”只是“public”的语法糖,但出于某种原因,稳健编译器不允许“外部”函数参数中的“内存”引用。文档刚刚说:

注意,外部函数需要具有回调数据数据位置的参数。

没有任何进一步的解释。编译器也不允许在非“外部”函数的参数中引用“calldata”,这是有充分理由的,因为非“外部”函数可以在内部调用,因此根本不可能有调用数据。

票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/77211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档