最后一个跟案例学习的模块功能,获取投票结果。
获取投票要实现两个功能,即,
1>获取投票最多的索引 ;
2>获取赢得提议的名字。
实际上,这两个功能实现很简单,如第一个获取投票最多的索引,我们可以用一个遍历来完成,寻找符合条件的即可。
for(uint p=0;p <proposals.length;p++ )
{
if(proposals[p].voteCount > winningVoteCount)
{
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
至于另外一个,获取赢得提议的名字,只需要根据先前获取到的结果,直接通过索引获取投票名称。
proposals[winningProposal()].name
期间碰到个问题,提示出错如下,
TypeError: Data location must be "memory" for return parameter in function, but none was given
我仔细看了下,代码跟教程是一致的,不知道为什么实际中会出现这样错误。
于是按照提示给参数string name 上增加 memory修饰,错误提示便消失了。
测试结果如下,
到这里,这篇根据教程案例学习编写投票智能合约就完成了。
完成代码如下,
需要注意的是,教程里用到byte32类型,实际中转为string要做相应的转换,而solidity中byte32转换成string不像其它语言那么方便,而且貌似没有提供现成的函数库,教程中的案例都是根据字符一个个进行转换,非常麻烦。
我在实际的编写中,将byte32更换成了string,所以在后边获取时,不需要再进行转换,直接获得即可。我没有去查先前的版本,猜测可能是后来的版本才支持这样的写法吧。