我试图用Remix编译我的代码,并试图修复它,但我仍然得到相同的错误:
对于外部函数中的参数,数据位置必须是“calldata”,但没有给出任何参数“。
问题在function createNewUser() external中
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');
}
}发布于 2019-11-05 06:18:46
任一
function createNewUser (string memory _name, string memory _email, uint _aadhaar, string memory _sign) public或
function createNewUser (string calldata _name, string calldata _email, uint _aadhaar, string calldata _sign) external与传统计算机不同,EVM有许多不同的“内存”,每个内存都有自己的指令集。因此,一个人不能有“通用”内存指针,而是必须使用不同的指针类型,为不同的“记忆”。
在稳健性中,所有引用类型(如string、bytes或struct )都应该伴随显式说明符,告知编译器引用实际引用的“内存”。有关详细信息,请参阅文档中的参考类型部分。
基本上,“外部”只是“public”的语法糖,但出于某种原因,稳健编译器不允许“外部”函数参数中的“内存”引用。文档刚刚说:
注意,外部函数需要具有回调数据数据位置的参数。
没有任何进一步的解释。编译器也不允许在非“外部”函数的参数中引用“calldata”,这是有充分理由的,因为非“外部”函数可以在内部调用,因此根本不可能有调用数据。
https://ethereum.stackexchange.com/questions/77211
复制相似问题