【问题标题】:function call giving error of incompatible type of argument函数调用给出参数类型不兼容的错误
【发布时间】:2014-01-16 08:28:49
【问题描述】:

我在用 c 编码时遇到了问题(我不是经验丰富的程序员)。 我有这样的结构

struct afreq
{
    int freq;
    unsigned char sym;      
    short int left,right,next;      
};

在主函数中:

struct afreq data[50] ;  

int 大小 = 操作(数据,计数); //这个函数做一些操作和 返回 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 a b] 等(就像霍夫曼代码)。 到这里为止,我已经做好了一切。但是当我尝试打印字典时(就像我们在霍夫曼(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’

【问题讨论】:

  • data[i].left 类型为short int
  • 那里有很多问题。
  • @BLUEPIXY 你对我的问题有什么解决方案吗(我不得不不使用指针,否则我会这样做。)你能帮我吗?谢谢。 (下面试图分析的人已经完全理解我要做什么。但是如何通过创建表格来实现它?(不是指针)请提供任何 sn-p 或指导?)
  • @Dipto 感谢您的帮助。实际上,“Blaise”完全理解了我的问题。您可以阅读以准确了解我想要实现的目标。但我不知道如何通过创建表来实现(因为不必使用指针)
  • 我认为您应该仔细考虑应该将什么传递给函数。

标签: c function structure function-call


【解决方案1】:

本质上,错误是您的编译器所说的。您将传递 data[i].left 作为第一个参数,它是 short int 类型,而需要指向 struct afreq 的指针。无论如何,它编译的唯一原因是因为 gcc 默认情况下允许在 int 和指针之间进行转换(但没有太多理由要这样做)。

如果我正确理解您正在尝试做什么 - 您想在似乎是一棵树的东西上递归调用您的“字典”函数。问题是这种结构并没有很好地定义。您正在尝试用它们的值“索引”树的节点(这就是我对data[i].left 的理解),但是没有办法在'a' 和“@ 987654325@ 具有'a' 作为符号。您需要在某处制作对应表并对其进行调用,或者您需要将结构中的leftright 转换为指向相应结构的指针。

祝你好运!

【讨论】:

  • 是的,你明白我的意思。但我有义务不使用指针。你还能解释一下我现在如何实现吗?请问有什么代码可以帮忙吗?
  • 我无法通过“制作表格”来理解并调用它?你能解释一下这个,任何一段代码吗? (如果可能,谢谢)
  • 一种方法是定义一个对应表,比如int correspondance[26]。对于您遇到的每个符号sym,您将对应的afreq 元素的索引存储在对应[sym - 'a'] 中,然后调用dictionary(data[correspondance[data[i].left]]). It's not ideal, but it should work. You can also manage you data array so that it takes [sym-a`] 作为索引,但我没有知道它是否适合您的用例。恐怕我不能提供太多代码,因为坦率地说,代码的当前状态太混乱了,我没有动力去挖掘......
  • 当我做你让我做的事情时,我得到错误:改进.c:85:2:警告:传递'字典'的参数1使指针从整数而不进行强制转换[默认启用] 改进.c:74:1: 注意:预期的 'struct afreq *' 但参数是 'short int' 类型,有什么解决方案吗?谢谢(但是我无法理解的一件事,当我们在 data[] 中插入对应 [data[i].left] 时它如何改变它的数据类型)?我的意思是之前的错误是“short int”,但现在错误是“argument is of type ‘struct afreq”
  • 至于你的第二个问题,数据类型改变了,因为......好吧,它改变了: data[something] 是 struct afreq 类型,因为 data 是这些的数组。如果您不清楚这一点,也许您应该查看您的代码并尝试思考,对于每个变量的出现及其组合,该事物是什么类型。它还可以帮助您了解该做什么/如何做。祝你好运。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2021-12-18
  • 2021-02-21
相关资源
最近更新 更多