吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1137|回复: 2
收起左侧

[已解决] 【以太坊入门】写一个简单的投票程序有一个不知道怎么解决的warning

 关闭 [复制链接]
thepoy 发表于 2020-7-11 11:11
本帖最后由 thepoy 于 2020-7-12 09:34 编辑

代码如下:

pragma solidity >=0.4.21;

contract Voting {
    struct voter {
        address voterAddress;
        uint tokenNum; 
        uint[] tokensVoteForCandidates; 
    }
    uint public totalTokens;  
    uint public tokenBalance;
    uint public tokenPrice;  
    bytes32[] public candidateList;
    mapping(bytes32=>uint) public votesReceived;
    mapping(address=>voter) public voterInfo;

    constructor(uint totalSupply, uint price, bytes32[] memory candidateNames) public {
        totalTokens = totalSupply;
        tokenBalance = totalSupply;
        tokenPrice = price;
        candidateList = candidateNames;
    }

    function voteForCandidate(bytes32 candidate, uint voteTokens) public {
        uint index = indexOfCandidate(candidate);
        require(index!=uint(-1));
        if(voterInfo[msg.sender].tokensVoteForCandidates.length==0){
            for (uint i = 0; i < candidateList.length; i++){
                voterInfo[msg.sender].tokensVoteForCandidates.push(0);
            }
        }
        uint availableTokens = voterInfo[msg.sender].tokenNum - totalUsedTokens(voterInfo[msg.sender].tokensVoteForCandidates);
        require(availableTokens>=voteTokens);
        votesReceived[candidate] += voteTokens;
        voterInfo[msg.sender].tokensVoteForCandidates[index] += voteTokens;
    }
    function indexOfCandidate(bytes32 candidate) public view returns(uint){
        for (uint i = 0; i < candidateList.length; i++){  // warning在这里:i++无法达到
            if(candidate==candidateList[i]){
                return i;
         }
         return uint(-1);
        }
    }
}

写的时候就有注意到这个warning,但想到warning嘛,又不是error,就没管它,没想到部署合约后无法正常动行,经排查就是这个warning的原因。
在用indexOfCandidate查找指定candidate时,candidateList里只有一个元素,但constructor初始化时,给candidateList赋值的是有3个元素的bytes32[],但在indexOfCandidate里的candidateList却只有第一个元素,所以无法取到其他元素,所以导致整个程序运行错误。
请问我该如何调整修改代码,能够使indexOfCandidate里的candidateList是我初始化的candidateList?



return uint(-1);在循环体外,没注意到

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cube 发表于 2020-7-11 12:06
缩进很重要,但自动缩进(代码格式化)更重要
有一个大括号没有闭合,导致直接return uint(-1)进而引发警告.
7086pp 发表于 2020-7-11 13:57
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 19:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表