2013-10-06 58 views
2

我对C很新,所以为了学习它,我试图创建一个输出龙曲线的程序。 这是我走到这一步:从类型'array *'分配类型'array [256]'时的不兼容类型

#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]'时不兼容的类型)。 所以,是的。任何帮助,将不胜感激(:

*编辑:好吧,下面的评论固定了大多数问题;现在只剩下一个警告,那就是“传递'strcopy'的参数2使得整数指针没有投射'和'expected'const cgar * restrict',但参数的类型是'char',作为包含string.h的注释。当我尝试运行该程序时,它给了我一个内存访问错误。 。上面的代码

*Edit²:固定感谢大家以下(:

+1

'strcpy(text,switch_middle(tmp));'用'char switch_middle(char iarray [256])''? – P0W

+0

'tmp = text;'再次出错 –

+0

该消息对应哪一行? –

回答

3

您不能分配在C数组你有两个选择达到你想要的效果:既可以使用memcpy()功能(它在标准库,只是#include <string.h>),或代码复制自己:

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

请注意,我计算要复制的数据量而不是仅硬编码256,以防止将来的错误,当您要更改涉及的数组的大小。一般来说,几乎所有的成本都应该避免固定限制。

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


背景资料:

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

+0

好的,修正了错误,非常感谢。现在试图解决一些其他的错误; (: – vakyas

+2

)复制数组有第三种选择,把它们放在一个struct中。struct ArrayHolder {char data [256];}; struct ArrayHolder tmp; struct ArrayHolder text;'Then你可以做'tmp = text;'但是你必须记得在实际期望char数组的代码的其他部分使用'tmp.data'和'text.data'。我一般不推荐这种方法,但它是第三种选择。 –

1

此行

tmp=text; is wrong. 

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

iarray[num] = "0"; 

“0”是一个string.Try使其“0'.Now这是一个character.Hence会有 没有警告。

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

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中是一个糟糕的设计。如果[]出现在参数列表中,编译器应该给出警告。

+0

非常感谢!纠正了错误。 – vakyas

相关问题