【问题标题】:incompatible types when assigning to type 'array[256]' from type 'array *'从类型'array *'分配给类型'array [256]'时不兼容的类型
【发布时间】:2013-10-06 09:45:14
【问题描述】:

我对 C 很陌生,所以为了学习它,我试图创建一个输出龙曲线的程序。 到目前为止,这是我得到的:

#include <stdio.h>
#include <string.h>
#define ebene 5

char str_n[ebene-1];
char tmp[256]; // ="1"; // 1=R, 0=L
char text[256];

int a_index=0;


char switch_middle(char iarray[256]) {
    int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
    if(num>=0) {
        iarray[num]='0';
    } else {
        iarray[0]='\0';
    }
}

int main() {
    printf("Hauptschleife erreicht");

    while(a_index<ebene) {
        //snprintf(text, sizeof text, "%s1%s", tmp, switch_middle(tmp));
        strcpy(text, tmp);
        strcpy(text, "1");
        strcpy(text, switch_middle(tmp));   // Error occures here!

        //str_n[a_index]=text;
        for(long i=sizeof(tmp)/sizeof(tmp[0]); i--; ) {
                tmp[i]=text[i];
            }
        printf("Ebene: %d\n", a_index);
        //printf("  Wert: %s", str_n[a_index]);
        printf("    Wert: %d\n", text);

        a_index++; // für Mathefunktionen
    }
}

尝试编译它会给我一堆警告和一个错误;我在这个问题的标题中提到的那个(从类型'char *'分配给类型'char [256]'时不兼容的类型)。 是的。任何帮助将不胜感激(:

*编辑:好的,下面的 cmets 修复了大部分问题;现在只剩下一个警告,那就是“传递 'strcopy' 的参数 2 会在没有强制转换的情况下从整数生成指针”和“预期的 'const cgar * restrict' 但参数的类型是 'char'”作为包含的注释string.h。当我尝试运行该程序时,它给了我一个内存访问错误。我在上面的代码中标记了这些行。

*编辑²:已修复。感谢下面的所有人(:

【问题讨论】:

  • strcpy(text, switch_middle(tmp));char switch_middle(char iarray[256]) ?
  • tmp=text; 又是错误
  • 消息对应哪一行?
  • 好的,你能在你的代码中用注释标记第 31 行吗?
  • 数组不可赋值

标签: c


【解决方案1】:

您不能在 C 中分配数组。您有两种选择来实现您想要的效果:要么使用 memcpy() 函数(它在标准库中,只是 #include &lt;string.h&gt;),要么自己编写副本:

for(long i = sizeof(tmp)/sizeof(tmp[0]); i--; ) tmp[i] = text[i];

请注意,我计算了要复制的数据量,而不仅仅是硬编码 256,以防止将来在您想要更改相关数组的大小时出现错误。一般来说,应该不惜一切代价避免固定限制。

编辑:有关复制数组的第三种方法,请参阅 Aarons 评论。


背景资料:

您可能想知道错误消息的文本,它报告了类型不匹配,您尝试分配相同类型的两个变量。原因是数组标识符在几乎所有上下文中都衰减为指向数组第一个元素的指针。这就是为什么,你的分配的右侧衰减为char*,而左侧仍然是char[256]

【讨论】:

  • 好的,已经修复了错误,非常感谢。现在尝试修复一些其他错误;届时将就它是否有效提供反馈(:
  • 还有第三种复制数组的选项。将它们放在一个结构中。 Struct ArrayHolder { char data[256]; }; struct ArrayHolder tmp; struct ArrayHolder text; 然后你可以做tmp=text;。但是您必须记住在实际需要 char 数组的代码的其他部分中使用 tmp.datatext.data。我一般不推荐这种方法,但它是第三种选择。
【解决方案2】:

这条线

 tmp=text; is wrong.   

您正在尝试更改作为常量指针的数组(tmp)的基地址。这意味着无法更改数组的基地址。这就是它抛出此错误的原因。 并且警告在那里是因为您试图在字符位置分配一个字符串。 这一行

   iarray[num] = "0"; 

"0" 是一个字符串。试着把它变成'0'。现在它是一个字符。因此会有 没有警告。

    iarray[0] = ""; //Same reason

【讨论】:

    【解决方案3】:

    char switch_middle(char iarray[256]) {

    应该是

    char * switch_middle(char iarray[256]) {

    你应该在最后返回数组:

    char * switch_middle(char iarray[256]) {
        int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
        if(num>=0) {
            iarray[num]='0';
        } else {
            iarray[0]='\0';
        }
        return iarray;
    }
    

    =====

    顺便说一句,C 数组有一些奇怪的特性。例如,它们在函数的参数列表中被忽略。 char * switch_middle(char iarray[256]) { 完全等价于char * switch_middle(char * iarray) {,后者可读性更强。

    这很奇怪,参见示例here on ideone

    事实上,括号内的数字完全被忽略了——你可以将它从 256 更改为任何其他数字,程序不会改变行为!此规则仅适用于函数的参数。在局部变量中,数字确实意味着什么。

    这意味着你不能像这样直接将数组传递给函数。是的,外部函数可以发送一个数组,但接收函数不会将其视为一个数组。坦率地说,我认为这是一个糟糕的 C 设计。我认为如果[] 出现在这样的参数列表中,编译器应该会发出警告。

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 2016-01-23
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多