我试图通过声明一个数组并在for循环中向其推送来返回一个地址列表。然而,Solidity不喜欢我尝试返回动态数组。
function listMyPromises() public returns(uint256[] memory ){ //lists all my past promises
uint256[] memory List;
for(uint i=0; i<table.length; i++){
if(table[i].userAddress==msg.sender){
List.push(uint256(table[i].friendAddress));
}
}
return List;
}
Solidity不允许我返回一个数组,声明
类型错误:数据位置必须是;存储器";或";calldata";用于函数中的return参数,但未给出任何参数。然而,当我在返回参数中添加内存时,我会得到错误:TypeError:成员";"推";在存储之外的uint256[]内存中不可用
我不知道该怎么办。
Solidity不允许调整内存数组的大小(例如,使用.push()
(。
您需要预先计算大小,然后创建一个固定大小的内存阵列。
来源:文档
所以结果可能看起来像这个
function listMyPromises() public returns(uint256[] memory ){ //lists all my past promises
uint256 count = getCount();
uint256[] memory List = new uint256[](count);
uint256 j;
for (uint i = 0; i < table.length; i++) {
if(table[i].userAddress==msg.sender){
List[j] = uint256(table[i].friendAddress);
j++;
}
}
return List;
}
function getCount() internal view returns (uint) {
uint count;
for (uint i = 0; i < table.length; i++) {
if (table[i].userAddress == msg.sender) {
count++;
}
}
return count;
}
根据table[i]
结构中封装的数据类型,您可能还会遇到另一个错误。friendAddress
表明它是address
类型,但不能转换为uint256
。