我已经初始化了一个投票数组和两个函数,将我们数组中的投票存储为:
uint[2] votes = [0,0];
function vote_a() public{
votes[0] += 1;
}
function vote_b() public{
votes[1] += 1;
}
现在,我创建了一个";结果";应该返回字符串"的函数;"领带"a获胜;或";b获胜";基于票数,同时将票数重新分配为0
function results() public returns(string memory){
uint a = votes[0];
uint b = votes[1];
votes[0]=0;
votes[1]=0;
if (a==b)
return "tie";
else if (a>b)
return "a wins";
else
return "b wins";
}
但它不像视图函数那样在remix-ide中显示返回的结果。我不能修改函数的状态以查看,因为它会在更改投票数组元素的值时抛出错误。有没有办法同时达到这两个条件。
当您更改视图函数中定义的状态变量时,会发生这种情况。因此,view
函数只能从智能合约中读取数据。
为了解决您的问题,我尝试将关于results()
函数的内容拆分为两个函数。我称之为setResults()
的第一个函数类似于setter函数(在其他编程语言中(,因此只允许合同所有者处理数组值。第二个函数,允许您查看a
和b
元素之间的比较结果。
在以下几行中,我将您的智能合约调整到我插入一些注释的位置:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test {
uint[2] votes = [0,0];
address owner;
// NOTE: I set a 'owner' variable with the address value who have deployed for the first time the smart contract
constructor() {
owner = msg.sender;
}
// NOTE: Modifier that allow only for smart contract owner the access to specific function
modifier onlyOwner() {
require(msg.sender == owner, "You're not the owner!");
_;
}
function vote_a() public{
votes[0] += 1;
}
function vote_b() public{
votes[1] += 1;
}
function results() public view returns(string memory){
uint a = votes[0];
uint b = votes[1];
if (a==b)
return "tie";
else if (a>b)
return "a wins";
else
return "b wins";
}
// NOTE: I created a new function that allows you to handle the data inside array
function setResults() public onlyOwner {
votes[0] = 0;
votes[1] = 0;
}
}
重要信息:在调用results()
函数之前,请记住要调用setResults()
来更改数组值。