ページ 11

構造体が意味をなしていない…

Posted: 2018年8月15日(水) 00:21
by agunesu
<struct.h>
typedef struct{

int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
int img; //画像
int slow; //スローかどうか
double x, y; //座標

}ch_t;
<graph.h>

extern ch_t ch;

この文がエラーが発生します内容は【識別子"ch_t"が定義されていません】とでます。どうしたらいいかわかんないので返答をよろしくお願いします。<(_ _)>

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 12:35
by usao
あるファイルに(graph.hかな)に
ch_t って突然書いてみたら,
コンパイラに「ch_t ってのは何だよ? しらねーよ」と言われた,という感じですか.

> <struct.h>
というヘッダファイルを一体何のために書いたのか? どう使うつもりなのか?
というあたりを詳しく説明できませんか?

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 15:05
by Math
C言語初心者のかたとお見受けします。大体想像がつくのでお答えしますね。

"struct.h"は構造体の定義として私のすきな流儀でかいてありすね。タグは必要がなければ書かない方がいいと思います。

コード:

/* "struct.h" */
typedef struct{

int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
int img; //画像
int slow; //スローかどうか
double x, y; //座標

}ch_t;
"graph.h" は構造体変数の宣言で問題ないですね。

コード:

/* "graph.h" */

extern ch_t ch; 

さて問題となるgraph.c を書いてみます。テスト用に int grp(void)関数を作りました。

コード:

#include "struct.h"
#include "graph.h" 

int grp(void){
    ch.flag = 12345;
    return 0;
}

次にメインのプログラム c1.c をかきます。他のファイルでextern 宣言されている 構造体変数 chをグローバル宣言します。

コード:

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

ch_t ch; 
extern int grp(void);

int main(void)
{
    grp();
    printf("%d\n",ch.flag);
    return 0;
}
[code]

コンパイルは使い安いボーランドCの後継C++Builderを使いました。cx.bat バッチをダブルクリックするだけです。

cx.bat
[code]
bcc64 c1.c graph.c
dir *.exe
pause
c1.exe
pause
http://www2.koyoen.birdview.co.jp/~abcxyz/z0815a.png

#include ファイルはCの欠点でC#(C++++)では全く必要なくなりました。#include ファイルは覚えるのが大変ですよ。

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 15:18
by Math
CX-Builderのバッチファイル cx.bat をわすれてました。ボーランドCの後継で使い安いですね。
バッチファイルをダブルクリックするだけで起動します。

cx.bat

コード:

bcc64 c1.c graph.c
dir *.exe
pause
c1.exe
pause

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 15:43
by Math
CX-Builder はCommunity Ed. (64ビット版)ですが VS2017Community でコンパイルしてみると

cl.exe を使用します。

c.bat

コード:

rem コンパイル後リンク
cl c1.c graph.c
dir *.exe
pause

rem 実行結果
c1.exe
pause
'x64' モード
http://www2.koyoen.birdview.co.jp/~abcxyz/z0815b.png

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 15:56
by Math
#3 の c1.c  のなかに cx.bat の説明が混ざってました。
[訂正]
c1.c

コード:

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

ch_t ch; 
extern int grp(void);

int main(void)
{
    grp();
    printf("%d\n",ch.flag);
    return 0;
}

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 17:01
by Math
Windows Vista, VC++2008 でコンパイル/リンク してみました。
VS2017 Community と全く同じソース/ バッチファイルです。
(32ビット x86)

http://www2.koyoen.birdview.co.jp/~abcxyz/z0815c.png

Re: 構造体が意味をなしていない…

Posted: 2018年8月15日(水) 18:52
by agunesu
ありがとうございました。