2017-02-05 28 views
0

それぞれのcharとその数を取得してリンクリストに入れようとしています。タイトルには、互換性のないポインタ型についての警告と、不完全な型の逆参照に関するエラーが出ています。私は最後に言ったのは開始がヌルだからだと思うけど、なぜ私はそれを一時的なものに割り当てたのか分からない。助けてください。互換性のないポインタ型と不完全な型への逆引きポインタからの割り当て

/* Author: Miller Kahihu 
Date: 2017-02-01 
Program getChars.c 
*/ 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stdbool.h> 
typedef struct linkedList 
{ 
    struct Element* start; 
    int size; 
} LinkedList; 

typedef struct element 
{ 
    char key; 
    int value; 
    struct Element* next; 
} Element; 

int main(int argc, char** argv) 
{ 
    LinkedList* list = malloc(sizeof(LinkedList)); 
    list->start = NULL; 
    list->size = 0; 

    char* fileName = NULL; 
    if(argc > 1) 
    { 
     fileName = argv[1]; 
    } 
    else 
    { 
     exit(1); 
    } 
    FILE* fpIn = fopen(fileName, "r"); 
    if(!fpIn) 
    { 
     fprintf(stderr, "file %s could not be opened\n", fileName); 
     exit(1); 
    } 
    int c; 
    Element* temp = (Element*) malloc(sizeof(Element)); 
    while((c=fgetc(fpIn)) !=EOF) 
    { 
     if(list->start == NULL) 
     { 
      temp->key = (char) c; 
      temp->value = 1; 
      temp->next = NULL; 
      list->start = temp; 
      printf("%c kappa\n", list->start->key); 
     } 
     else 
     { 
      printf("%c\n", (char) c); 
     } 
    } 
    //free(temp); 
    return 0; 
} 

は、ここで問題がstruct Elementのようなものではありません完全なエラーメッセージ

getChars.c: In function ‘main’: 
getChars.c:51:25: warning: assignment from incompatible pointer type [enabled by default]                 
     list->start = temp; 
        ^
getChars.c:52:45: error: dereferencing pointer to incomplete type 
     printf("%c kappa\n", list->start->key); 
             ^
+1

「Element」という寄生虫のfwdがあるようです。そして、あなたは、リンクリストの前にElement構造体を宣言する必要があります。 –

答えて

2

です。 clangは警告に少しだけ手がかりを与えます。

test.c:52:25: warning: incompatible pointer types assigning to 'struct Element *' from 'Element *' 
     (aka 'struct element *') [-Wincompatible-pointer-types] 
      list->start = temp; 
         ^~~~~ 

あなたはstruct elementElementが、無struct Elementを持っています。

typedef struct element 
{ 
    char key; 
    int value; 
    struct Element* next; 
} Element; 

異なるケースを使用すると、このような危険が生じる可能性があります。

typedef struct Element 
{ 
    char key; 
    int value; 
    struct Element* next; 
} Element_t; 

大文字を使用すると、組み込み関数と競合しないことを意味します。 struct Elementは何も競合しません。 Element_tは型を明白にし、変数名や関数名と衝突しません。

+0

おそらく、POSIXシステムを現在あるいは将来的にターゲットとする場合には、 '_t'という接尾辞を使用したくないでしょう。 –

+0

@JeffMercado大文字はPOSIXタイプとの衝突を避けるべきです、はい? – Schwern

+0

おそらく、私はそれを危険にさらしません。接尾辞は制限事項で、他のすべてが大文字になっているわけではないので、すべてが予約されています。同じ理由で、二重アンダースコアは何も接頭辞として付けるべきではありません。個人的には、私が使用している規約では、構造体名の先頭にアンダースコアを付け、実際の型名には大文字と小文字を使用します。したがって、すべてのユーザー定義型は大文字になります。 –

関連する問題