2012-04-13 4 views
-1

C言語の新機能です。だから、私はBrian KernighanとDennis Ritchieの本(Cプログラミング言語)からコードをコピーしました。私はpg32の例をコピーしていた。このエラーが発生したとき:Cプログラムエラー:以前の外部宣言 'char line []'とタイプが一致しません[-fpermissive]

pg32.c: In function ‘int main()’: 
pg32.c:16:23: error: type mismatch with previous external decl of ‘char longest []’ [-fpermissive] 
pg32.c:7:6: error: previous external decl of ‘char longest [1000]’ [-fpermissive] 
pg32.c: In function ‘int getl()’: 
pg32.c:33:20: error: type mismatch with previous external decl of ‘char line []’ [-fpermissive] 
pg32.c:6:6: error: previous external decl of ‘char line [1000]’ [-fpermissive] 
pg32.c: In function ‘void copy()’: 
pg32.c:50:20: error: type mismatch with previous external decl of ‘char line []’ [-fpermissive] 
pg32.c:6:6: error: previous external decl of ‘char line [1000]’ [-fpermissive] 
pg32.c:50:31: error: type mismatch with previous external decl of ‘char longest []’ [-fpermissive] 
pg32.c:7:6: error: previous external decl of ‘char longest [1000]’ [-fpermissive] 

私はこのコードを4回、同じエラーで再入力します。私は確信が持てませんが、それは遺産問題だと思います。

#include<stdio.h> 

#define MAXLINE 1000 

int max; 
char line[MAXLINE]; 
char longest[MAXLINE]; 

int getl(void); 
void copy(void); 

int main() 
{ 
    int len; 
    extern int max; 
    extern char longest[]; 

    max =0; 
    while((len =getl()) > 0) 
    if(len > max){ 
     max = len; 
    copy(); 
    } 

    if(max > 0) 
    printf("%s", longest); 
    return 0; 
} 

int getl(void) 
{ 
    int c, i; 
    extern char line[]; 

    for(i =0; i < MAXLINE-1 && 
    (c=getchar()) != EOF && c != '\n'; ++i) 
    line[i] =c; 

    if(c=='\n'){ 
    line[i] = c; 
    ++i; 
    } 
    line[i] ='\0'; 
    return i; 
} 

void copy(void) 
{ 
    int i; 
    extern char line[], longest[]; 

    i=0; 
    while((longest[i] = line[i]) != '\0') 
    ++i; 
} 

私は何か助けていただきありがとうございます。

+0

でグローバルを使用します。コンパイラは、2つのソリューションがあることを、とても気に入っていませんどのコンパイラを使用していますか?これはgcc-4.3.4 –

+0

gccバージョン4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu4)の[コンパイル](http://ideone.com/7k1Vw) – agape

答えて

2

グローバル変数として宣言された「行」と「最長」は、ファイルの先頭に固定長配列として宣言されています。次に、不確定な長さの配列としてextern(これは必要ありません)として再宣言します。

  1. 変更extern char longest[MAXLINES]
  2. にすべてのextern line[MAXLINES]からextern line[]、すべてextern char longest[]があなたのextern宣言のすべてを削除し、ちょうどトップ
+0

うわー、オプション1が動作しました。 – agape

+0

どちらも動作するはずです。それがこのような同じファイル(実際の宣言とextern宣言)にある場合、私の意見では実際にはオプション2が望ましいです。 –

+0

オプション2に配列サイズに関するエラーがあります。しかし、オプション1に感謝します。 – agape

関連する問題