【问题标题】:Invalid type of arguments C参数类型无效 C
【发布时间】:2017-05-07 18:34:43
【问题描述】:

我正在尝试实现一个从文件中读取行并将它们放入字符串数组的函数。但它给了我警告:

expected char ** 但是参数的类型是 char * (*)[(sizetype)(numberOfchar)]

它在 Windows 上运行,但是当我切换到 Linux 时它停止运行。

这里是调用者和数组变量:

char *hashes[numberOfchar];
PutInArray(textName, numberOfchar, &hashes);

这是函数(void* 用于程序的下一部分,线程):

void* PutInArray(char* k, int d, char *tab[d]) {
  FILE* fp = NULL;
  int i;
  fp = fopen(k, "r");

  if(fp != NULL) {
    for (i = 0; i < d; i++) {
      tab[i] = (char *)malloc((34) * sizeof(char));
      fgets(tab[i], 34, fp);

    }
    fclose(fp);
  }
}

【问题讨论】:

  • 将“d”作为单独的参数传递。
  • 我试过没有错误但是当我像这样执行它时程序停止PutInArray(textName,numberOfchar,&amp;hashes[numberOfchar]);
  • 格式化/缩进..........................
  • 我没听懂你的意思?
  • 欢迎来到 StackOverflow。请采取tour,学习提出好问题stackoverflow.com/help/how-to-ask,制作minimal reproducible example。如果您正在寻求有关调试代码的帮助,请参阅ericlippert.com/2014/03/05/how-to-debug-small-programs 如果您引用错误消息,请不要删除感兴趣的部分。

标签: c arrays file


【解决方案1】:

让我们看看其他类型的函数调用是如何工作的。

你有一个变量int v;和一个函数void foo(int x)(变量声明和参数声明看起来一样)。你打电话给foo(v)。您还有一个函数void bar(int* x)(变量声明比参数声明少一星)。你打电话给bar(&amp;v)

你有一个变量int* v;和一个函数void foo(int* x)(变量声明和参数声明看起来一样)。你打电话给foo(v)。您还有一个函数void bar(int** x)(变量声明比参数声明少一星)。你打电话给bar(&amp;v)

你有一个变量const struct moo ***v和一个函数void foo(const struct moo ***x)(变量声明和参数声明看起来一样)。你打电话给foo(v)。您还有一个函数void bar(const struct moo ****x)(变量声明比参数声明少一星)。你打电话给bar(&amp;v)

您有一个变量char *hashes[numberOfchar] 和一个函数void* PutInArray(char* k, int d, char *tab[d])。变量声明和参数声明看起来还是一样的。为什么要在上帝的绿地上棒&amp;前面的变量?

我听到你说“但我想通过引用传递hashes,并且通过引用传递我需要使用&amp;”。不,数组是通过引用自动传递的(或者更确切地说,数组会自动转换为其第一个元素的指针;数组类型的参数也经过类似的调整,以便上面制定的规则起作用)。

为了完整起见,bar 的类似物将具有如下所示的参数:

char* (*tab)[numberOfchar]

如果你有这样的参数,你将不得不使用&amp;hashes。但你不需要它。

【讨论】:

    【解决方案2】:

    您的代码几乎没问题。关于您收到的错误/警告,只需写 PutInArray(textName, numberOfchar, hashes) 而不是 PutInArray(textName, numberOfchar, &amp;hashes),原因如下:

    在函数PutInArray(char* k, int d, char *tab[d]) 中,char *tab[d]char*[]char** 具有相同的含义,即它表现为指向char 指针的指针。

    然后将hashes 定义为char *hashes[numberOfchar],这是一个指向char 的指针数组。当使用hashes 作为函数参数时,hashes 衰减为指向数组第一个条目的指针,即指向类型为char ** 的值,它与参数tab 的类型匹配。但是,如果您传递&amp;hashes,那么您将传递一个指向char *[] 类型的指针,这是一种间接的方式。 (顺便说一句:通过&amp;hashes[0] 就可以了)。

    顺便说一句:PutInChar 应该返回一个值,或者应该声明为 void PutInArray(char* k, int d, char *tab[d])(而不是 void*)。

    【讨论】:

    • 您的解决方案是正确的,但我有 2 个问题,为什么当我更改全局哈希值时它应该返回一个值?,我在 ubuntu 和 windows 上测试了您的解决方案,windows 正在工作完美,但 ubunto 只采用数组的对索引?
    • 关于问题 1,请参阅编辑后的答案。关于 2,您可以发布 ubuntu 抱怨的内容吗?我不明白“数组的对索引” - 事情。
    • 当我尝试打印数组 hashes in 0 is : 6e7aeb36036e8ad8550e1acf0ff35eed hashes in 1 is : 的值时,这是 ubuntu 给我的,这个值是十六进制的,没问题
    • 那么你可以写return NULL;否则我什至会遇到编译器错误。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多