c中的函数原型,编译错误

时间:2015-03-18 17:01:43

标签: c

所以我试图自己学习c(基本上没有任何编程语言的经验)现在我有一些问题,我可以在头文件中使用我的一些函数原型。

为了学习,我只使用< stdio.h> lib并且只使用printf和scanf函数,现在只打印到控制台。

我能够为我的菜单编写一个工作原型函数,它只使用printf函数,但scanf给了我更多的问题,它只是拒绝编译,我很难看到我的思维错误在哪里。

我的主要计划:

#include "menu.h"
#include "circlefunctions.h"
#include "input.h"

int main(void){

    float diameter;
    double straal;
    double oppervlakte;
    double omtrek;


        while(1){

            menu();
            user_input();
            system("cls");

        switch(user_input())
        {

    case 1:

        printf(" ----------------------------------------\n");
        printf(" Typ de diameter van de cirkel: ");
        scanf("%g", &diameter);
        printf(" ----------------------------------------\n");

        straal = diameter / 2;
        oppervlakte = PI * (straal * straal);
        omtrek = 2 * PI * straal;

        printf(" De straal = %f \n\n", straal  );
        printf(" De oppervlakte = %f \n\n" , oppervlakte);
        printf(" De omtrek = %f \n" , omtrek);
        printf(" ----------------------------------------\n");

        break;

    case 2:
        return(0);

    case 3:
        return(0);

    case 9:
        return(0);

    case 0:
        return(0);
        }
    }
 return 0;
}

和顽固的标题:

#include <stdio.h>

void user_input();

    void user_input(){
        scanf("%d", &user_input);
  }

尝试编译时遇到的错误在input.h中 部分; scanf(&#34;%d&#34;,&amp; user_input);

错误代码:格式&#39;%d&#39;期望参数类型为&#39; int &#39;,但参数2的类型为&#39; void()()&#39;。 并且我在主程序中的开关上也出现错误,即开关量不是整数。我怀疑这个错误是相关的,但我不确定。我仍然需要调试那部分,但如果有人愿意指出我正确的文档,我会非常感激。

我的第二个问题也与标题有关:我有&lt; stdio.h&gt;已经包含在&#34; menu.h&#34;中。我是否需要再次将其包含在&#34; input.h&#34;? (如果我正确理解预处理器是如何工作的,我不应该包含它,但遗憾的是,我无法在任何地方找到用简单术语解释的地方。)

修改

感谢大家提供有价值的信息。

@zenith谢谢你的榜样。我希望你不要在意我多问一些。

我已经在&#34; input.h&#34;中替换了我的代码。它现在将编译并运行。然而,行为已经改变。由于一些不明原因,我现在必须在程序接受我的输入之前输入两次选择。因此输入后第1个输入被忽略,它只接受第二个输入。

你能否指出我导致这个错误的方向?或者或许请指出一些解释这个问题的文档?我不想在你当中占用你宝贵的时间。

修改2

感谢您的回复和信息。我把错误拿出来了,它按预期工作(这对我来说是愚蠢的,不要看到它)。 对其他回复的人说:我会记录你的课程信息并从中学习。谢谢大家!

2 个答案:

答案 0 :(得分:4)

user_input()不会返回任何内容,因为它已声明void

但您尝试使用不存在的返回值:switch(user_input())

这会导致未定义的行为


此外,这:

scanf("%d", &user_input);

尝试从int读取stdin并将其存储在user_input函数的内存地址中。不是个好主意。再次,未定义的行为。


您可能希望该功能看起来像什么:

int user_input(){
    int number; // store user input to this variable
    scanf("%d", &number);
    return number; // return the user input so that it can be used outside the function
}

答案 1 :(得分:0)

如果您在前一个头文件中声明了头文件。您不需要在随后包含的头文件中再次包含它。出于这个原因,我倾向于不在我的本地* .h文件中包含头文件。如果你尽可能地在.c文件中声明你的包含,它就避免了循环包含。

您的scanf函数的第二个参数是void(),void()类型的函数。这意味着它不需要任何参数,也不会返回任何参数或&#34; void&#34;。我想你希望你的user_input是一个类型为&#39; double&#39;的变量。这可以通过某个地方填充,也可以通过控制台的一些用户输入来调用&#39;获取&#39;来自stdin。

HTH