ページ 1 / 1
エラーの意味が分からない
Posted: 2011年9月01日(木) 22:53
by 最澄
早速、本題で悪いですがエラーの意味が分かりません
前にもここを使わせてもらったのですがもう一度使わせてください
コード:
typedef struct{
int x1;
int y1;
char *namae;
int handoru;
}kyara1;
kyara1 kyara
このような構造体があって
このように関数を呼び出しました
コード:
void syujinkou(kyara1 *kyara){
int flag=1;
if( flag == 1 ){
if( CheckHitKey( KEY_INPUT_UP) == 1 ) kyara->y1--;
if( CheckHitKey( KEY_INPUT_DOWN) == 1 ) kyara->y1++;
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) kyara->x1++;
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) kyara->x1--;
};
}
それがこの関数なのですが
syujinkou()呼び出しに余分なパラメータがあると言われるのです
さっぱり意味が分かりませんので どなたか教えていただけませんか?
Re: エラーの意味が分からない
Posted: 2011年9月01日(木) 23:26
by Ciel
エラーメッセージをそのまま貼ってくれたらわかるかもしれません。
Re: エラーの意味が分からない
Posted: 2011年9月01日(木) 23:32
by 最澄
え?エラーメッセージなら先ほど記述したものですが
エラー E2227 D:\TEST3\gazou.cpp 19: syujinkou() の呼び出しに余分なパラメータがある(関数 byouga() )
↑このような感じです 分かりますでしょうか?
Re: エラーの意味が分からない
Posted: 2011年9月01日(木) 23:47
by softya(ソフト屋)
gazou.cpp 19
と言うのがsyujinkou(&kyara);
の事でしょうか?
ここに書かれていないsyujinkou()関数のプロトタイプ宣言はどうなっていますか?
あと開発環境も書いてもらえると助かります。たぶん、bcc?
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 00:06
by 最澄
プロトタイプ宣言はvoid syujinkou();となっています
もしかしてvoid syujinkou(&kyara);と書くのが正解なのでしょうか?
でも、これだと
'syujinkou' のサイズが不明、あるいはゼロ
未定義のシンボル kyara
関数でないものを呼び出している(関数 byouga() )
と言われてしまいますし…
環境はbccで間違いないです
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 00:07
by Ciel
softyaさんのおっしゃるとおり、
プロトタイプ宣言が怪しいです。
それを貼ってくれたらたぶん分かります。
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 00:08
by Ciel
プロトタイプ宣言を
void syujinkou(kyara1*);
にして下さい。
kyara1型のポインタを渡すのでこうなります。
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 00:09
by softya(ソフト屋)
大事なのは型なので
void syujinkou(kyara1*);
が正解です。
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 00:12
by box
プロトタイプ宣言を書くときは、
最澄 さんが書きました:
コード:
void syujinkou(kyara1 *kyara){
上記の関数定義先頭部分の { を ; に置き換えればすみます。
コード:
void syujinkou(kyara1 *kyara);
てな具合に。
ほとんど機械的な操作でできて、簡単ですよね?
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 22:31
by 最澄
本当に何度もすいません
void syujinkou(kyara1*);
このように書くと
コード:
エラー E2034 D:\TEST3\gazou.cpp 18: 'kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない(関数 byouga() )
エラー E2340 D:\TEST3\gazou.cpp 18: 1 番目のパラメータは kyara1 * 型として定義されているので kyara1 ( *)[2] 型は渡せない(関数 byouga() )
このように言われてしまいます
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 22:37
by softya(ソフト屋)
今まで書いてあることと実際のプログラムが違っていませんか?
どうみてもkyara1型の配列を使ってますよね?
Re: エラーの意味が分からない
Posted: 2011年9月02日(金) 23:17
by box
最澄 さんが書きました:
コード:
エラー E2034 D:\TEST3\gazou.cpp 18: 'kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない(関数 byouga() )
エラー E2340 D:\TEST3\gazou.cpp 18: 1 番目のパラメータは kyara1 * 型として定義されているので kyara1 ( *)[2] 型は渡せない(関数 byouga() )
このように言われてしまいます
そのエラーメッセージが出てしまうソースコード全体を見せてください。
そうすれば、
「どんなソースコードでどんなエラーメッセージが出ているか」が一発でわかるんですけどね。
エラーメッセージという「結果だけを」見せられても、正確なことは何一つわかりません。
Re: エラーの意味が分からない
Posted: 2011年9月03日(土) 08:30
by Ciel
構造体の定義が間違っているか、byouga関数に渡す時の渡し方がおかしいんでしょうね。
とりあえずソース貼って下さい。
Re: エラーの意味が分からない
Posted: 2011年9月03日(土) 09:14
by wing
kyara1 kyara
は
kyara1 kyara ;
ではないでしょうか。
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 03:31
by 最澄
申し訳ないです
途中で主人公の画像だけを渡せればいいんだと気づき、
配列だったのを忘れていました・・・ 画像のソートを簡単にするためにそうしています
この場合は呼び出し部分を(&kyara[1])と記入すればいいのでしょうか?
少し質問が変わってしまったうえ、度重なる質問はんせいしています
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 05:31
by box
たびかさなるお願いで申し訳ありませんが、当該のソースコード全体を
見せていただくことはできないでしょうか。
情報を小出しにされますと、正確なことがひじょうにわかりづらいのです。
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 22:27
by 最澄
謝らせてしまって申し訳ないです
ソースコードを提示してくださいという返信に気づきもしないで・・・
コード:
//kyara.hです
typedef struct{
int x1;
int y1;
char *namae;
int handoru;
}kyara1;
コード:
#include "Dxlib.h"
#include "kyara.h"
void syujinkou(kyara1*);
void byouga(){
kyara1 kyara[2]={
{0,0,"jimen.png"},
{0,0,"kyara.png"}
};
for(int i=0; i<2 ; i++){
kyara[i].handoru=LoadGraph(kyara[i].namae);
DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);
syujinkou(&kyara[1]);
};
}
コード:
#include "DxLib.h"
#include "kyara.h"
void syujinkou(kyara1 *kyara){
int flag=1;
if( flag == 1 ){
if( CheckHitKey( KEY_INPUT_UP) == 1 ) kyara->y1--;
if( CheckHitKey( KEY_INPUT_DOWN) == 1 ) kyara->y1++;
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) kyara->x1++;
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) kyara->x1--;
};
}
こんな感じです
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 22:36
by softya(ソフト屋)
コード:
for(int i=0; i<2 ; i++){
kyara[i].handoru=LoadGraph(kyara[i].namae);
DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);
syujinkou(&kyara[1]);
}
インデント(字下げ)は正確にしてくださいね。バグの原因ですし、解析を難しくします。
このコードだと、forループ中にsyujinkou(&kyara[1]);が2回呼び出されますので倍動くことになりますよ。
あと相変わらずロードと表示がセットなんですね。メモリがリークしているので長時間動かすとハングしますよ。
それと
DrawGraph(kyara
.x1,kyara.y1,kyara.handoru,TRUE);
と
syujinkou(&kyara[1]);
は順番が逆にしたほうが良いでしょう。
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 22:49
by box
9月4日22:27に投稿されたソースコードをコンパイルすると、
9月2日22:31に投稿されたエラーメッセージが出る、ということでしょうか?
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 22:59
by 最澄
ソフト屋さん
助言ありがとうございます
リークでハングとはどういう意味なのでしょう
for文のことなども見落としていました
boxさん
いえ、このコードだとコンパイルが通りました
値の渡し方はこれで良いのか伺いたいのです
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 23:04
by box
最澄 さんが書きました:
いえ、このコードだとコンパイルが通りました
ですよね。ぱっと見、コンパイルエラーが出そうには思えなかったので、ああいう風にお聞きしました。
最澄 さんが書きました:
値の渡し方はこれで良いのか伺いたいのです
コンパイルが通ったということは、少なくとも文法上の間違いはない、ということです。
仕様どおりに実行するかどうかは、別の話ですけれど。
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 23:17
by 最澄
〉〉boxさん
もしかして仕様通りに実行されるかというのは、このことですよね↓
初期位置から画像が動かないのですが
構造体のxとyをstaticにすればいいのでしょうか?
それだと初期化子が多すぎると言われるので違う気がするのですが
最後にしますのでお教えください
Re: エラーの意味が分からない
Posted: 2011年9月04日(日) 23:44
by softya(ソフト屋)
最澄 さんが書きました:リークでハングとはどういう意味なのでしょう
LoadGraphで画像を読み込んで破棄していませんので、同じ所を通る度に前の画像をメモリに残したまま新しい画像をロードしています。
つまりメモリにどんどん残っていきます。こういう管理されずに残っていくメモリの状態ことをリークするといいます。
最澄 さんが書きました:初期位置から画像が動かないのですが
構造体のxとyをstaticにすればいいのでしょうか?
それだと初期化子が多すぎると言われるので違う気がするのですが
この構造体定義は、
コード:
kyara1 kyara[2]={
{0,0,"jimen.png"},
{0,0,"kyara.png"}
};
実体の動的初期化なので、毎回同じ座標に初期化されます。
コード:
static kyara1 kyara[2]={
{0,0,"jimen.png"},
{0,0,"kyara.png"}
};
とすれば大丈夫ですが、こういうのを関数内に書くこと自体珍しいでしょうね。普通は関数外に定義します。
ちなみに構造体のメンバにstaticは出来ませんよ。
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 21:32
by 最澄
ありがとうございました 解決できました
この先、役に立つかもしれないので知っておきたいのですが
構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
for文を使って(&kyara)で数値を増やしていけばいいのかと思いましたがなんか違いますよね
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 21:37
by softya(ソフト屋)
最澄 さんが書きました:この先、役に立つかもしれないので知っておきたいのですが
構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
for文を使って(&kyara)で数値を増やしていけばいいのかと思いましたがなんか違いますよね
関数はこう宣言して
void syujinkou(kyara1 kyara[])
呼び出す時は、
syujinkou(kyara);
こう書くのが一番わかり易いです。
【追記】
実は、
void syujinkou(kyara1 *kyara)
このままでもsyujinkou(kyara);で呼び出せば配列として扱うことは出来るんですけどね。
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 21:38
by box
最澄 さんが書きました:
構造体配列を全てポインタで渡すにはどのような書き方をすればいいのでしょうか?
構造体ではない配列の場合と全く同じです。
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 22:35
by 最澄
〉〉boxさん
配列でのやり方が分からなかったのでお聞きしました 分かりにくかったですよね
〉〉ソフト屋さん
実は追記に書かれているやり方を試した時に
kyara1 ( *)[2]' 型は 'kyara1 *' 型に変換できない
と言われたのでこのような質問をさせていただきました これは一体?
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 22:49
by softya(ソフト屋)
syujinkou(&kyara);
って書きませんでしたか?
こう書いたらエラーです。
[追記]
最初に提示されたのはkyaraが配列ではない方法でしたよね?
その場合は
syujinkou(&kyara);
と渡す必要がありますが、kyaraが配列の場合は
syujinkou(&kyara);
と書くと間違いです。
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 23:14
by 最澄
コード:
#include "Dxlib.h"
#include "kyara.h"
void syujinkou(kyara1*);
void byouga(kyara1[]);
void yomikomi(){
static kyara1 kyara[2]={
{0,0,"sibahu.png"},
{0,0,"syujinkou.png"}
};
for(int i=0; i<2 ; i++){
kyara[i].handoru=LoadGraph(kyara[i].namae);
};
byouga(kyara);
}
void byouga(kyara1 kyara[]){
for(int i=0; i<2 ; i++){
DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);
};
syujinkou(&kyara[1]);
}
Error: 外部シンボル 'byouga()' が未解決(D:\TEST3\DEBUG\MAIN.OBJ が参照)
リンクエラーだそうですが今いじったところと関係ありますか?
Re: エラーの意味が分からない
Posted: 2011年9月07日(水) 23:22
by box
最澄 さんが書きました:コード:
void byouga(kyara1[]);
このプロトタイプ宣言だとコンパイルが通らないような気がするのですが…。
私が9月2日の00:12に投稿した、プロトタイプ宣言の簡単な書き方が参考になりますでしょうか。
【追記】
失礼しました。コンパイル時には警告が出るだけですね。
リンクエラーは、また別の話ですね。
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 00:24
by softya(ソフト屋)
最澄 さんが書きました:Error: 外部シンボル 'byouga()' が未解決(D:\TEST3\DEBUG\MAIN.OBJ が参照)
リンクエラーだそうですが今いじったところと関係ありますか?
main.cppかにあるbyouga()関数の呼び出しが解決できませんと言うエラーです。
次の2点を確認してください。
・定義されている関数と呼び元でbyouga()の名前はちゃんと同じですか?
・byouga()の関数があるソースファイルは、ちゃんとコンパイルリンクされていますか?
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 21:50
by 最澄
思い当りません
bccを使っていて設定を変えたことはないのでコンパイルリンクはミスしていない気がしますが
原因があるとすればmainファイルですが
コード:
#include "DxLib.h"
void byouga();
void syujinkou();
void yomikomi();
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;
DxLib_Init();
yomikomi();
while(!ProcessMessage() && !ClearDrawScreen()){
byouga();
WaitTimer( 20 ) ;
}
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 22:10
by softya(ソフト屋)
前の書き込みだと引数が有ることになってますね。
void byouga(kyara1[]);
main側だとありません。
void byouga();
2種類あるんですか?
C++的には可能ですが別関数として扱われます。
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 22:27
by 最澄
いえ、byouga(kyara1[]);とプロトタイプ宣言すると
引数宣言は 'kyara1' で始められない 呼び出し時のパラメータが足りない
と言われます
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 22:32
by box
ちょっと交通整理しましょうか。
byouga
という関数の、
・プロトタイプ宣言
・ソースコード全体
・呼び出している部分のソース
を開示してください。もし複数あるのならば、全部を。
Re: エラーの意味が分からない
Posted: 2011年9月08日(木) 22:47
by softya(ソフト屋)
情報が断片的すぎて、推測でしか話ができませんね。
そして、いつも推測外の話が出てきます。
ちゃんと問題の出るソースコードを提示してもらえば、こんな何度もやり取りしなくても解決しますのでソースコードを提示してもらえませんか?
最澄 さんが書きました:いえ、byouga(kyara1[]);とプロトタイプ宣言すると
引数宣言は 'kyara1' で始められない 呼び出し時のパラメータが足りない
と言われます
それは引数のある関数に引数を与えずに呼びだそうとするから出るエラーです。
byouga()関数に引数が欲しいんでしょうか?欲しくないんでしょうか?
最澄さんが決めるべきことなんですが・・・。
Re: エラーの意味が分からない
Posted: 2011年9月09日(金) 19:53
by 最澄
コード:
#include "DxLib.h"
#include "kyara.h"
void byouga(kyara1[]);
void syujinkou(kyara1*);
void yomikomi();
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;
DxLib_Init();
yomikomi();
while(!ProcessMessage() && !ClearDrawScreen()){
byouga();
WaitTimer( 20 ) ;
}
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
コード:
#include "Dxlib.h"
#include "kyara.h"
void syujinkou(kyara1*);
void byouga(kyara1[]);
void yomikomi();
int yomikomi(){
static kyara1 kyara[2]={
{0,0,"sibahu.png"},
{0,0,"syujinkou.png"}
};
for(int i=0; i<2 ; i++){
kyara[i].handoru=LoadGraph(kyara[i].namae);
};
}
void byouga(kyara1 kyara[]){
for(int i=0; i<2 ; i++){
DrawGraph(kyara[i].x1,kyara[i].y1,kyara[i].handoru,TRUE);
};
syujinkou(&kyara[1]);
}
今まではったものをまとめただけですがこんな感じです
byouga関数に引数はほしくありません
yomikomi関数から値を渡すときに必要なだけでmain関数で呼び出すときに引数は要りません
Re: エラーの意味が分からない
Posted: 2011年9月09日(金) 21:56
by box
最澄 さんが書きました:
byouga関数に引数はほしくありません
yomikomi関数から値を渡すときに必要なだけでmain関数で呼び出すときに引数は要りません
そういうことであれば、どの関数からでもいつでもアクセスできるよう、
外部変数にするとよいのではないかと思います。
Re: エラーの意味が分からない
Posted: 2011年9月10日(土) 00:34
by softya(ソフト屋)
問題点と注意点があります。
(1)情報の寿命の理解が不十分です。
ローカル変数を別関数に渡すのは一時的なものに過ぎませんので、渡した瞬間のみしか意味がありません。
なので、yomikomi()からbyouga()へkyara引数の呼び出しの瞬間しか意味を持ちません。
mainからbyouga()を呼び出すためには、この情報(kyara)はyomikomi()からもbyouga()からもタイミング関係なしに参照可能である必要があります。
(2)変数のスコープに関しての理解が不十分です。
コード:
static kyara1 kyara[2]={
{0,0,"sibahu.png"},
{0,0,"syujinkou.png"}
};
これはローカル変数ではなく、関数外に出すことでファイルスコープ(ファイル内参照可能な変数)となります。
これでyomikomi()とbyouga()の両方から参照可能になります。
(3)関数は機能以外の事をしてはならない。
byouga()内からsyujinkou(&kyara[1]);を呼びだしていますが、描画関数と定めた以上は移動処理など他のことしてはいけません。
これは、はかの人には動作の誤解と自分自身の齟齬を生む原因となります。
移動処理の関数を追加してください。
(4)描画処理は最後でなくてはならない。
syujinkou(&kyara[1]);
を最後に呼びだしていますが描画は最後に行ってください。
描画後に移動するとか、移動と描画が交互に来るとかすると画面上の表示と実際の内部の状態が食い違ってややこしいことになります。
(5)外部関数のプロトタイプ宣言はヘッダに書きましょう。
void byouga(kyara1[]);
void syujinkou(kyara1*);
void yomikomi();
この場合は、kyara.hですね。
何処のソースファイルに属するか明確になるので一般的な方法です。
ここらへんのヒントになる情報は、Dixq(管理人)さんの
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
に詳しく書かれています。
d.1 メイン関数の作り方
d.2 複数のファイルにわけてコンパイルする
d.3 ゲームの設計と分割コンパイル(1)
d.4 ゲームの設計と分割コンパイル(2)
d.5 ゲームの設計と分割コンパイル(3)
はじっくりと読んでくださいね。
Re: エラーの意味が分からない
Posted: 2011年9月10日(土) 13:35
by 最澄
ありがとうございます
最後にしますので聞いてください
私は構造体を次々と作っていったらメモリ食うのかな~と勝手に決めつけて
一々、構造体を書き換えて使おうとしているので関数内に書いてみたのですが
構造体は次から次へと作ってもいいのでしょうか?
Re: エラーの意味が分からない
Posted: 2011年9月10日(土) 16:11
by softya(ソフト屋)
最澄 さんが書きました:ありがとうございます
最後にしますので聞いてください
私は構造体を次々と作っていったらメモリ食うのかな~と勝手に決めつけて
一々、構造体を書き換えて使おうとしているので関数内に書いてみたのですが
構造体は次から次へと作ってもいいのでしょうか?
そのメモリ節約は8bit時代の発想です。
1つの構造体配列が1KBを食うこともまず無いはずですの100個有ろうと微々たるものです。sizeof()関数で実際に消費しているサイズを確認してみてください。
無駄な手間と言うより、無駄なバグ源を内包するだけです。
バグを出さないプログラム基本技法は、関数や変数に複数の意味・機能を持たせないことですので。
動的に画像イメージを管理することは画像だけで500MBとか消費するなら考えなくては行けないことですが、構造体配列の管理と同等に語るべきではありません。
あと最後にしないほうが良いと思いますよ。
今の段階で、理解できていると思えないので理解できるまで徹底的にやるべきだと思います。
Re: エラーの意味が分からない
Posted: 2011年9月10日(土) 16:37
by 初級者
softyaさんが仰っているとおり、最後にするという縛りを設けなくてよいと思います。
疑問が解決するまで、こういう場を目一杯使いましょう。
私がどれだけお役に立つことができるかはわかりませんけれど。
Re: エラーの意味が分からない
Posted: 2011年9月10日(土) 18:20
by ISLe
関数の外で宣言した構造体変数でも書き換えて使うことはできるわけですが。
問題なのは「メモリを食わないように」って発想じゃなくて「関数内で宣言するとメモリを食わない」って発想じゃないですかね。
何が次から次へ作られるのか意味不明ですし。
Re: エラーの意味が分からない
Posted: 2011年9月11日(日) 21:57
by 最澄
プログラミングの館のゲームの設計の項目では
main関数のソースファイルで構造体(キャラの座標と画像名)を
定義しているので真似したほうがいいでしょうか?
そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし
そして、画像読込をした後に引数で描画関数に渡していたことについてなのですが
handoru=yomikomi()という書き方をしてreturnで読み込ませるというやり方でいいでしょうか?
これしか、ちょっと思いつかないです
Re: エラーの意味が分からない
Posted: 2011年9月11日(日) 22:54
by softya(ソフト屋)
最澄 さんが書きました:プログラミングの館のゲームの設計の項目では
main関数のソースファイルで構造体(キャラの座標と画像名)を
定義しているので真似したほうがいいでしょうか?
そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし
「新ゲームプログラミングの館」では、そんな風には書かれていないはずですが?
d.1 メイン関数の作り方
http://dixq.net/g/d_01.html
d.2 複数のファイルにわけてコンパイルする
http://dixq.net/g/d_02.html
d.3 ゲームの設計と分割コンパイル(1)
http://dixq.net/g/d_03.html
d.4 ゲームの設計と分割コンパイル(2)
http://dixq.net/g/d_04.html
d.5 ゲームの設計と分割コンパイル(3)
http://dixq.net/g/d_05.html
確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。
>そうすればbyouga関数からsyujinkouを呼び出す必要もありませんし
その考え方は時系列的に無理なので諦めてください。
最澄 さんが書きました:
そして、画像読込をした後に引数で描画関数に渡していたことについてなのですが
handoru=yomikomi()という書き方をしてreturnで読み込ませるというやり方でいいでしょうか?
これしか、ちょっと思いつかないです
構造体をポインタで渡せば、構造体に値を入れて戻すことが出来ますのでそれを使います。
d.5 ゲームの設計と分割コンパイル(3)
http://dixq.net/g/d_05.html
で解説されている内容ですね。
【追記】
どういうC言語の入門書を読まれたのか分かりませんが、構造体とポインタをちゃんと勉強されたほうが良いと思います。
「C言語入門 11.構造体」
http://c-production.com/contents/c/sec11.html
「C言語編 第33章 構造体」
http://www.geocities.jp/ky_webid/c/033.html
Re: エラーの意味が分からない
Posted: 2011年9月11日(日) 23:39
by 最澄
身内の使っていたC言語で遊んでいるうちに覚えてきたガキですが
やっぱり入門書を買ったほうが良いですよね そうします
softya(ソフト屋) さんが書きました:確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。
構造体の定義という言い方は正確ではなかったですね
構造体の実体を宣言(?)といいますか・・・「Player_t Player1, Player2;」と書かれている部分は
winmainの場所ですよね
ですからmain関数の中に構造体の実体を宣言するということでいいんでしょうか?
Re: エラーの意味が分からない
Posted: 2011年9月12日(月) 00:02
by softya(ソフト屋)
最澄 さんが書きました:身内の使っていたC言語で遊んでいるうちに覚えてきたガキですが
やっぱり入門書を買ったほうが良いですよね そうします
知識がしっかりしているなら良いのですが、怪しい所が沢山ありますので入門書は買われたほうが良いと思いますが、復習と知識不足の部分を補うのに、苦Cなどのサイトを使う手もあります。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
初歩の部分はここで済まして、実践的な書籍を買うって手段ですね。
このあたりは今の状況を見るとチェックしておいた方が良いでしょう。
「Amazon.co.jp: 明解C言語によるアルゴリズムとデータ構造: 柴田 望洋, 辻 亮介: 本」
「Amazon.co.jp: 詳解C言語 ポインタ完全攻略: 柴田 望洋: 本」
最澄 さんが書きました:
softya(ソフト屋) さんが書きました:確かに構造体はWinMainにありますが、キャラの座標と画像名はplayer.cpp側で設定しています。
構造体の定義という言い方は正確ではなかったですね
構造体の実体を宣言(?)といいますか・・・「Player_t Player1, Player2;」と書かれている部分は
winmainの場所ですよね
ですからmain関数の中に構造体の実体を宣言するということでいいんでしょうか?
ケースバイケースですので、それもひとつの方法ですねとしか言えません。
Playerなど固定数で引数での受け渡し要素が少ない構造体なら悪い方法ではないですが、引数がやたら増えてくるのなら避けたほうが良い選択肢です。
それにすべての構造体をWinMainで定義できるかというと疑問です。
例えば、ファイルから読み込むような可変個数の敵の発生情報の構造体をWinMainで持つのが良いかと聞かれたら避けるべきと答えますね。WinMainにある意味が無いし、個数が可変するので受け渡す情報が増えて逆に不便になります。必要なものを必要な所に最小限が関数分けのポイントです。