ユーザー定義関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
polpol

ユーザー定義関数について

#1

投稿記事 by polpol » 15年前

コードが簡単になるようにユーザー定義関数を使いたいのですが
うまくできません。
例えば以下のコードで↓
http://homepage2.nifty.com/natupaji/DxL ... re1_7.html
四角君の移動ルーチンを別のヘッダーファイルに書こうと思ったのですがエラー
になってしまいます。


/////////////////
↓kansuteigi.h


int sikaku() {
int SikakuX , SikakuY , SikakuMuki , SikakuGraph ;
int SikakuW , SikakuH , ShotW , ShotH ;
int SikakuDamageFlag , SikakuDamageCounter , SikakuDamageGraph ;

// 四角君が顔を歪めているかどうかの変数に『歪めていない』を表す0を代入
SikakuDamageFlag = 0 ;
// 四角君の移動方向をセット
SikakuMuki = 1 ;
SikakuX = 0 ; SikakuY = 50 ;

// 四角君の移動ルーチン
{
// 顔を歪めているかどうかで処理を分岐
if( SikakuDamageFlag == 1 )
{
// 顔を歪めている場合はダメージ時のグラフィックを描画する
DrawGraph( SikakuX , SikakuY , SikakuDamageGraph , TRUE ) ;

// 顔を歪めている時間を測るカウンターに1を加算する
SikakuDamageCounter ++ ;

// もし顔を歪め初めて 30 フレーム経過していたら顔の歪んだ状態から
// 元に戻してあげる
if( SikakuDamageCounter == 30 )
{
// 『歪んでいない』を表す0を代入
SikakuDamageFlag = 0 ;
}
}
else
{
// 歪んでいない場合は今まで通りの処理

// 四角君の座標を移動している方向に移動する
if( SikakuMuki == 1 ) SikakuX += 3 ;
if( SikakuMuki == 0 ) SikakuX -= 3 ;

// 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( SikakuX > 576 )
{
SikakuX = 576 ;
SikakuMuki = 0 ;
}

// 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
if( SikakuX < 0 )
{
SikakuX = 0 ;
SikakuMuki = 1 ;
}

// 四角君を描画
DrawGraph( SikakuX , SikakuY , SikakuGraph , TRUE ) ;
}
}


return 0;
}

ookami

Re:ユーザー定義関数について

#2

投稿記事 by ookami » 15年前

.hファイルに関数の実体(中身)を書くのは、一般的ではありません。

まぁそれはさておき、
WinMain関数のある.cppファイルの先頭に、
#include "kansuteigi.h"
はありますか?

それでだめなら、いったん
int sikaku() {

}
をWinMain関数の上に移動して、

kansuteigi.hをプロジェクトから削除してビルドすると、同じエラーがでるかどうか確認してもらえますか?

polpol

Re:ユーザー定義関数について

#3

投稿記事 by polpol » 15年前

回答ありがとうございます。
#include "kansuteigi.h" ですが指定しましたがダメです。
上記の方法を試してもやはりエラーが出ました。

fatens

Re:ユーザー定義関数について

#4

投稿記事 by fatens » 15年前

具体的に、どのようなエラーが表示されますか?

polpol

Re:ユーザー定義関数について

#5

投稿記事 by polpol » 15年前

すいません。エラーと言うより
正常に起動はするのですが、四角君のグラフィックが表示されない状態です。。。
mymain.cppのほうではint kansuteigi.h()として呼び出しています

fatens

Re:ユーザー定義関数について

#6

投稿記事 by fatens » 15年前

>mymain.cppのほうではint kansuteigi.h()として呼び出しています

kansuteigi.hはヘッダファイルの名前です。
関数の呼び出し方は理解できていますか?

ookami

Re:ユーザー定義関数について

#7

投稿記事 by ookami » 15年前

何かアレですが、想像で書きますが、
whileループの中に、
sikaku();
と記述するとどうなりますか?

スキマ妖怪

Re:ユーザー定義関数について

#8

投稿記事 by スキマ妖怪 » 15年前

sikaku関数内の

SikakuGraph ;
SikakuDamageGraph ;

画像を読み込んでないので表示されないのは当たり前なのでは?

ぜらーちん

Re:ユーザー定義関数について

#9

投稿記事 by ぜらーちん » 15年前

int sikaku() {
int SikakuX , SikakuY , SikakuMuki , SikakuGraph ;
int SikakuW , SikakuH , ShotW , ShotH ;
int SikakuDamageFlag , SikakuDamageCounter , SikakuDamageGraph ;

// 四角君が顔を歪めているかどうかの変数に『歪めていない』を表す0を代入
SikakuDamageFlag = 0 ;
// 四角君の移動方向をセット
SikakuMuki = 1 ;
SikakuX = 0 ; SikakuY = 50 ;

この辺に画像読み込み関数入れればok

// 四角君の移動ルーチン
{
 中略
return 0;
 }


C++で複数ファイルで管理するなら、hにプロトタイプ宣言書いてcppにプログラム書いた方がいいと思うよ

あと気になったのは、コピペが変なのかな?
{}がおかしいと思うんだけど…、例えば↑に書いてる四角君の移動ルーチンの後にいきなり{が来てるけど
これはなに?(’’;

ドラ

Re:ユーザー定義関数について

#10

投稿記事 by ドラ » 15年前

赤字の所で安易に画像を読み込むと、sikaku() を呼び出すたびに画像を読み込んでしまって
「メモリ使用量がーーー!!!」ってなりがちですね。
SikakuGraph や SikakuDamageGraph はグローバル変数にして、WinMain関数で1回だけ
画像を読み込むというような感じにした方がいいと思います。

> 四角君の移動ルーチンの後にいきなり{が来てるけどこれはなに?(’’;
文の集合を1つの構文単位にまとめる「複合文」と呼ばれるものです。
複合文によって新しい有効範囲(ブロック)が発生しますが、今回のケースでは大した意味はなく、
四角君の移動ルーチンの範囲をくくっているだけです。

polpol

Re:ユーザー定義関数について

#11

投稿記事 by polpol » 15年前

返事遅れて申し訳ありません。。。
>kansuteigi.hはヘッダファイルの名前です。
>関数の呼び出し方は理解できていますか?

int sikakuでした。間違えました

>whileループの中に、sikuak();と記述するとどうなりますか?

そうですね。そのようにコードを書いてエラーが出ました。
>ぜらーちんさん
このように書いて実行すると'ShotH' : ローカル変数は 1 度も使われていません。というエラー
が出ます。

>スキマ妖怪さん、ドラさん
mymain.cppのほうでwinmain関数の外で
int SikakuGraph ;
SikakuGraph = LoadGraph( "Sikaku.png" ) ;
と記述し、kansuteigi.hの中で
int DrawGraph ;
DrawGraph( SikakuX , SikakuY , SikakuGraph , TRUE ) ;としても描画されません。。。

polpol

Re:ユーザー定義関数について

#12

投稿記事 by polpol » 15年前

とりあえずこれ以上質問するのも迷惑そうなんで
自分で考えてみます。。。
とりあえず解決ということで

ぜらーちん

Re:ユーザー定義関数について

#13

投稿記事 by ぜらーちん » 15年前

>>ドラさん
なるほど、{}だけというのは私にとっては滅多に見ない&使わないものだったので、
勉強になりました。

確かに、その位置を複数回呼び出してるのであればメモリがーになりますね。

---------------------------------------------------------------------------
解決済みになっていますが、取りあえず…

mainがどうなっているのか分からないのであれですが
表示したい画像をmainで読む込むだけじゃ、kansuteigi.hでは扱えないので引数として渡す必要がありますね。

良く見ていないのであれですが(マテ
今更思った事が・・・

mainのwhile(1)かfor(;;)あたりのどこかに
shikaku();ってのを呼び出して動かしているのだと思いますが
最初の
SikakuDamageFlag = 0 ;
  // 四角君の移動方向をセット
SikakuMuki = 1 ;
SikakuX = 0 ; SikakuY = 50 ;
この部分ですが、毎回呼び出されていると毎回同じ位置で固定されるような気がするのですが
気のせいかな?

shikaku()を呼び出す前に、四角くんの初期値を設定しておきそれを呼び出す時に渡して上げないとまずいような気も
引数多すぎダメぽってなった時にclassの出番なのですが、今回は使ってなさそうなので
練習ということでグローバル変数にしちゃえば、渡さなくて済みます(グローバル変数の多様はお勧めしない)

作り方としては、mainの上に int 変数名 初期値(なくてもok);で、どこでも使えます。
ヘッダーに書く場合は、これもお勧めしませんがexternを付ければ問題なしです。


練習段階なのでclassとかはまだ分からないのかな?
ゲーム制作で一番楽なのはclassを使うことだと思いますので、使えれば簡単だと思います。

解決済みになっているところを失礼しました。解決マーク付けて投稿しておきますね

スキマ妖怪

Re:ユーザー定義関数について

#14

投稿記事 by スキマ妖怪 » 15年前

自分の書き込み?か分かりませんが、
不快な思いをさせてしまったのならスイマセンm(_ _)m

> とりあえずこれ以上質問するのも迷惑そうなんで
> 自分で考えてみます。。。

別に迷惑と思ってません。
ここの掲示板の良い所はどんな質問にもレスがつくことだと思ってます。
だから気軽に質問してください。(…といいつつ自分は、普段見てるだけですが…;)


解決にされてしまったようですが、理解する手助けになれば
と思い書かせてもらいます。

簡単に言うと、以下のようになっているのが原因かと

#include <stdio.h>
void Func();

int main()
{
int test = 100;
Func();

return 0;
}

void Func()
{
int test;
printf( "%d\n", test );
}


変数には有効範囲があって、同じ変数名でも
別々に作られていれば別の変数として扱われます。
上の例では、mainとfunc関数内にあるtest変数は別物として
扱われるためprintf関数での表示する値は不定値になってしまいます。

polpolさんのコードでも同じ事になっているのではないでしょうか?
(解決法はぜらーちんさんが書かれているのでそちらを参照してください;)


変数のスコープ(有効範囲)等をお調べになるといいかもしれません

閉鎖

“C言語何でも質問掲示板” へ戻る