• ベストアンサー

ヘッダファイルとは?

Oh-Orangeの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★アドバイス >ヘッダファイルを作って、そこに構造体を送りたいのですが、  ↑  これは構造体をヘッダファイルに記述したいということですか? >「引数宣言は 'data' で始められない」というエラーがヘッダファイル側で起きてしまいます。  ↑  ヘッダファイルには再定義された型の『DATA』を記述するため『struct data』の『data』は  記述できません。もし記述するなら『struct data』として下さい。でもせっかく『DATA』という  新しい型を作っていますのでこの質問での正しい記述は『DATA』となりそうですね。 >main()で作ったからいけないのでしょうか?  ↑  その通り。  ヘッダファイルに記述しないといけないのです。 >分かる方教えていただけませんか?  ↑  回答者 No.4 さんが分かりやすく説明しています。  そちらを参考に。 その他: ・分配コンパイルをするときは、構造体や新しい型、あと関数のプロトタイプ宣言や記号定数などを  ヘッダファイルにまとめて記述します。今回は『struct data』の構造体と Max_Score() 関数の  プロトタイプ宣言などを記述すべきです。 ・そしてそのヘッダファイルを main() 関数のあるソースや、Max_Score() 関数があるソースに  #include "Max_Score.h" という感じでインクルードするのです。重要なのは main()、Max_Score()  の2つのソースにインクルードするのです。このことがヘッダファイルを作る理由にも繋がります。 ・私も見やすく下に記述してみました。→回答者 No.4 さんと同じですけど。  重要なのは1つのヘッダファイル(Max_Score.h)を2つのソース(Max_Score.c,main.c)に  インクルードすることです。 ・次の3つのファイルの記述とコメントをよく読んで下さい。 --[Max_Score.h]--------------- // スコア管理の構造体を宣言 typedef struct data {  ・・・・・; } DATA; // 関数のプロトタイプ宣言 void Max_Score( DATA *p ); --[Max_Score.c]--------------- #include <stdio.h> #include "Max_Score.h" // スコア関数の定義 void Max_Score( DATA *p ) {  ・・・・・; } --[main.c]-------------------- #include <stdio.h> #include "Max_Score.h" // メイン関数 int main( void ) {  DATA data[ 50 ];    ・・・・・・・・;    Max_Score( data );  return 0; } ------------------------------ 以上。

sikimori
質問者

補足

御回答ありがとうございます。 アドバイス通り、ヘッダファイルで構造体宣言と、関数のプロトタイプ宣言をするよう書き直しました。 現在bcpadを使って組んでいるのですが、 「Error: 外部シンボル '_Max_Score' が未解決(C:\BORLAND\成績管理システム\SYSTEM-MENU.OBJ が参照)」 と出て、F9(make&実行)や、F8(コンパイル&実行)が、出来ませんでした。しかし、コマンドプロンプトからは実行されました。 このエラーはどういった意味なんでしょうか?

関連するQ&A

  • ヘッダーファイルについて

    //DMusic7Ex.h あるプログラムを解析しています。 //コンパイラ設定 //多重定義防止 #pragma once //ファイルインクルード #include <dmusicc.h> #include <dmusici.h> //型定義 typedef IDirectMusicPerformance* LPDIRECTMUSICPERFORMANCE; typedef IDirectMusic* LPDIRECTMUSIC; typedef IDirectMusicLoader* LPDIRECTMUSICLOADER; typedef IDirectMusicSegment* LPDIRECTMUSICSEGMENT; //関数プロトタイプ 1・DMusic7Ex.cppを作らず他の関数で、このヘッダーファイルをインクルードする手法は一般的なのか? 2・なぜ関数プロトタイプを記述しないで、このタイプ宣言を他のファイルで使用するのは一般的なのか?

  • ヘッダファイルと構造体

    typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • 構造体のメンバ参照について(C言語)

    初めて書き込みする,taroimotenです. 以下のプログラムを作ってみたのですが, メモリ参照エラーが表示され,うまく動きません. アドバイスおねがいします! #include <stdio.h> #include <stdlib.h> // 型宣言. typedef struct data DATA; typedef struct coords COORDS; // 構造体の定義. struct data{ COORDS *pnt[3]; }; struct coords{ float r1; float r2; }; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0]->r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0]->r1); return EXIT_SUCCESS; }

  • 直接ファイルへ出力できるものでしょうか?

    構造体 struct{int i,int m}i を用意しています #include <stdio.h> typedef struct{ int i[6]; /*学生番号*/ int m[6]; /*身長*/ }stu int main(void){ FILE *fp; stu s; fp("text.txt","w"); while(gets(s)!=NULL){ fputs(s,fp); } fclose(fp); } これを動かそうと思ってもダメなのは自分でもよくわかります。 構造体へダイレクトにいれてファイル出力というのは無謀なのでしょうか? 一度構造体にきちんと取り込んだ後で改めてファイルへ出力するのが正式なのでしょうか? 教えてください

  • linuxにおけるCの自作ヘッダファイル

    現在C言語のしっかりと学ばなかった部分を学習したいと思い、自作ヘッダファイルの作成を勉強しています。 そこで、書籍のその章を一通り読んだあと、自分で簡単なものを作成してみましたが、エラーが出てうまくいきません。 どうしてかわかる方いたら教えてください。 コード *****main.c***** #include "print.h" int main(void) { print(); return 0; } *****print.c***** #include <stdio.h> void print(void) { printf("test\n"); } *****print.h***** extern void print(void); エラー /tmp/ccH551c1.o: In function `main': /home/ユーザ名/Documents/StudyC/main.c:5: undefined reference to `print' collect2: ld returned 1 exit status CentOS6.6にて端末上での実行です。 自分の解釈では、""でincludeすることでカレントディレクトリから目的のヘッダファイルを見つけ出してインクルードする、また、ヘッダファイル内でexternすることによってprint.cから目的の関数を定義しているので、main.cでは問題なく使えると思っています。 しかし、エラーではprint()が定義されていないと出るのでまったくわかりません・・・。

  • fwrite文について

    char型で宣言した配列の方はうまくいきましたが、構造体を用いたfwrite文がうまく出力されません。 どうしてでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> struct ll{ char name[20]; int ten[3]; }list[3] = { {"aaa", 11}, {"bbb",22}, {"ccc",33} }; FILE *fpbin, *fpcsv; /*FILE構造体(グローバル変数)*/ void main(void) { char i[] = {'a','b'}; fpbin = fopen("data.txt","w"); //fwrite(&i,sizeof(char),2,fpbin); fwrite(&list[0].name,sizeof(struct ll),2,fpbin); fclose(fpbin); }

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • 自己参照構造体のtypedef宣言とスコープ

    MinGWとgccでプログラムを組んでいます(OSはWin7です)。 main.cpp、variable.h、function.hの3つのファイルからなり、 variable.hで自己参照構造体とそれのtypedef宣言をしています。 以下のような感じです。 ************************* typedef struct hoge HOGE; struct hoge{ int a,b; double x,y; HOGE *p1, *p2; } ************************* そのあとfunction.hでこのHOGE型のポインタを受ける関数を宣言しています。 void hogehoge(HOGE *p1, HOGE *p2); これをmain.cpp内で、variable.h、function.hの順に読み込んでいます。 そして、コンパイルエラーがでます。 error: unknown type name 'HOGE'(これがずらっと) typedefのスコープの関係なのか、それ以外の問題なのか。 煮詰まっています。アドバイスお願いいたします。m(_ _)m

  • ヘッダファイルに関数本体を書き込めないのか?

    こんにちは。 現在WindowsVistaでCおよびC++を使ってプログラミングを行っています。 最近になって思ったのですが、普通、ヘッダファイルに記述する内容は、 ・関数のプロトタイプ ・クラスのメンバ関数を除いた部分(いわゆる「クラスの骨格」) ・マクロ といったものだと言われています。 そして、関数の実態やクラスのメンバ関数などは、 別のソースファイルに記述するように言われています。 なぜ、ヘッダファイルに関数の実態や、クラスのメンバ関数を記述するべきではないでしょうか? あるいは、プログラムの内容に応じて、関数やクラスの内容を、 ヘッダファイルにまるごと記述してもよい場合と悪い場合があるのでしょうか? こういった事について、何か御存じの方がいらっしゃれば、是非アドバイスをお願い致します。 (難しい問題なので、なるべく詳しい説明を頂けると、大変助かります。) ちなみに、関数やクラスのメンバ関数も一緒に、クラスの内容をまるごとヘッダファイルに記述しても、 今までの所、全く問題なく動作しています。 例えば、以下のようなプログラムは、何の問題もなく動作します。 ●main.c ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "func.h" void main(void) { char str[80]; puts("文字列を入力せよ"); gets(str); func(str); } ____________________________________________________________ ●func.h ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void func(char *p) { puts("入力された内容は以下の通り。"); while(*p) putchar(*p++); } ____________________________________________________________