【问题标题】:C: Passing pointers: incompatible pointer type warningC:传递指针:不兼容的指针类型警告
【发布时间】:2012-09-03 11:58:38
【问题描述】:

我正在尝试将二维数组(字符串数组)传递给 C 中的函数,但遇到“不兼容的指针类型”警告。

In function ‘main’:
warning: passing argument 1 of ‘addCodonstoHash’ from incompatible pointer type

代码如下。我正在尝试使用 uthash 创建一个哈希表,其中包含 3 个字母的字符串作为键(代表 DNA 密码子),以及代表密码子翻译成的氨基酸的相关字符值。所以本质上,从下面的代码中,我想要一个形式的哈希表

{“GCT”:“A”,“GCC”:“A”,“GCA”:“A”,“GCG”:“A”,“GCN”:“A”}

其中“A”代表丙氨酸。但是现在,我无法简单地将密码子数组传递给应该解析它们并将它们添加到哈希表的函数。我已通读 Incompatible pointer typePassing an array of strings as parameter to a function in C 无济于事......我认为我了解数组是如何分配并降级为指针的,但显然不是。

此外,当我尝试计算 addCodonstoHash 中数组的长度时(会有许多不同大小的数组代表各种氨基酸),它分别从 printf 调试行返回 8 和 2,并且我不明白为什么会这样。你们能把我引向正确的方向吗?

/* Helper method for adding codons to hash table from initialized arrays */
void addCodonstoHash(char AAarray[][4], char AAname)
{   int i, size1, size;
    size1 = sizeof(AAarray);
    size  = size1 / sizeof(AAarray[0]);

    /* Debugging lines */
    printf("%d\n", size1);
    printf("%d\n\n",size);

    for (i = 0; i < (sizeof(AAarray) / sizeof(AAarray[0])); i++)
    {   add_codon(AAarray[i], AAname);
        printf(AAarray[i]);
        printf("\n");
    }
}


int main(int argc, char *argv[])
{   /*
     * Generate arrays for codons corresponding to each amino acid, will
     * all eventually be incorporated into hash table as keys, with AA
     * values.
     */
    const char Ala[][4] = {"GCT", "GCC", "GCA", "GCG", "GCN"};
    ...


    addCodonstoHash(Ala, 'A');

    delete_all(); 
    return 0;
}

谢谢!

【问题讨论】:

  • 建议:你真的不应该为此使用 C。使用 Perl 或 Ruby 等脚本语言来完成此类任务。 C 并不真正适合此类任务。当然,它可以做到,但正如你所看到的,这很让人头疼。更加面向脚本的语言将使一切变得更容易。
  • 这在C FAQ 中有介绍 - const 和将二维(或更大)数组传递给函数存在问题
  • @m0skit0 我想我可以写一个脚本来生成哈希表,但是这个程序是为海量数据集设计的(比如,300GB 的文件,所以速度很重要),所以我认为 C 会是这条路要走。不然我就白白让自己头疼了哈哈
  • 您必须考虑头痛是否值得(小?)速度增加。 Perl 有很多用于生物信息学的模块。而且您将编写运行速度更快的代码。我建议你尝试一下 Perl,如果速度不能让你信服,你可以尝试一种混合方法,这将包括两个世界的好处(但也包括缺点......)。 Perl 可以轻松使用 C 库。
  • 肯定会调查它,感谢您的想法。我猜由于这个程序将花费大部分时间来迭代字符串,我可以在 C 中执行此操作,并在 Perl 中执行顶级文件读取/写入...

标签: c string pointers multidimensional-array incompatibletypeerror


【解决方案1】:

Ala 的类型为const char(*)[4](除非它用作sizeof&amp; 操作数),但参数的类型为char(*)[4]。您需要将此声明为const

【讨论】:

  • 所以我已经合并了它,虽然它不再返回警告,但 printf 行仍在打印意外的东西: sizeof(Ala) / sizeof(Ala[0]) 从内部返回 2 addCodonstoHash 函数。但是,当我在 main 函数中执行相同的操作时,它给了我 5 的期望值......什么给了?
  • 在大多数情况下,数组被评估为指向其第一个元素的指针。因此,在函数addCodonstoHash 中,AAarray 的类型为const char(*)[4],表达式sizeof AAarray / sizeof *AAarray 的结果等价于sizeof(char *) / 4。如果 char 在您的机器上的 sizeof 为 8 字节,则等于 2。要解决此问题,您必须传递一个额外的参数来指示大小。
  • 谢谢!然后,我将在 addCodonstoHash 中添加另一个参数作为大小。另外,我不敢相信这整件事只是我忘记添加 const 关键字......对不起,但谢谢!
  • @Kirilenko "如果一个字符的大小为 8 字节"?
  • 抱歉,我的意思是“如果 char* 的大小为 8 个字节”。但我无法编辑此评论...
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多