2013-10-06 61 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

相關問題