简体   繁体   English

函数的冲突类型

[英]conflicting types for an function

Code below is to reverse the order of words in string.下面的代码是颠倒字符串中单词的顺序。 But I am getting 'conflicting types for' error for reverse function.但是我收到反向函数的“冲突类型”错误。

I am confuse about the error given by compiler 'expected 'struct word *' but argument is of type 'struct word *'.我对编译器给出的错误感到困惑“预期的‘struct word *’,但参数的类型为‘struct word *’。

I have done declaration of rev function before the main function.我已经在 main 函数之前完成了 rev 函数的声明。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* rev(char*,struct word*);
int countWord(char*);

struct word{
    char word[20];
};

int main(){

    char str[100];
    char* strp = str;
    char result[100];
    printf("\nEnter string: ");
    fgets(strp,100,stdin);

    int noWords = countWord(strp);

    struct word *ptr; 
    ptr = (struct word*)calloc(noWords,sizeof(struct word));
    

    strcpy(result,rev(strp,ptr));
    printf("reverse is: %s",result);

    return 0;
}

int countWord(char* str){

    int count=0;
    char str1[100];
    strcpy(str1,str);
    int i=0;
    while(str1[i]!='\0'){
        if(str1[i]==' ' && str1[i+1]!=' '){
            count++;
        }
    }
    count+=1;
    return count;
}

char* rev(char* strp,struct word *ptr){

    char str[100];
    strcpy(str,strp);
    char temp[20];
    int i=0,j=0,k=0,l=0;

    while(str[i]!='\0'){
        j=0;
        while(str[i]!=' ' && str[i]!='\0'){
            temp[j]=str[i];
            i++;j++;
        }
        if(str[i]==' ')
            i++;
        temp[j]='\0';

        strcpy(ptr[k].word,temp);
        k++;
    }

    char* ret = (char*)malloc(strlen(str)+1);
    //ret[l]='\0';
    k--;

    while(k){
        strcat(ret,ptr[k].word);
        strcat(ret," ");
        k--;
    }

    return (char*)ret;
}

Expected result was the string having reverse order of words.预期结果是具有相反单词顺序的字符串。

Errors and warnings by compiler-
wordRev.c:5:24: warning: ‘struct word’ declared inside parameter list will not be visible outside of this definition or declaration
 char* rev(char*,struct word*);
                        ^~~~
wordRev.c: In function ‘main’:
wordRev.c:26:25: warning: passing argument 2 of ‘rev’ from incompatible pointer type [-Wincompatible-pointer-types]
  strcpy(result,rev(strp,ptr));
                         ^~~
wordRev.c:5:7: note: expected ‘struct word *’ but argument is of type ‘struct word *’
 char* rev(char*,struct word*);
       ^~~
wordRev.c: At top level:
wordRev.c:47:7: error: conflicting types for ‘rev’
 char* rev(char* strp,struct word *ptr){
       ^~~
wordRev.c:5:7: note: previous declaration of ‘rev’ was here
 char* rev(char*,struct word*);

What you should do is to move the declaration of struct word before the declaration of of rev, and that would solve.你应该做的是将struct word的声明移动到rev的声明之前,这样就解决了。

Something I wanted to point out though is why you are getting that vague error, which is hard to understand:不过,我想指出的是,为什么您会收到这个模糊的错误,这很难理解:

expected ‘struct word *’ but argument is of type ‘struct word *’

Think that the compiler scans the source file from top to bottom.认为编译器从上到下扫描源文件。

First thing it encounters is function rev prototype that uses some yet unknown struct struct word .它遇到的第一件事是函数rev原型,它使用了一些未知的 struct struct word Problem is that it is not the struct itself but an opaque pointer to the struct.问题在于它不是结构本身,而是指向结构的不透明指针。

In C it is legal (although a bad practice and you get a warning about that) to use a pointer to some type that was never declared before, as long as it is only a pointer and you never dereference it.在 C 中,使用指向以前从未声明过的某种类型的指针是合法的(尽管这是一种不好的做法,并且您会收到警告),只要它只是一个指针并且您永远不会取消引用它。

You see, from compiler point of view, any pointer is just 64 (or whatever) bits number, no more.您会看到,从编译器的角度来看,任何指针都只是 64(或其他)位数,仅此而已。 It does not matter what the pointer actually points to.指针实际指向什么并不重要。 As long as you are not trying to dereference it (access the value the pointer points to) - compiler does not really care what type of data it points to.只要您不尝试取消引用它(访问指针指向的值) - 编译器并不真正关心它指向什么类型的数据。

What compiler does is making some temporary type struct word * which valid to use only inside the function rev.编译器所做的是制作一些临时类型的struct word * ,它只能在函数 rev 中使用。 It is possible that rev is a function from an external library, or it has some other knowledge about this type structure, for example it is serialized data - in this case this would make more sense, but it is not your case. rev可能是来自外部库的函数,或者它有一些关于这种类型结构的其他知识,例如它是序列化数据 - 在这种情况下这更有意义,但不是你的情况。

Next, compilation continues, and encounters struct word definition.接下来继续编译,遇到struct word定义。 Now this struct is defined, but from the compiler point of view, it is not the same temporary type as was defined in function rev .现在这个结构体已定义,但从编译器的角度来看,它与函数rev中定义的临时类型不同。

Next you invoke rev , but as said, from compiler point of view, its argument struct word * is not the same type as struct word * you pass to it, hence comes this weird error.接下来调用rev ,但如前所述,从编译器的角度来看,它的参数struct word *与传递给它的struct word *类型不同,因此出现了这个奇怪的错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM