• 締切済み

構造体について

分割ファイルで構造体を使うにはヘッダファイルに書くと思うのですがどうやって書けばいいのでしょうか? charやintはexternでできるのですが・・・ 例で教えてくださいm(__)m

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

ちなみに、構造体へのポインタの宣言であれば、単に extern struct A *a; とするだけで済みます。 ただし、構造体の中身にアクセスするのであれば、完全な構造体の定義が必要になります。

lark198220
質問者

お礼

回答ありがとうございます。 ポインタの宣言ではないのです>< 今、main.c、sansho.c、touroku.c、sansho.h、touroku.hというのがあるんです。 で、main.cにはsansho.h、touroku.hをインクルードしていて、sansho.cにはsansho.h、touroku.cにはtouroku.hをインクルードしています。 で、main.cにはsansho.cなども分割ファイルでリンク?みたいになっているので構造体の宣言が重複してるみたいなエラーが出ちゃうんです><

回答No.3

まず、char や int は extern できているということで。 char や int はC言語が持っている型なので、 extern char hoge; とすると、コンパイラには理解できます。 しかし、構造体の場合は、どういう構造なのか、コンパイラに教えてあげないと、コンパイラが理解できないというのが、答えになります。 ですから、ヘッダファイルで、 struct hogeType{ int a; int b: char c[100]; }; などと書くことで、(この場合は)hogeType という構造体を定義したことと、その具体的な構造をコンパイラに伝えます。(もちろん、hogeType でなくても、わかりやすい名前で) これで、コンパイラが、struct hogeType という型を理解したと考えておおむねOKです。 あとは、この構造体を使うところで、このヘッダファイルを include すれば、他の char や int と同じように、 struct hogeType を使うことができます。 struct hogeType hoge; // 実体の定義 extern struct hogeType hoge; // 外部定義の参照 struct hogeType func(struct hogeType a); // 構造体を引数にして、構造体を返す関数 などなど。 あと、struct hogeType というのを、簡略化して、struct なしですませようとする場合には、typedef を使います。 C++では、(typedef しなくても)struct 無しでもOKです。

noname#168973
noname#168973
回答No.2

申し訳ない。C言語でしたね。 先の例は、下記の *何れか* に変更してもらわないと、コンパイルできないと思います。 -- 変更パターン(1): a.c, b.c の  X_t x; を  struct X_t x; に変更 -- 変更パターン(2): x.h の struct X_t {...}; を typedef struct {...} X_t; に変更

noname#168973
noname#168973
回答No.1

構造体も extern 出来ますよ(正確には、構造体の実体も char や int (の実体)と同様に extern 出来ます)。 ## 構造体を定義することと、extern を記述することは事は次元の異なることです。 例ですが、 == x.h struct X_t {  int a;  char b; }; == a.c #include "x.h" void foo() {  X_t x;   : (処理) } == b.c #include "x.h" void bar() {  X_t x;   : (処理) } -- って感じでしょうか??

関連するQ&A

  • 構造体の入れ子が構造体の場合のextern宣言について

    えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;; typedef struct __test001 { int arg; } _test001; typedef struct _body { _test001 test001; } body; body useful; この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

  • 構造体で配列を使用しない方法。

    構造体で配列を使用せずに、メモリ領域を獲得する関数を使用する場合はどうすればよろしいですか??  例 char *str; struct seiseki{ char name[20]; int eig; int suu; int kok; char rank[3]; }; str = ()malloc();

  • 構造体 アドレス

    VC++6 こんにちは。構造体のアドレスを文字列ポインタで操作することに悩んでいます。下にソースの一部を書きます。 typedef struct{   char code[100];   int type; }AAA; typedef struct{   double method[4][3];   int area; }BBB; 複数の構造体があり、 BOOL CTestApp::File_Check(){  AAA aaa; ~  db.DB_regi(2, (char *)&aaa); ~ } void CData::DB_regi(int key, char *buff) {  switch(key){ ~  case 2:   sss.push_back(buff);  //vector<char *> sss;   break; } で、データを登録し、 int CTestApp::Data_Check() { ~  AAA aaa;  db.DB_get(2, (char *)&aaa); ~ } void CData::DB_get(int key, char *buff) {  switch(key){ ~  case 2:   buff = sss[i];   break; ~ } で、構造体のアドレスを取得しようと思ったら、取得できませんでした。 //DB_getの中では、aaa = (AAA *)buff;とすれば指定の構造体を取得できる。 DB_get関数をどのようにしたら、Data_Check()で、登録した構造体を取得できるのか教えてください。長くなってすみません。

  • ファイルの読み込みと構造体

    こんばんは☆ Cのプログラミングに困っています(>_<) テキストファイル(meibo.txt) 田中 32 公務員 佐藤 20 学生 というファイルを読み込んで、構造体に入れて表示するには どうしたらよいでしょうか? struct meibo{     char name[20];     int age;     char job[20]; }list[3]; としたあとにどのように入れたらよいかがわかりません… わかる方教えてくださいm(_ _)m

  • 構造体のアライメント調整

    構造体のアライメント調整について教えて下さい。 (1) アライメント調整を行う目的は何ですか? (2) char = 1byte short = 2byte int = 4byteの時、 下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか? typedef struct{ ____char hoge1 ____char hoge2 ____short hoge3 ____char hoge4 ____int hoge5 ____int hoge6 ____char hoge7 }tHOGEHOGE 下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか? typedef struct{ ____char hoge1 ____char hoge2 (1)__char reserve[2] ____short hoge3 (2)__char reserve[2] ____char hoge4 (3)__char reserve[3] ____int hoge5 ____int hoge6 ____char hoge7 (4)__char reserve[3] }tHOGEHOGE つまらない質問で申し訳ありませんが、 よろしくお願いいたします。

  • 構造体の動的メモリについて

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 10 /*生徒数*/ typedef struct data { int num; /*従業員番号*/ char name[16]; /*名前*/ int jap; /*国語の点数*/ int math; /*数学の点数*/ }data; int main(void) { data test[NUM]; /*生徒のデータ*/ FILE *fp; /*ファイル操作用*/ int i; /*配列インデックス*/ int count; /*データ分割用*/ char s[100]; /*データ読み込み用*/ char *token; /*データ分割用*/ char *data[6]; /*分割データ保存用*/ fp = fopen ("data1.txt","r");        for (i=0; i<NUM; i++){ fgets (s, sizeof(s), fp); /*dataファイルから1行読み込み*/ token = strtok(s, ","); /*読み込んだデータを","で分割する*/ count=0; while (token != NULL){ data[count] = token; /*分割したデータを配列へ入れる*/ token = strtok(NULL,","); count++; } test[i].num = atoi(data[0]);       strcpy (test[i].name, data[1]); test[i].jap = atoi(data[2]); test[i].math = atoi(data[3]); } fclose(fp);       } このプログラムを構造体へのポインタの配列で管理するように変えたいのですが、どのように変更すればいいのでしょうか。 条件として、個人データを格納するメモリ領域とポインタの配列のメモリ領域は動的に確保します。 初心者でよくわからないので詳しく教えていただけると助かります。よろしくお願いします。

専門家に質問してみよう