2014-01-16 36 views
0

我有一个问题下了,而在C编码(我没有经验的程序员)的错误。 我有这样函数调用给不兼容的类型参数

struct afreq 
{ 
    int freq; 
    unsigned char sym;  
    short int left,right,next;  
}; 
在主功能

的结构:

struct afreq data[50] ; 

INT大小=操作(数据,计数); //这个功能做一些操作和INT type.And的 回报大小我在下面的函数调用中使用这个尺寸:

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: 



[email protected]:~/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

'数据[我] .left'类型是'短int' – BLUEPIXY

+0

这么多的问题出现。 – Dipto

+0

@BLUEPIXY你有我的问题的任何解决方案(我有责任不使用指针,其他明智我会做ÿ等)你能帮我吗?谢谢。 (一尝试以下豆已确切地理解了我的蚂蚁做的。但如何通过创建表来实现呢?(不是指针)的任何片段或指导吗?)@Dipto感谢您的帮助 – user3085082

回答

1

的误差,从本质上讲,你的编译器说,它是什么。你逝去的,作为第一个参数,data[i].left,这是short int类型的,而需要一个指针struct afreq。为什么呢编译的唯一原因是因为gcc,默认情况下,允许int和指针之间的转换(但有没有很多原因你为什么会想这样做)

如果我理解正确你正在尝试做的 - 你想打电话什么看你的递归“字典”功能ms成为一棵树。问题在于那个结构并没有很好的定义。您正在尝试“指数”与他们的价值树的节点(这就是我与data[i].left理解),但没有办法“使链接” 'a'之间,也就是说,和“有'a'作为struct afreq一个象征。你要么需要做一个对应关系表的地方,并拨打电话吧,或者你需要在你的结构改造leftright成指向相应的结构。

祝你好运!

+0

是的,你已经理解了我。但我不得不使用指针。你能不能请我解释一下如何实现现在?任何代码的帮助请? – user3085082

+0

我不能通过“打个表”来调用它吗?可以请你给我这个,任何一段代码? (如果可能的话,谢谢) – user3085082

+1

做到这一点的一种方法是定义一个对应表,比如 'int correspondance [26]'。对于你遇到的每个符号'sym',你在对应的[sym - 'a']中存储相应的'afreq'元素的索引,然后你调用'dictionary(data [对应[data [i] .left] ])。这并不理想,但它应该起作用。你也可以管理你的数据数组,使它以[sym-'a']作为索引,但我不知道它是否是你的用例的一个选项。 恐怕我不能提供太多的代码,因为,坦率地说,代码的当前状态太乱了,我不愿意被挖掘... – Balise

相关问题