アプリ版:「スタンプのみでお礼する」機能のリリースについて

ヘッダファイルを作って、そこに構造体を送りたいのですが、
「引数宣言は '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){
・・・・・;
}

A 回答 (10件)

>「"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
と書く必要があります。
こういう問題だと推測されますがどうでしょう?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

修正点を探したところ、ソースに誤りがありました。
無事解決しました。ありがとうございました。

お礼日時:2007/07/18 09:51

★アドバイス


>「"C:\borland\成績管理システム\分割コンパイルサンプル\System-menu.exe"
>のタイムスタンプは変化していません」
>と出て実行できなくなりました・・・。
 ↑
 それならすべての OBJ ファイルを削除してから再コンパイルしてみてはどうでしょう。
 あと既にできている EXE ファイルも削除しておきます。
・CPad は使ったことがありませんが、そのソフトで必要なソースとヘッダファイルを
 ちゃんとコンパイルできるように設定して下さい。→『makefile』タブなどで。
・以上。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

修正点を探したところ、ソースに誤りがありました。
無事解決しました。ありがとうございました。

お礼日時:2007/07/18 09:51

回答者 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" のタイムスタンプは変化していません」
と出て実行できなくなりました・・・。

補足日時:2007/07/17 17:26
    • good
    • 0

恐らくこういうことかと。



#include "Max_Score.h"
とすると、コンパイル時にコンパイラが自動的にヘッダの中身全てをこの位置に
コピペしてからコンパイルするようなイメージになります。

"Max_Score.h"
の中で構造体 data (他の方の指摘通り、これは間違い)とか、DATAとかstruct dataとか
使おうと思っても、それが定義されているのはそれより下、つまり未定義のまま使おうと
していることになり、うまく行きません。

やはり構造体の定義はヘッダーに、しかも使用するところよりも上に書くのがベストです。


ちなみに、良くないコードなので推奨はできませんが、main()側の構造体の定義を

struct data{
・・・・・;
};

に留めてtypedefをしないでおいて、ヘッダ側でDATAを使うより上で
typedef struct data DATA;
のようにtypedefを行なえば、実は問題なく使えたりするんじゃないでしょうか。
(型としてはdataではなくDATAと直すことを前提として)
    • good
    • 0

★アドバイス


>ヘッダファイルを作って、そこに構造体を送りたいのですが、
 ↑
 これは構造体をヘッダファイルに記述したいということですか?
>「引数宣言は '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(コンパイル&実行)が、出来ませんでした。しかし、コマンドプロンプトからは実行されました。

このエラーはどういった意味なんでしょうか?

補足日時:2007/07/17 15:02
    • good
    • 0

>残念ながらダメでした・・・。


どうダメだったのですか?

今回定義した構造体の型はお分かりですか?
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;
}
としなければいけないということです。
    • good
    • 0

宣言のある場所が混乱していると思いますので、整理して書きます。



[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ソース側に構造体宣言を書く必要はありません。
    • good
    • 0

#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){  ← 型の表記が間違っている、ヘッダファイルで
              プロトタイプの宣言を行っているとしたら
              そちらも修正する必要がある。
・・・・・;
}

この回答への補足

回答ありがとうございます。

お聞きしたいのですが、
「型の表記が間違っている、ヘッダファイルでプロトタイプの宣言を行っているとしたら、そちらも修正する必要がある。」

とは、どういうことでしょうか?

補足日時:2007/07/13 14:13
    • good
    • 0

void Max_Score(struct data *p){



か、

void Max_Score(DATA *p){

ではどうでしょう?

この回答への補足

回答ありがとうございます。

残念ながらダメでした・・・。

補足日時:2007/07/13 13:57
    • good
    • 0

C++初心者です



void Max_Score(DATA *p){
・・・・・;
}

void Max_Score(struct data *p){
・・・・・;
}

でなければならないとかだったりしません?

この回答への補足

回答ありがとうございます。

残念ながらダメでした・・・。

補足日時:2007/07/13 13:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A