为什么我的程序没有编译

时间:2018-03-08 01:59:02

标签: c++

我一直收到错误:无法解析函数roll。我不确定这是因为范围,如果是,我该如何解决?

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {

    roll();
}

int playerSum = 0;
int dice [5];

void roll(){
  for(int i =0;i<6;i++){
      int randNum = rand()%600 + 1;
      dice[i]= randNum;
      cout<<dice[i]<<endl;
    }
}

4 个答案:

答案 0 :(得分:1)

编译器在看到main()中对它的引用之前还没有看到roll()函数定义。将主声明移动到文件的底部。

答案 1 :(得分:1)

一些问题。

1)在void roll()之前放置前置声明main原型,让编制者了解roll.

2)int dice [5]小到保留6个元素 - 它将调用未定义的行为。

3)无需使用全局数组dice

4)您可能需要seed随机生成器,否则每次运行程序时都会收到相同的数字。

#include <iostream>
#include <cstdlib>

using namespace std;

void roll();

int main() {

    roll();
    return 0;
}

void roll(){
    int dice[6];
    int randNum; 

    for(int i =0; i<6; i++){
        randNum = rand()%600 + 1;
        dice[i] = randNum;
        cout<< dice[i] <<endl;
    }
}

输出:

584                                                                                                                                                                                                                                              
287                                                                                                                                                                                                                                              
178                                                                                                                                                                                                                                              
116                                                                                                                                                                                                                                              
594                                                                                                                                                                                                                                              
536 

答案 2 :(得分:0)

在调用之前尝试将roll放在main之上。

或者,您可以声明void roll();在main之上并在之后定义它。

答案 3 :(得分:0)

我最初认为这个问题是重复的。令我惊讶的是,我在搜索StackOverflow时找不到C ++标记的副本。所以我发布了一个答案。

至少,C ++编译器需要在第一次调用之前在同一个编译单元中看到函数的声明。

这意味着,在roll()调用main()之前,需要声明roll()。例如;

void roll();       //  declaration of roll()

int main()
{
     roll();
}

void roll()      //  definition of roll()
{
     //   your code 
}

这种方法(不是定义的声明,放在调用函数的代码之前)有一个优点,即如果需要,roll()的定义可以移动到另一个编译单元(也就是源文件)(当然,假设构建过程正确编译所有源文件并根据需要链接目标文件。

定义在形式上是一种声明,因此另一种方法是将main()移动到源文件的末尾。

void roll();     // declaration of roll()

void roll()      //  definition of roll()
{
    //   your code 
}

int main()
{
     roll();
}

从技术上讲,在这种情况下可以删除roll()的声明,因为定义是一种声明。这样做的一个缺点是,如果有人随后决定将roll()的定义移到其他地方(例如,移动到另一个源文件),那么在{{1}之前重新引入roll()的声明仍然是必要的。 }}