2017-12-06 12 views
0

私はこれらの3つのファイルを持っています。構造体、関数、ポインタを使用します。 - 名へのポインタを受け取り、アクションCプログラミング:逆参照ポインター

contacts.h

struct Name { 
char firstName[31]; 
char middleInitial[7]; 
char lastName[36]; 
}; 
struct Contacts { 
struct Name name; 
struct Address address; 
struct Numbers numbers; 
}; 
void getName(struct Name*name); 

contacts.c

#include <stdio.h> 
#include "contacts.h" 

void getName(struct Name*name) 
{ 
    char yorn; 
     printf("Please enter the contact's first name: "); 
scanf("%s", name->firstName); 

printf("Do you want to enter a middle initial(s)? (y or n): "); 
scanf("%s", &yorn); 

if (yorn == 'y'){ 
    printf("Please enter the contact's middle initial(s): "); 
    scanf("%s", name->middleInitial); 
} 

printf("Please enter the contact's last name: "); 
scanf("%s", name->lastName); 
} 
を行い

void getName(Name *):これを実行しようとすると

a1ms4.c

#include <stdio.h> 
#include "contacts.h" 
#include "contacts.c" 

struct Name name; 
getName(&contact.name); 

私はcontacts.cに次のエラーを取得しています:

エラー:私は最小限に抑え :

scanf("%s", name->firstName);

    ^~ 

[EDIT不完全な型の構造体名へのポインタを参照解除これへのコード:

#include <stdio.h> 

struct Name { 
char firstName[31]; 
}; 

struct Contacts { 

struct Name name; 
}; 

void getName(Name*name); 

int main(void) 
{ 

struct Contacts contact; 
getName(&contact.name); 
return 0; 
} 

void getName(Name*name) 
{ 
char yorn; 
printf("Please enter the contact's first name: "); 
scanf("%c", name->firstName); 

printf("First name: %c\n", name.firstName); 

return; 
} 

これらのエラーが発生する:

1)。エラー:不明なタイプ名Nameââ

void getName(Name*name);

2)。関数内でmainâ:

警告:暗黙の宣言関数âgetNameâ; 012 getlineâを意味しましたか? [-Wimplicit関数宣言]

getName(&contact.name);

3)。

エラー:トップレベルでは未知のタイプ名Nameââ

void getName(Name*name)

+4

'* .c'ファイルを含めないでください!これまであなたがプロで、あなたがしていることを正確に知るまで。 –

+0

これは割り当てであり、3つのファイルすべてを含めることを希望しました – SaM

+0

エラーはクリアです。名前が不完全な場合は名前タイプを使用できません。すでにcontacts.hヘッダーにNameを完全に宣言しているので、事前宣言を完全に削除することができます。 – StarShine

答えて

0

あり、間違ったかなりの数のものがあるが、私はあなたの主なエラーがあなたがそうあなたがする必要があるNamestruct Nameとして宣言していることだと思います代わりにNameの代わりにstruct Nameを使用してください。

+0

はい私はその名前の前に 'Struct'を置いて、今働いています。ご協力ありがとうございます。 この新しいエラーがあります:構造体や共用体ではないメンバーのfirstNameの要求 – SaM

+0

すべてのコードを( '* .h' '* .c'' main')に置き、今は2種類のヘッダーファイルのエラー 1つは競合型です。get * 秒はstruct *の再定義です。 – SaM

1

Cでstruct Foo {...};と言うときは、名前がFooのタイプを定義していません。代わりに、をFoo **という名前で定義しています。これはstruct Fooと参照されています。

したがって、void getName(Name*name);と言うとき、コンパイラはNameという型がないことを正しく告げるでしょう。この関数宣言を解析できなかったので、それを呼び出すときにその関数について知らないことに続いて不平を言います。その2番目のエラーを無視して、それはあなたの問題ではありません。プロトタイプを修正してください。


あなたのプログラムを固定する2つの方法があります。

  1. structあなたの構造体を呼び出しますが。コード内にNameがある場合は、実際にstruct Nameとしてください。

  2. タイプNameを定義するtypedefと記述してください。このようなあなたの構造体を宣言します。これは、宣言し

    typedef struct Foo { ... } Foo; 
    

    struct FooとそのエイリアスFooの両方で:Cプログラマは怠惰GITSがあるので

    struct Foo { ... }; 
    typedef struct Foo Foo; 
    

    、彼らは通常、次の宣言にこれらの二つの文をマージします単一の声明。あなたはこれを実際のコードでたくさん見るでしょう。


のtypedefの形は、いくつかの説明に値します。変数名を型名にするために、typedefを先頭に付けた変数宣言と考えるのが最も簡単です。私。あなたは

char* array[10]; 

で文字列の配列を宣言することができるならば、あなたは、単純な

ArrayType array; 
で上記の配列を宣言することができ、その後

typedef char* ArrayType[10]; 

とその型に名前を付けることができます

だから、あなたが言うとき

typedef struct Foo Foo; 

の2番目のFooは宣言されている名前で、別名の型はtypedefstruct Fooのない宣言の残りの部分です。

+0

はい、ありがとうございます。未知の型のエラーを修正しました。関数の名前の前に 'struct'を置きます。本当に助けを感謝します – SaM

+0

それはエラーを与えています:構造体または共用体ではない何かでメンバー 'firstName'を要求します – SaM

+0

@SaMああ、間違って見落とされました:' firstName'が( 'struct Name * firsName'で宣言された) '.'演算子を使ってメンバーにアクセスすることはできません。逆参照の ' - >'演算子を使う必要があります。 – cmaster

関連する問題