我在c编码时遇到了问题(我不是经验丰富的程序员)。 我有这样的结构
struct afreq
{
int freq;
unsigned char sym;
short int left,right,next;
};
主要功能:
struct afreq data[50] ;
int size = manipulation(data,count); //这个函数做了一些操作和 返回int类型的大小。我在下面的函数调用中使用此大小:
dictionary(data,var,size);
问题创建部分在这里:
///////////////////////////// Definition of Dictionary function /////////////////////////////////////////
dictionary(struct afreq data[] ,char *var,size_t dataSize)// function definition create problem in first argument when caled from the another recursive function call inside this function.
dictionary(struct afreq data[] ,char *var,size_t dataSize)
{
int i;
printf("\n data: %d\n", dataSize);
for(i=2;i<dataSize;++i)
{
if(data[i].left=='\0')
{ int correspondance[data[30];
char temp[30];
strcpy(temp, var);
strcat(temp, "0");
printf("check1");
dictionary(data[correspondance[data[i].left]], temp,dataSize); //error here
}
printf("\n");
}
}
我想用这个做什么? 我必须从作为唯一参数给出的文件中读取字母表。该文件是“Input.txt”并包含在'abcdef'里面(我在我的程序中计算它们的频率),然后我将它们以格式[symbol Frequency LeftChild RightChild]保存在一个数组中(例如:[a 1 0 0] [ b 2 0 0] [c 3 ab]等(就像霍夫曼代码))。 到目前为止,我已经做好了一切。但是当我尝试打印字典时(就像我们在huffman(o和1中的路径))(在示例中我们可以看到“c”是父级,“a”的路径是“o”和“b”是“1”)。为了实现这一部分,我编写了上面的代码,它在函数调用的第一个参数中创建了错误。 这是完整的代码(但请不要忘记在包含“abcdef”的唯一参数中包含“Input.txt”文件。
Here is the output:
hp@ubuntu:~/Desktop/Internship_Xav/Task2$ gcc ttask.c -o ttask
improve.c: In function ‘dictionary’:
improve.c:85:2: error: incompatible type for argument 1 of ‘dictionary’
improve.c:74:1: note: expected ‘struct afreq *’ but argument is of type ‘struct afreq’
答案 0 :(得分:1)
错误基本上就是编译器所说的错误。作为第一个参数,您传递的是data[i].left
,其类型为short int,而需要指向struct afreq
的指针。无论如何编译它的唯一原因是因为默认情况下gcc允许int和指针之间的转换(但是你想要这样做的原因并不多)。
如果我理解你正在尝试做什么 - 你想要递归地调用你的“字典”函数来看似是一棵树。问题是该结构并没有很好地定义。您正试图用它们的值“索引”树的节点(这是我对data[i].left
所理解的),但是没有办法在'a'
之间“建立链接”,以及struct afreq
作为符号的'a'
。您需要在某处制作对应表并拨打电话,或者您需要转换left
和{{1}在你的结构中指向相应结构的指针。