gpt4 book ai didi

函数的类型冲突

转载 作者:行者123 更新时间:2023-11-30 16:14:30 25 4
gpt4 key购买 nike

下面的代码是反转字符串中单词的顺序。但我收到反向函数的“冲突类型”错误。

我对编译器给出的错误“expected ‘struct word *’ but argument is of type ‘struct word *’感到困惑。

我在 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;
}

预期结果是单词顺序相反的字符串。

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*);

最佳答案

你应该做的就是将struct word的声明移到rev的声明之前,这样就可以解决。

我想指出的是为什么你会收到这个模糊的错误,这很难理解:

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

认为编译器从上到下扫描源文件。

它遇到的第一件事是函数rev原型(prototype),它使用一些未知的结构struct word。问题是它不是结构本身,而是指向结构的不透明指针。

在 C 中,使用指向以前从未声明过的某种类型的指针是合法的(尽管这是一种不好的做法,并且您会收到警告),只要它只是一个指针并且您从不取消引用它。

你看,从编译器的角度来看,任何指针都只是 64(或其他)位数,仅此而已。指针实际指向什么并不重要。只要您不尝试取消引用它(访问指针指向的值) - 编译器并不真正关心它指向什么类型的数据。

编译器所做的是创建一些临时类型struct word *,该类型仅在函数 rev 内有效。 rev 可能是来自外部库的函数,或者它具有有关此类型结构的一些其他知识,例如它是序列化数据 - 在这种情况下这更有意义,但它是不是你的情况。

接下来,编译继续,遇到struct word定义。现在这个结构体已经定义了,但是从编译器的角度来看,它与函数 rev 中定义的临时类型不同。

接下来,您调用 rev,但如上所述,从编译器的角度来看,它的参数 struct word *struct word *< 的类型不同 你传递给它,因此出现了这个奇怪的错误。

关于函数的类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57629299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com