【问题标题】:Error with bool function布尔函数错误
【发布时间】:2015-10-10 15:33:04
【问题描述】:

我是一个新的 C 开发人员(我习惯于用 Java 编程),并尝试过 create,我认为这是一个简单的 bool 函数。虽然我遇到了一个我不明白如何解决的错误:

#include <stdio.h>
#include <stdlib.h>
typedef enum { false, true } bool;
int main() {
    int currentNumber, round = 1;
    printf("Numbers generated will be between 1 and 20. \n");
    currentNumber = rand() % 20;
    bool validNumber = false;
    do {
        if(currentNumber != 0) {
            validNumber == true;
        } else {
            currentNumber = rand() % 20;
        }
    }while(validNumber == false);
    printf("You're on round" + ("%d", round));
    printf("You're current number is: " + ("%d", currentNumber));
    printf("Higher or Lower (H/L)?");
    char userInput [20];
    scanf("%s", &userInput);
    if((userInput[0] == 'h') || (userInput[0] == 'H')) {
        completeRound(round, 'H', currentNumber);
    } else if((userInput[0] == 'l') || (userInput[0] == 'L')) {
        completeRound(round, 'L', currentNumber);
    }
}

void completeRound(int round, char input, int currentNumber) {
    int initialVal = currentNumber, newVal;
    if(input == 'H') {
        newVal = rand() % 20;
        bool checkResult(initialVal, newVal, input);
    } else {
        newVal = rand() % 20;
        bool checkResult(initialVal, newVal, input);
    }
}

bool checkResult(int initialVal, int finalVal, char input);
bool checkResult(int initialVal, int finalVal, char input) {
    if(input == 'H') {
        if(initialVal <= finalVal) {
            return true;
        } else {
            return false;
        }
    }
    if(input == 'L') {
        if(initialVal >= finalVal) {
            return true;
        }else {
            return false;
        }
    }
    printf("An error has occurred! Aborting game...");
    return false;
}

错误如下:

\main.c|39|错误:'checkResult' 的类型冲突

起初,我认为由于某种原因,在 C 中您只能将某些数据类型作为参数传递给 bool 方法,尽管我在 Google 上找不到直接的答案。除此之外;我无法理解“冲突类型”是什么意思(这是我第一次调试 C 程序。

我曾经调用checkResult的函数如下:

【问题讨论】:

  • 你对 checkResult 有其他定义吗?在 Java 中,您可以有一个 checkResult(arg1, arg2) 和一个 checkResult(arg1, arg2, arg3) 函数。在 C 中这是不允许的。
  • 不,只有一个,有这些论点。
  • 显示你对checkResult的调用的代码,尤其是initialValnewValinput的声明。顺便说一句,您的 checkResult 函数无法编译,有错别字。
  • @MichaelWalz 我刚刚添加到用于调用 checkResult 的函数中。
  • 电话应该只是value = checkResult(initialVal, newVal, temp)。使用bool checkResult(...),您实际上使用默认类型int 声明了一个包含所有参数的原型。 (在 C 语言中,在其他函数中声明函数是合法的。更常见的是在文件头或文件开头声明它们。)

标签: c function boolean


【解决方案1】:

在调用函数之前,您还需要编写它的原型。默认情况下,编译器将其视为int 的返回类型,但实际上它是bool

所以在调用checkResult之前写bool checkResult(int initialVal, int finalVal, char input)

【讨论】:

  • 感谢您的快速回复!虽然我在编写原型时仍然遇到同样的错误?
  • 你在哪里写的原型?是在定义之前吗?您的所有参数类型是否都与定义和原型相同?
  • 根据您的最新更新,我建议您按以下顺序编写代码 - checkResult 的原型,checkResult 的定义,然后是 completeRound
  • 请把bool checkResult(int initialVal, int finalVal, char input);放在main上方。
【解决方案2】:

您的代码中可能有错字。线

bool checkResult(initialVal, newVal, temp);

bool 函数隐式创建原型。在 C99 之前的 C 版本中,参数的类型被省略并且默认为 int。此声明与实际声明冲突,其第三个参数的类型为char

你的意思可能是这样的:

bool okay = checkResult(initialVal, newVal, temp);

这定义了一个bool 变量okay 并使用函数调用的结果对其进行初始化。 (但请注意,此变量是当前范围的本地变量,因此在您的示例中,您会立即丢失结果。)

在 C 语言中,在函数体内声明函数是合法的,尽管这不是好的做法。通常在文件头或文件开头声明它们。

从 C99 开始,隐式函数声明无效。也没有int 的默认参数或函数返回类型。您可以考虑强制执行 C99 标准(例如使用-std=c99in gcc)以避免陷入隐式声明陷阱。

【讨论】:

    【解决方案3】:

    您在声明函数之前调用了函数。错误也是如此。因为默认情况下,c 函数的返回类型是“int”。 添加

    void completeRound(int , char , int );
    

     bool checkResult(int , int , char);
    

    在你的 typedef 之后(这种方式比在调用函数的主体中声明它们更好)。

    由于checkResult() 返回一个bool 类型的值,你最好将它分配给bool 类型的变量,比如

    bool okay = checkResult(initialVal, newVal, temp); this.
    

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2013-05-06
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多