
ヘッダファイルを作って、そこに構造体を送りたいのですが、
「引数宣言は 'data' で始められない」というエラーがヘッダファイル側で起きてしまいます。
main()で作ったからいけないのでしょうか?
分かる方教えていただけませんか?
#include<stdio.h>
#include "Max_Score.h"
/*構造体の宣言*/
typedef struct data{
・・・・・;
}DATA;
void main(){
DATA data[50];
・・・・・・・・;
Max_Score(data);
}
/*Max_Score()側*/
void Max_Score(data *p){
・・・・・;
}
No.9ベストアンサー
- 回答日時:
>「"C:\borland\成績管理システム\分割コンパイルサンプル\System-menu.exe" のタイムスタンプは変化していません」
ソースを修正してもコンパイル・リンクしてくれないという意味でしょうか?
ソースを修正していない場合は、makefileはファイルの再作成を抑止しますので正常な動作です。
もしソースを修正してもコンパイルされない場合は、makefileの記述を間違っています。
例えば、
SYSTEM-MENU.obj : SYSTEM-MENU.c SYSTEM-MENU.h
bcc32 -c SYSTEM-MENU.c
だった場合に、「SYSTEM-MENU.c SYSTEM-MENU.h」だけではなく自分で作成してincludeしているヘッダを全て記述しないと行けません。
正しくは、
SYSTEM-MENU.obj : SYSTEM-MENU.c SYSTEM-MENU.h Max_Score.h
bcc32 -c SYSTEM-MENU.c
と書く必要があります。
こういう問題だと推測されますがどうでしょう?
No.10
- 回答日時:
★アドバイス
>「"C:\borland\成績管理システム\分割コンパイルサンプル\System-menu.exe"
>のタイムスタンプは変化していません」
>と出て実行できなくなりました・・・。
↑
それならすべての OBJ ファイルを削除してから再コンパイルしてみてはどうでしょう。
あと既にできている EXE ファイルも削除しておきます。
・CPad は使ったことがありませんが、そのソフトで必要なソースとヘッダファイルを
ちゃんとコンパイルできるように設定して下さい。→『makefile』タブなどで。
・以上。
No.8
- 回答日時:
回答者 No.4です。
そのエラーは、コンパイルに成功しリンクに失敗した場合に出ます。
この場合、SYSTEM-MENU.cとMax_Score関数を含むソースがリンクに失敗しています。
ちゃんとmakefileを記述されましたか?
CPadでの分割コンパイル/makeの方法がこちらに書かれています。
http://hp.vector.co.jp/authors/VA017148/pages/ma …
bccは使ったことが無いため、提供された情報だけではコマンドプロンプトから動いた理由は分かりません。
リンクに失敗しているので動くはずありませんが、もし実行ファイルが作られていて動いたとしてもMax_Score関数が呼び出された時には異常終了すると思います。
この回答への補足
再び回答ありがとうございます。
エラーについて調べてみたら、ご指摘の通りリンクに失敗しているようです。
そこで、makefileを作ってbccで実行してみたところ、一度は実行できたんですが、一度閉じてもう一回開いて実行してみると、
「"C:\borland\成績管理システム\分割コンパイルサンプル\System-menu.exe" のタイムスタンプは変化していません」
と出て実行できなくなりました・・・。
No.7
- 回答日時:
恐らくこういうことかと。
#include "Max_Score.h"
とすると、コンパイル時にコンパイラが自動的にヘッダの中身全てをこの位置に
コピペしてからコンパイルするようなイメージになります。
"Max_Score.h"
の中で構造体 data (他の方の指摘通り、これは間違い)とか、DATAとかstruct dataとか
使おうと思っても、それが定義されているのはそれより下、つまり未定義のまま使おうと
していることになり、うまく行きません。
やはり構造体の定義はヘッダーに、しかも使用するところよりも上に書くのがベストです。
ちなみに、良くないコードなので推奨はできませんが、main()側の構造体の定義を
struct data{
・・・・・;
};
に留めてtypedefをしないでおいて、ヘッダ側でDATAを使うより上で
typedef struct data DATA;
のようにtypedefを行なえば、実は問題なく使えたりするんじゃないでしょうか。
(型としてはdataではなくDATAと直すことを前提として)
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;
}
------------------------------
以上。
この回答への補足
御回答ありがとうございます。
アドバイス通り、ヘッダファイルで構造体宣言と、関数のプロトタイプ宣言をするよう書き直しました。
現在bcpadを使って組んでいるのですが、
「Error: 外部シンボル '_Max_Score' が未解決(C:\BORLAND\成績管理システム\SYSTEM-MENU.OBJ が参照)」
と出て、F9(make&実行)や、F8(コンパイル&実行)が、出来ませんでした。しかし、コマンドプロンプトからは実行されました。
このエラーはどういった意味なんでしょうか?
No.5
- 回答日時:
>残念ながらダメでした・・・。
どうダメだったのですか?
今回定義した構造体の型はお分かりですか?
typedef struct data{
・・・・・;
}DATA;
つまり、struct data型という型とその別名
DATA型がここでは定義されています。dataなんて型は
存在していない分けです。
>型の表記が間違っている、ヘッダファイルでプロトタイプの宣言を
>行っているとしたら、そちらも修正する必要がある
まず、宣言と定義の違いはお分かりですか?
例えば今回の構造体を関数の『宣言』と『定義』で使用している場合、
int sub( data* dat );//ここと
int sub( data* dat ) //ここ
{
return 0;
}
↓
int sub( struct data* dat );//もしくはDATAにする
int sub( struct data* dat ) //
{
return 0;
}
としなければいけないということです。
No.4
- 回答日時:
宣言のある場所が混乱していると思いますので、整理して書きます。
[mamn.c]
#include<stdio.h>
#include "Max_Score.h"
void main(){
DATA data[50];
・・・・・・・・;
Max_Score(data);
}
[Max_Score.h]
/*構造体の宣言*/
typedef struct data{
・・・・・;
}DATA;←ここでDATAという型が宣言されています。
/*関数のプロトタイプ*/
void Max_Score(DATA *p);←ここでDATA型を使います。
[Max_Score.c]
#include<stdio.h>
#include "Max_Score.h"
/*実際に呼び出される関数*/
void Max_Score(DATA *p){←ここでDATA型を使います。
・・・・・;
}
ヘッダファイルには、構造体の宣言や関数のプロトタイプを書きます。
ヘッダファイルに構造体宣言した場合は、Cソース側に構造体宣言を書く必要はありません。
No.3
- 回答日時:
#include<stdio.h>
#include "Max_Score.h"
/*構造体の宣言*/
typedef struct data{
・・・・・;
}DATA;
void main(){
DATA data[50];
・・・・・・・・;
Max_Score(data);
}
/*Max_Score()側*/
void Max_Score(data *p){ ← 型の表記が間違っている、ヘッダファイルで
プロトタイプの宣言を行っているとしたら
そちらも修正する必要がある。
・・・・・;
}
この回答への補足
回答ありがとうございます。
お聞きしたいのですが、
「型の表記が間違っている、ヘッダファイルでプロトタイプの宣言を行っているとしたら、そちらも修正する必要がある。」
とは、どういうことでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# C言語 3 2022/11/09 13:27
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAではRound...
-
” OS ビルド ” の意味が分か...
-
セミコロンについて
-
VBAを何回も作り直して、容量が...
-
「fatal error C1189」を回避す...
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
windowsでLinuxで作成したソー...
-
MO, PO, POT, ファイルの開き方...
-
RPGでプログラムからソースファ...
-
GNU COMMON LISP
-
[c++] <pthread.h>がinclude で...
-
C++コンパイル時に『 C1083: in...
-
C++のhppファイルをCでinclude
-
ExcelVBAで『ByRef 引数の型が...
-
VB6とInputManソフトの関係
-
Makefile作成時の拡張子.oとは?
-
定数式とはどういう意味でしょ...
-
構造体をファイルに出力できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
外部シンボル "_main"は未解決です
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
クリティカルエラー Expressio...
-
【VC++6.0(MFC)】警告「LINK : ...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
複数のサブディレクトリを一緒...
-
C言語のコンパイルができません
-
PRO*C コンパイルエラー
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルエラー:ユーザ定義...
-
プリコンパイルエラーについて
おすすめ情報