小草鱼冒泡泡, 发表于 2015-7-31 11:11:36

答题看女女 c

#include <stdio.h>

void main()
{
        int c={1,3,2,4,5,6,7,5,4,5};
    int i;
        for(i=0; i<10; i++){
               test(c);                =============我要疯了   
        }
        printf("\n");
}

void test(int v)
{
          if(v>0){
             printf("%d",v);
          }
          else{
          printf("%d",0);
          }
   
}

C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(8) : warning C4013: 'test' undefined; assuming extern returning int
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(14) : error C2371: 'test' : redefinition; different basic types
执行 cl.exe 时出错.

零度非安全 发表于 2015-7-31 11:50:51

本帖最后由 零度非安全 于 2015-7-31 12:54 编辑

主函数中的text(c[])里的参数是数组类型,而你另外定义的text函数里的参数而是int v,应该是int v[]


还有的就是必须要有返回值

定义的函数也没有声明

以下是我根据你的意思我改编的,仅供参考!


#include <stdio.h>
int test(int v[]);
void main()
{
      int c = { 1,3,2,4,5,6,7,5,4,5 };
        test(c);
        printf("\n");
}
int test(int v[])
{
        int i;
        for (i = 0; i < 10; i++){
                if (v>0) printf("%d", v);
                else printf("%d", 0);
        }
        return v;
}



我的是用VS2015在win10环境下测试的,见下图


牡丹花下死做鬼 发表于 2015-7-31 12:37:29

函数前置申明
在main函数上面加上 void test(int v);

qq334121747 发表于 2015-8-4 23:07:14

不疯才怪。。。开始我也没看出来

淫令天下 发表于 2015-8-5 18:52:44

在主函数之前做函数的声明 void text(int v)   或者把定义的text函数放到主函数的上面!!

kmjstv 发表于 2015-8-5 20:14:35

路过打下酱油

仰望天上的光 发表于 2015-8-6 00:36:23

好吧,我觉得知道怎么改没什么了不起的。关键在于如何分析编译器的警告和报错。
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(8) : warning C4013: 'test' undefined; assuming extern returning int

其中,over.c(8) : warning C4013: 'test' undefined大概是说文件over.c的第8行,test没有定义。也就是你程序中的 函数调用test(c);
分析下,如果从前往后读,读到这里,确实还没读到函数test的定义(你定义在调用的后面了)。这其实没关系的,只是警告而已。
接着assuming extern returning int大概是说,编译器认为(assuming)这个函数定义在其它.c文件(extern)中了,并且由于从调用test(c)中无法知道函数的返回类型,编译器假定这个函数返回int类型,又,c是int类型,所以编译器至此假定函数test的类型是int test(int).

C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(14) : error C2371: 'test' : redefinition; different basic types
大概是说在over.c文件的14行,函数test重定义了,基本类型不一样。也就是说你定义的test函数类型和编译器之前的推断类型不一样,所以编译器判断你在这里向重新定义一个名字叫test的函数,这在C语言中是不允许的。

明白以上道理后,其实你只要把你的定义void test(int v){...}改为int test(int v){...}就不会报错(当然正确的做法应该看前面版主的做法)
页: [1]
查看完整版本: 答题看女女 c