C言語何でも質問掲示板

Total hit  今日  昨日  



必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   お助け下さい。   
     ・[41829] Mist 
     ・[41862] Korsakov 
     ・[41890] ゆたかちゃん 
   多項式   
     ・[41885] non 
     ・[418831258432709] ノブー 
   動作が停止してしまい ....   
     ・[41847] ドラ 
     ・[41850] まりも 
     ・[41860] ドラ 
     ・[41871] まりも 
     ・[41872] まりも 
   スペースの取り方   
     ・[41842] やっくん 
     ・[41849] 初心者 
     ・[41855] でんすけ 
     ・[41857] Dixq (管理人) 
     ・[41858] ぽこ 
     ・[41859] たかぎ 
     ・[41870] 初心者 
   「重い」コードになら ....   
     ・[41869] mats 
     ・[418681258863618] banba 
   どうすれば・・・   
     ・[41863] Korsakov 
   龍神録60章にて   
     ・[41626] Justy 
     ・[41630] はね 
     ・[41631] Justy 
     ・[41633] はね 
     ・[41653] はね 
     ・[41682] Justy 
     ・[41696] はね 
     ・[41743] Justy 
     ・[41836] はね 
     ・[41853] Justy 
     ・[41854] Dixq (管理人) 
   中ボスが逃げる方法   
     ・[41411] Dixq (管理人) 
     ・[41415] トゥル太郎 
     ・[41433] kai 
     ・[41507] kokoro 
     ・[41613] kai 
     ・[41615] pooka 
     ・[41632] kai 
     ・[41668] pooka 
     ・[41699] kai  
     ・[41838] kai 
   DirectMusicのメモリ読 ....   
   敵のプログラム   
     ・[41724] softya 
     ・[41822] 256bit 
     ・[41826] softya 
     ・[41827] 256bit 
   ポインタエラー   
     ・[41641] softya 
     ・[41642] ひよこ 
     ・[41644] softya 
     ・[41645] ひよこ 
     ・[41646] softya 
     ・[41647] ひよこ 
     ・[41648] softya 
     ・[41650] ひよこ 
     ・[41651] softya 
     ・[41652] ひよこ 
     ・[41666] softya 
     ・[41677] ひよこ 
     ・[41678] softya 
     ・[41681] ひよこ 
     ・[41683] softya 
     ・[41685] ひよこ 
     ・[41687] softya 
     ・[41689] ひよこ 
     ・[41692] ぽこ 
     ・[41693] Justy 
     ・[41694] softya 
     ・[41701] ひよこ 
     ・[41723] softya 
     ・[41725] ひよこ 
     ・[41727] softya 
     ・[41730] ひよこ 
     ・[41732] softya 
     ・[41735] ひよこ 
     ・[41739] softya 
     ・[41740] ひよこ 
     ・[41741] softya 
     ・[41748] ひよこ 
     ・[41750] ひよこ 
     ・[41753] softya 
     ・[41755] Justy 
     ・[41765] toyo 
     ・[41766] ひよこ 
     ・[41810] softya 
     ・[41818] ひよこ 
     ・[41823] softya 
     ・[41825] ひよこ 
   テトリスを作りたい   
     ・[41622] dic 
     ・[41627] softya 
     ・[41629] ちゃお 
     ・[41634] kazuoni 
     ・[41637] バグ 
     ・[41661] Naohiro19 
     ・[41824] きゃもり 
   ゲームパットを使うに ....   
     ・[41800] 御津凪 
     ・[41819] 御津凪 
     ・[41821] 電気屋 
     ・[417721258521239] 電気屋 
   スタックの実現   
     ・[41705] たかぎ 
     ・[41706] たかぎ 
     ・[41708] 初心者A 
     ・[41709] たかぎ 
     ・[41712] non 
     ・[41716] 初心者A 
     ・[41722] non 
     ・[41820] 初心者A 
   これって何を意味する ....   
     ・[41792] Naohiro19 
     ・[41793] ひよこ 
     ・[41797] toyo 
     ・[41809] ひよこ 
     ・[41814] toyo 
     ・[41817] ひよこ 
   8方向   
     ・[41812] TKOZ 
   教えてください。part ....   
     ・[41789] たかぎ 
     ・[41798] たかぎ 
     ・[41803] good!! 
   教えてください.part1   
     ・[41782] toyo 
     ・[41783] toyo 
     ・[41787] たかぎ 
     ・[41796] たかぎ 
     ・[41802] good!! 
   教えてください。part ....   
     ・[41788] たかぎ 
     ・[41801] good!! 
   詰んでしまった・・・ ....   
     ・[41799] toyo 
     ・[417941258592220] tiruving 
   エラーについて   
     ・[41734] オラウー 
     ・[41736] オラウー 
     ・[41737] オラウー 
     ・[41795] オラウー 
   教えてください。part ....   
     ・[41791] たかぎ 
   教えてください。part ....   
     ・[41790] たかぎ 
   数字の後のfとは   
     ・[41718] YuO 
     ・[41784] TERU 
   関数のプログラミング ....   
     ・[41764] gero 
     ・[41767] バグ 
     ・[41768] Dixq (管理人) 
     ・[41771] Naohiro19 
     ・[41773] toyo 
     ・[41775] softya 
   キャラクターから弾が ....   
     ・[41599] ひよこ 
     ・[41605] Marin 
     ・[41607] ひよこ 
     ・[41690] Marin 
     ・[41691] Marin 
     ・[41702] ひよこ 
     ・[41761] Marin 
     ・[41774] ひよこ 
   mqo ファイルと透明化   
     ・[41636] Ma 
     ・[41695] Ma 
     ・[41742] pp 
     ・[41744] Justy 
     ・[41754] Ma 
   【戦略シミュ】ユニッ ....   
     ・[41671] softya 
     ・[41673] たかぎ 
     ・[41675] yskey 
     ・[41676] yskey 
     ・[41679] softya 
     ・[41751] yskey 
   VC++で実行時のエラー   
     ・[41698] toyo 
     ・[41719] やっくん 
     ・[41721] YuO 
     ・[41749] やっくん 
   アイテムの点数を画面 ....   
     ・[41745] Justy 
   if文について   
     ・[41729] box 
     ・[41731] nanashi 
     ・[41738] box 
   単位に必要なんです!/ ....   
     ・[41654] non 
     ・[41655] kuroka 
     ・[41657] non 
     ・[41658] たかぎ 
     ・[41659] YuO 
     ・[41665] non 
     ・[41728] kuroka 
   BGMとSEを一括管理   
     ・[41710] kazuoni 
     ・[41711] Mikan 
   会話シーン2   
     ・[41465] kazuoni 
     ・[41549] 電気屋 
     ・[41551] 電気屋 
     ・[41552] 電気屋 
     ・[41557] kazuoni 
     ・[41707] 電気屋 
   弾の最大数が、選択武 ....   
     ・[41609] Naohiro19 
     ・[41617] banba 
     ・[41625] ぽこ 
     ・[41674] banba 
   無題   
     ・[41672] conio 
   逆オーランド方式   
     ・[41667] Tororo 
     ・[41669] non 
   配列関係   
     ・[41643] biggner 
     ・[41656] non 
     ・[41663] biginner 
   ウィンドウのサイズ   
     ・[41620] Mist 
     ・[41621] min 
     ・[41638] toyo 
   エフェクト   
     ・[41628] softya 
   FPSを60にすると画像が ....   
   ランタイムエラー   
     ・[41580] dic 
     ・[41598] たかぎ 
     ・[41623] dic 
   エラーがでます   
     ・[41493] ドラ 
     ・[41513] 初級者 
     ・[41608] エラー 
     ・[41612] non 
   ファミコンプログラム ....   
     ・[41527] ぽこ 
     ・[41529] ぽこ 
     ・[41530] ぽこ 
     ・[41531] softya 
     ・[41542] TKOZ 
     ・[41543] TKOZ 
     ・[41545] TKOZ 
     ・[41611] toyo 
   初期集団の生成   
     ・[41401] pkt 
     ・[41406] non 
     ・[41409] pkt 
     ・[41413] conio 
     ・[41417] pkt 
     ・[41420] pkt 
     ・[41425] conio 
     ・[41427] pkt 
     ・[41430] conio 
     ・[41437] non 
     ・[41514] pkt(自宅) 
     ・[41544] non 
     ・[41546] pkt(自宅) 
     ・[41554] conio 
     ・[41555] non 
     ・[41556] non 
     ・[41568] pkt(自宅) 
     ・[41578] non 
     ・[41581] pkt(自宅) 
     ・[41583] non 
     ・[41602] pkt(自宅) 
     ・[41610] non 
   無題   
     ・[41497] 寺 
     ・[41498] kazuoni 
     ・[41499] kazuoni 
     ・[41502] スタートメニュー 
     ・[41510] Mikan 
     ・[41523] 寺 
     ・[41524] ひよこ 
     ・[41535] スタートメニュー 
     ・[41561] Akira 
     ・[41562] スタートメニュー 
     ・[41563] スタートメニュー 
     ・[41565] Akira 
     ・[41569] スタートメニュー 
     ・[41600] Akira 
     ・[41601] スタートメニュー 
   DXライブラリの使い ....   
     ・[41567] チルチル 
     ・[41576] ピーマァン 
     ・[41582] チルチル 
     ・[41584] ピーマァン 
     ・[41585] チルチル 
     ・[41586] ピーマァン 
     ・[41588] チルチル 
     ・[41589] ピーマァン 
     ・[41590] チルチル 
     ・[41591] ピーマァン 
     ・[41592] チルチル 
     ・[41595] ピーマァン 
     ・[41597] ピーマァン 
   if文   
     ・[41593] 初級者 
     ・[41594] IF 
   エクセルと文字列   
     ・[41571] わ 
     ・[41573] high_lows 
     ・[41577] box 
   シフト演算   
     ・[41539] Justy 
     ・[41540] ft 
     ・[41541] box 
     ・[41547] Justy 
     ・[41559] ft 
     ・[41572] Justy 
     ・[41574] ft 
     ・[41575] ft 
   敵データの管理につい ....   
     ・[41534] Justy 
     ・[41564] S.K 
   無題   
     ・[41560] UKONN 
   文字列の\nの取り扱い ....   
     ・[41398] non 
     ・[41400] yskey 
     ・[41402] dic 
     ・[41446] non 
     ・[41455] Libra 
     ・[41469] AS 
     ・[41504] Libra 
     ・[41553] AS 

Name: ゆたかちゃん  ..ぴよぴよ(180ポイント)   Date: 2009/11/12(木) 17:12   No:41828       
Title: お助け下さい。    
課題が出たのですがサッパリなのでお答えいただけたら幸いです。


課題
・list05.cを参考にし、以下の仕様を満たすreport1.cを作成せよ

仕様1
・以下の構造体を利用した線形リストを用いること
struct player {
int no; // 背番号
char name[40]; // 選手名
float average; // 今シーズンの通算打率
struct player *next; // 次の選手データへのポインタ
};

仕様2
・選手データを登録する以下の関数を作成すること
struct player*
add_player(struct player *data, int no, char *name, float average)

仕様3
・背番号および選手名をキーとして線形探索する以下の関数の作成すること
struct player* search_by_no(struct player *data, int no)
struct player* search_by_name(struct player *data, char *name)

仕様4
・最低10名の選手データを登録すること。選手一覧はホークスでなくてもよい。(自分の好きなチームで良い)。今シーズンの通算打率はWEBを用いて調べること。


以下list05です。

#include <stdio.h>

struct player{
int no;
char *name;
};

char *linear_search(struct player data[],int n,int key);

int main()
{
int n = 10;
struct player data[]={
{28,"大隣憲司"},
{49,"オーティズ"},
{52,"川崎宗則"},
{9, "小久保裕紀"},
{47,"杉内俊哉"},
{50,"摂津正"},
{54,"ホールトン"},
{46,"本多雄一"},
{3, "松中信彦"},
{14,"馬原孝浩"}};

int key;
char *result;

printf("背番号を入力してください。¥n");
scanf("%d",&key);

result = linear_search(data,n,key);

if(result!=NULL){
printf("背番号%d番は%s選手です。¥n",key,result);
}else{
printf("背番号%d番の選手はいません。¥n",key);
}
return 0;
}

char*linear_search(struct player data[],int n,int key)
{
int i;

for(i=0;i<n;i++){
if(data[i].no == key){
return data[i].name;
}
}
return NULL;
}


180ポイント を手に入れた。


Name: Mist  ..比類無きプログラマー(70,607ポイント)   Date: 2009/11/12(木) 17:24   No:41829     
Title: Re:お助け下さい。    
http://pc12.2ch.net/test/read.cgi/tech/1255709298

自力でやる気がないならこちらへ行ってください。
ただし、テンプレぐらい読まないと回答してもらえませんけどね。

多少なりともやる気があるのであれば、規約を熟読し規約に従って再度質問してください。


30ポイント を落としてしまった。

Name: Korsakov  ..かけだし(1,354ポイント)   Date: 2009/11/13(金) 00:13   No:41862     
Title: Re:お助け下さい。    
取り敢えずmain()を完成させてみてください。
動くかどうかは知りませんが。


#include <stdio.h>
#include <string.h>

/***********************************************************
* 選手データ構造体
************************************************************/
struct player
{
int no;
char name[40];
float average;
struct player *next;
};

/***********************************************************
* 関数宣言
************************************************************/
// 登録
struct player* add_player
(struct player *data, int no, char *name, float average);
// 検索(数値)
struct player* search_by_no(struct player *data, int no);
// 検索(文字列)
struct player* search_by_name(struct player *data, char *name);

/***********************************************************
* アプリケーションエントリポイント
************************************************************/
int main(int argc,char *argv[])
{
char name[40] = "";
int no = 0;
struct player *result;

#if 0

//......

printf("背番号を入力してください。¥n");
scanf("%d",&no);

result = search_by_no(data,no);

if(result!=NULL){
printf("背番号%d番は%s選手です。¥n",no,result->name);
}else{
printf("背番号%d番の選手はいません。¥n",no);
}




printf("名前を入力してください。¥n");
scanf("%d",&name);

result = search_by_name(data,name);

if(result!=NULL){
printf("%s選手の背番号は%d番です。¥n",name,result->no);
}else{
printf("%s選手はいません。¥n",name);
}
#endif
return 0;
}

/***********************************************************
* 関数定義
************************************************************/
// 登録
struct player* add_player
(struct player *data, int no, char *name, float average)
{
struct player *tmp = (struct player*)malloc(sizeof(struct player));

if(tmp == NULL)
return NULL;

memset(tmp,0,sizeof(struct player));

tmp->no = no;
strncpy(name,sizeof(tmp->name)-1,name);
tmp->average = average;

if(data == NULL) data = tmp; else
data->next = tmp;
}

// 検索(数値)
struct player* search_by_no(struct player *data, int no)
{
struct player *tmp = data;
while(tmp != NULL)
{
if(tmp->no == no)
return tmp;

tmp = tmp->next;
}

return NULL;
}

// 検索(文字列)
struct player* search_by_name(struct player *data, char *name)
{
struct player *tmp = data;
while(tmp != NULL)
{
if( !strncmp(tmp->name,sizeof(tmp->name),name) )
return tmp;

tmp = tmp->next;
}

return NULL;
}

/***********************************************************
* END
************************************************************/


1,161ポイント を手に入れた。

Name: ゆたかちゃん  ..ぴよぴよ(209ポイント)   Date: 2009/11/13(金) 13:54   No:41890 解決!     
Title: Re:お助け下さい。    
丁寧なご回答ありがとうございます!
やってみますね。
助かりました!


29ポイント を手に入れた。



Name: ノブー  ..ぴよぴよ(302ポイント)   Date: 2009/11/13(金) 12:05   No:41883       
Title: 多項式    
[1] 質問文
 [1.1] 自分が今行いたい事は何か
入力した順番に単項式を出力するようにしたいです。
 [1.2] 今何がわからないのか、知りたいのか
どこをいじれば入力した順にできるのかわからずいろいろとやっているができない

ぜひお力を貸してください。

よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
struct mono {
int coef;
int degree_of_x;
struct mono *next;
};
struct mono mend;
struct mono *pmx;
struct mono *poly;
struct mono *pwork;
mend.coef = 0;
mend.degree_of_x = 0;
mend.next = NULL;
poly = &mend;
while (1)
{
pmx = (struct mono *)malloc(sizeof(struct mono));
if (pmx == NULL)
{
printf("No memory!!");
exit(1);
};
printf("Input the coefficient: ");
scanf("%d", &pmx->coef);
if ( pmx->coef == 0) break;
printf("Input the degree: ");
scanf("%d", &pmx->degree_of_x);
pmx->next = poly;
poly = pmx;
};
for (pwork = poly; pwork->next != NULL; pwork = pwork->next)
{
if(pwork->degree_of_x == 0){
printf("%+d", pwork->coef);
}else{
printf("%+dx^{%d}",pwork->coef, pwork->degree_of_x);
}
};
return 0;
}


302ポイント を手に入れた。


Name: non  ..熟練のプログラマー(68,880ポイント)   Date: 2009/11/13(金) 12:25   No:41885     
Title: Re:多項式    
現在では、リストの先頭にノードを追加していき、出力は先頭から行っているので
後入れ先出しになってます。
先入れ先出しに変更したいなら、リストの最後にノードを追加すればよいと思われます。

ところで、単方向リストにするのは、課題ですか?キュー構造にするという方法もあります。

なお、メモリの解放も忘れずに。



46ポイント を手に入れた。

Name: ノブー   Date: 2009/11/17(火) 13:38   No:418831258432709     
Title: Re:多項式    
回答していただきありがとうございます。
1週間考えましたが具体的どの部分いじればいいか教えていただけますでしょうか?
考えているのですが全くわかりません。




Name: まりも  ..初心者(5,967ポイント)   Date: 2009/11/12(木) 22:24   No:41846       
Title: 動作が停止してしまいます。    
いつもお世話になっています。

scanf関数とキャストを使用して、消費税を計算した金額を表示させる、という
プログラムを組んでいます。

コンパイルが通り、いざ数値を入力すると
Microsoft Windows の警告画面が出てきて
「a.exe は動作が停止しました。プログラムを終了します。」
と、実行できなくなります。

 問題の解決策として既知のコンピュータウィルスの可能性有との事だったので、
 現在使っているウイルスソフトの更新をしてみましたが、問題が解決しません。

コンパイルエラーは出なかったのですが、ソースコードに何か問題があったのでしょうか?

 C言語の理解がまだまだ足りず、初歩的な間違いの可能性も大です。
 良かったら、教えてください。;;

 エラーが出るタイミングは 数値(100)を入力し、コンソール画面に100と出た直後です。

  ■使用しているOS■
Windows Vista Home Basic
Intel(R) Core(TM) 2duo CPU E7200 @ 2.53GHz
2.00GB RAM 32ビット オペレーティングシステム

■コンパイラ : gcc
■エディタ  : メモ帳(notepad)

******ソースコード******
金額を入力して、消費税込の代金を計算、表示させるプログラム

#include <stdio.h>
int main(void)
{
int data ;          // 金額
scanf("%d\n",data) ; //  金額の入力

data = (int)(data * 1.05) ; // キャストを使用して、消費税の計算
printf("%d",data) ;    // 代金の表示

return 0 ;
}


467ポイント を手に入れた。


Name: ドラ  ..入門者(2,722ポイント)   Date: 2009/11/12(木) 22:31   No:41847     
Title: Re:動作が停止してしまいます。    
まあ、よくある間違いです。

scanf("%d\n", &data) ;

また"%d"の方が良いと思います。


44ポイント を手に入れた。

Name: まりも  ..初心者(6,158ポイント)   Date: 2009/11/12(木) 22:47   No:41850     
Title: Re:動作が停止してしまいます。    
ドラさん

ありがとうございます。
・・・・・ホントに初歩のミスで、情けない・・・。

"&"をちゃんと付けて訂正したあと、100と入力しても何にも表示されず
???と思いながらもう一回 100 と入力したら 105 で 表示されました。

次に"\n"は無いほうがいいとの事だったので、削除して上書き後、実行したら
素直に 105 と 一発表示。
 "\n" は改行の意味(念のため)で使ったのですが、良くなかったみたいです。
どうしてなんでしょう?



191ポイント を手に入れた。

Name: ドラ  ..入門者(2,873ポイント)   Date: 2009/11/12(木) 23:32   No:41860     
Title: Re:動作が停止してしまいます。    
scanf系の書式指定文字列の中にでは%d等の変換仕様以外の文字は、その文字が続く限り
読み飛ばせという意味になります。
('\n'は改行文字ですが' 'や'\t'と一緒に空白類文字として同じ扱いを受けます)

"%d\n" となっていると10進法で数値を読み取った後、空白類文字が続く限り入力を読み飛ばします。
空白類文字以外の文字が入力された時点でやっとscanf()の処理が終わるという事になるのです。

だから、このような実行結果になります。
>"&"をちゃんと付けて訂正したあと、100と入力しても何にも表示されず
>???と思いながらもう一回 100 と入力したら 105 で 表示されました。


151ポイント を手に入れた。

Name: まりも  ..初心者(6,447ポイント)   Date: 2009/11/13(金) 06:58   No:41871     
Title: Re:動作が停止してしまいます。    
ドラさん

質問に詳しく答えてくれてありがとうございます。
すごくよくわかりました。

今回はコンパイルエラーにはならず、実行途中で動作が強制終了するという初めての体験をしました。
(コンピュータウイルスに感染した事も無いので、感染したのかと本気で慌てましたw)

scanf関数は入力時に規定以外の入力(文字とか)があると、
思わぬ動作をしてしまう、課題の多い関数だと後で説明がありました。

例えば心理テストのような、入力したデータを処理して更に分岐させて・・・
というようなプログラムを作りたいと思っているのですが、
まだまだ、うまくいきません。(多分初歩的な理解不足で^^;)

gets関数やatoi関数を組み合わせたらできそうかなぁ?と思ったので、
scan関数と比較しながら、試していきたいと思っています。

いつも教えてもらってばかりで、すみません。

ありがとうございました。









289ポイント を手に入れた。

Name: まりも  ..初心者(6,479ポイント)   Date: 2009/11/13(金) 06:59   No:41872 解決!     
Title: Re:動作が停止してしまいます。    
解決マーク入れるの忘れてしまいました。

どうもありがとうございました。


32ポイント を手に入れた。



Name: 初心者  ..プログラマー(38,243ポイント)   Date: 2009/11/12(木) 17:52   No:41831       
Title: スペースの取り方    
C言語でスペースの取り方について教えてほしいのですが
特に数字を扱うときにスペースをよく見かけるのですが、
このスペースってどんな場合に使うのでしょうか?


16ポイント を手に入れた。


Name: やっくん  ..中級者(12,680ポイント)   Date: 2009/11/12(木) 21:09   No:41842     
Title: Re:スペースの取り方    
スペースとはどのスペースを指しているのでしょうか。

int a = 3;

や、極端に言えば

for( i = 0; i < 3; i++);

のようなスペースのことでしょうか?
このようなスペースであれば読みやすいようにスペースで間を空けています。
例えば、

mc.exp[1] = 0;
mc.exp[2] = 10;
mc.exp[3] = 103;
mc.exp[4] = 10;
mc.exp[5] = 10;
mc.exp[6] = 10;
mc.exp[7] = 1330;
mc.exp[8] = 10;
mc.exp[9] = 10;
mc.exp[10] = 10;
mc.exp[11] = 1031;

このようにすると自分で見やすいですよね?
ですが、スペースで命令を区切ることはできません。
printf → p rintf のようにするのはできないです。


2倍のポイントを手に入れた! 616ポイント を手に入れた。

Name: 初心者  ..プログラマー(38,455ポイント)   Date: 2009/11/12(木) 22:46   No:41849     
Title: Re:スペースの取り方    
なるほど。
読みやすいようにスペースで間を空けているんですか。
初めて知りました(-_-;)

もう一つ、ブロックについて聞きたいのですが、
例えばif文の場合、

if(条件){

}
と書かれる方や
if(条件)
{

}
と書く人がいるのですが、
どちらがプログラマーとして
書くべきなのか教えてほしいです。
また、どちらを使う人が多いのか知ってる方がいましたら教えてほしいです。五分五分でしょうか?


212ポイント を手に入れた。

Name: でんすけ  ..初心者(5,107ポイント)   Date: 2009/11/12(木) 23:16   No:41855     
Title: Re:スペースの取り方    
二番目の質問については、好みによると思います。

自分は

if()
{
}

が好きです。

まあ、よく見かけるのは
if(){
}
ですね


84ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,081,794ポイント)   Date: 2009/11/12(木) 23:20   No:41857     
Title: Re:スペースの取り方    
現場でもいろんな書き方があると思いますよ。
ただ、それを仕事としているの世界だと、その会社ごとにコーディング規約が存在するところが多いと思います。

で、コーディング規約に沿わないでいいのなら、
その程度のフォーマットなら自分で書きやすいように書けばいいと思います。

if(){
}

の方が行数が少なく見えて見やすいという人や

if()
{
}

の方がカッコの対応がわかりやすいという人など色々だと思います。
ただし、一つのプログラムの中であれこれフォーマットが変わるのだけはやめた方がいいと思います。


139ポイント を手に入れた。

Name: ぽこ  ..かけだし(1,920ポイント)   Date: 2009/11/12(木) 23:22   No:41858     
Title: Re:スペースの取り方    
一人でプログラムを書く場合→自分の好きな方法で書けば良いです。
何人かでプログラムを書く場合→事前にルールを決めて書けば良いです。

プログラマーとしては、
 ・自分のスタイルを確立する。
 ・状況に応じて書き方を変える。意地張って自分の書き方に固執しない。
てことが重要だと思いますよ。


96ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(117,847ポイント)   Date: 2009/11/12(木) 23:31   No:41859     
Title: Re:スペースの取り方    
今回質問されているようなことは、本当にささいなことで、ほとんどどうでもよいことです。
コーディング規約というのは、何を規約化するかと同じぐらい、何を規約化しないかが大事になります。
このような箸の上げ下げのようなことまで規約化しても、開発効率を落とすだけでほとんどメリットはありません。
まともなプログラマであれば、そのようなささいな相違は問題にならないはずだからです。
どうしてもスタイルをそろえたいのであれば、GNU indentのようなツールを使えばよいだけのことです。


199ポイント を手に入れた。

Name: 初心者  ..プログラマー(38,483ポイント)   Date: 2009/11/13(金) 05:15   No:41870 解決!     
Title: Re:スペースの取り方    
なるほど。
大変ためになりました。
皆さまありがとうございました。


28ポイント を手に入れた。



Name: banba  ..ぴよぴよ(505ポイント)   Date: 2009/11/13(金) 04:07   No:41868       
Title: 「重い」コードにならないためには?    
タイトル通りです。

今、自分の考えているゲームは1フレーム中に何回も沢山の変数をfor分等で参照・代入するのですが
コレってやっぱり限度ってもんがありますよね?(汗)

なんて事を考えているうちに、どうすれば「重い」といった状態になってしまうのだろうか
と、疑問が浮かんできました。条件は様々かもしれませんが…

大雑把な質問かもしれませんが、だいたいでいいので答えていただければありがたいです。



Name: mats  ..かけだし(1,306ポイント)   Date: 2009/11/13(金) 04:44   No:41869     
Title: Re:「重い」コードにならないためには?    
既にご存じだったら申し訳ないのですが…


一般に,計算量の目安としてオーダー記法(O-記法)というものが用いられます.

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%82%A6%E3%81%AE%E8%A8%98%E5%8F%B7

扱うデータの個数をnとしたときに,ゲームのような実時間処理を行うためには
O(n^2) 〜 O(n^2 log n)
程度が上限だと聞いたことがあります.(情報の出所は忘れてしまいました.すいません…)

もちろん計算機の性能にも左右はされますし,
扱うデータ数が n=100 程度の場合には O(n^3)くらいは余裕なので,
計算の重さを測る指標の一つ程度にお考えください.


62ポイント を手に入れた。

Name: banba   Date: 2009/11/22(日) 13:20   No:418681258863618 解決!     
Title: Re:「重い」コードにならないためには?    
返信非常に遅れてすみません。
回答ありがとうございました!
「オーダー記法」ですね?参考にしてみます!




Name: やばい  ..かけだし(1,810ポイント)   Date: 2009/11/13(金) 00:08   No:41861       
Title: どうすれば・・・    
このhttp://dixq.net/s/4.htmlの画像のようにしたいのですができません。くろくなってFPSしか表示されませんでしたどうすればよろしいでしょうか?


#include "DxLib.h"

/* グローバル宣言 */

int counter=0;
int color_white;
char Key[256];

//画像ファイルハンドル
int img_background[2];
int img_player[4];


//構造体
typedef struct{
double x,y;
int status,counter;
int shot [11][15];
} BODY_player_t;

BODY_player_t Player;


/******************/

void img_sound_load(){
img_background[0] = LoadGraph("Sh/img/back/background0.png");
img_background[1] = LoadGraph("Sh/img/back/background1.png");
LoadDivGraph( "Sh/img/char/player.png" , 4 , 4 , 1 , 32 , 48 , img_player ) ;
}

void initialization(){
Player.x=200.0;
Player.y=400.0;
Player.counter=0;
Player.status=0;
}

void SetColor(){
color_white = GetColor(255,255,255); //白色ハンドルを取得
}

void Background(){
DrawGraph(0,0,img_background[0],FALSE); //背景を描画
}

void PlayerControl(){
DrawGraph((int)Player.x,(int)Player.y,img_player[0],TRUE);//プレイヤーを描画
}

void Background2(){
DrawGraph(420,0,img_background[1],FALSE); //得点盤を描画
}

void FpsTimeFanction(){
static int FpsTime[2]={0,},FpsTime_i=0;
static double Fps=0.0;

if(FpsTime_i== 0)
FpsTime[0]=GetNowCount(); //1周目の時間取得
if(FpsTime_i==49){
FpsTime[1]=GetNowCount(); //50周目の時間取得
Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f);//測定した値からfpsを計算
FpsTime_i=0;
}
else
FpsTime_i++; //現在何周目かカウント
if(Fps != 0)
DrawFormatString(565,460,color_white,"FPS %.1f",Fps); //fpsを表示
return;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int RefreshTime=0;

ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;

SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。

img_sound_load(); //画像ファイルをロード
initialization(); //初期化
SetColor(); //色を取得

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除

Background(); //背景描画

PlayerControl(); //プレイヤー描画

Background2(); //得点盤描画

FpsTimeFanction(); //FPS計算

ScreenFlip() ; //裏画面データを表画面へ反映

counter++;

if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17); //1周の処理が17ミリ秒になるまで待つ
}

DxLib_End() ;
return 0 ;
}




1,810ポイント を手に入れた。


Name: Korsakov  ..かけだし(1,640ポイント)   Date: 2009/11/13(金) 00:23   No:41863     
Title: Re:どうすれば・・・    
FPSが表示されていると言う事は、FpsTimeFanction()内で
描画そのものは正常に実行されていると考えられますよね。

ここでバグの元となっているのは以下の関数ではないでしょうか?

Background(); //背景描画

PlayerControl(); //プレイヤー描画

Background2(); //得点盤描画

これらの関数にブレークポイントを仕掛けて、画像が読み込めているかなど
確認してみたら?


2倍のポイントを手に入れた! 286ポイント を手に入れた。



Name: はね  ..中級者(13,691ポイント)   Date: 2009/11/09(月) 14:49   No:41614       
Title: 龍神録60章にて    
聞きたいことがあるのですが
フェードインした部分とフェードアウトする部分を
画面の中心を軸にして
添付した黄色の線に沿って回転する感じ(壁が軸に対して回る感じ)にしたいのですが、
どうしたらいいでしょうか?


2倍のポイントを手に入れた! 192ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(458,899ポイント)   Date: 2009/11/09(月) 23:38   No:41626     
Title: Re:龍神録60章にて    
 全然イメージがつかめないのですが、「フェードインした部分とフェードアウトする部分」って
どこのことでしょうか?

 ただ画面全体が回転すればいいのですか?


216ポイント を手に入れた。

Name: はね  ..中級者(13,710ポイント)   Date: 2009/11/10(火) 01:40   No:41630     
Title: Re:龍神録60章にて    
そうです。よろしくお願いします

19ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,004ポイント)   Date: 2009/11/10(火) 02:22   No:41631     
Title: Re:龍神録60章にて    
 3D部分だけなら、ワールド行列かカメラ(ビュー行列)をZ軸で回転させれば回ります。

 2Dも含めて回したい場合は、回したい部分だけを一旦別のテクスチャに
レンダリングしておいて、そのテクスチャを回転させて画面に描画すればOKです。


105ポイント を手に入れた。

Name: はね  ..中級者(13,795ポイント)   Date: 2009/11/10(火) 03:16   No:41633     
Title: Re:龍神録60章にて    
一応、Justyさんのサンプルも使ってるのですが
http://www.play21.jp/board/formz.cgi?action=res&resno=35985&page=&lognum=110&id=dixq&rln=36229
そのZ軸に値する場所ってどこなのでしょうか?


85ポイント を手に入れた。

Name: はね  ..中級者(14,068ポイント)   Date: 2009/11/10(火) 14:38   No:41653     
Title: Re:龍神録60章にて    
すみません。ここということが分かったのですが、

static void UdateCamera()
{
const float range = 50;
VECTOR r;
r.x = -((float)(ch.x - FX) / (FMX - FX) * range - range*0.5f);
r.y = ((float)(ch.y - FY) / (FMY - FY) * range - range*0.5f);
r.z = 0.f;

const float k = 0.04f;
camera.pos_offset.x += (r.x - camera.pos_offset.x) * k;
camera.pos_offset.y += (r.y - camera.pos_offset.y) * k;
camera.pos_offset.z += (r.z - camera.pos_offset.z) * k;

VECTOR pos;
VectorAdd(&pos, &camera.base_pos, &camera.pos_offset);

MATRIX cameraMatrix;
CreateLookAtMatrix(&cameraMatrix, &pos, &camera.target, &camera.up);
SetTransformToView(&cameraMatrix);
}

カメラ自体を回す方法が分からないのですが
どうしたらいいのでしょうか?


273ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,127ポイント)   Date: 2009/11/10(火) 22:46   No:41682     
Title: Re:龍神録60章にて    
 なるほど。回すのは3D部分だけでいいのですね。

 CreateLookAtMatrixの第3引数に上向きのベクトルを指定してあげてください。

 先のスレのままなら、camera.upが指定されているはずで、中身は [0, 1, 0]、
つまり真上を向くようになっています。

 これを例えば、[-1, 0, 0] とかにすれば右に 90度回転することができますし、
[0, -1, 0]なら 180度、上下逆さまになります。


123ポイント を手に入れた。

Name: はね  ..中級者(14,137ポイント)   Date: 2009/11/11(水) 03:04   No:41696     
Title: Re:龍神録60章にて    
ありがとうございます。
ただ、これだと一瞬のうちに角度が変わってしまうのですが、
綺麗に角度をゆっくり変える方法はないでしょうか?


69ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,503ポイント)   Date: 2009/11/11(水) 22:42   No:41743     
Title: Re:龍神録60章にて    

>綺麗に角度をゆっくり変える方法はないでしょうか?

 ベクトルを指定すればその向きが上になる(正確にはちょっと違いますが)のですから、
ベクトルをゆっくりなめらかに回してあげればいいだけです。

 60章のサンプルの場合、視線の Zの符号が一定なので [0, 1, 0]を
Z軸で指定角度だけ回転した行列を使って求めてもいいですし、
単純に xと y要素を円の方程式を使って回転したベクトルを指定すれば、
滑らかになるはずです。


240ポイント を手に入れた。

Name: はね  ..中級者(14,172ポイント)   Date: 2009/11/12(木) 19:50   No:41836     
Title: Re:龍神録60章にて    
例えばですが、
右に40度動かすには
具体的にどういった計算方法で算出すればいいのでしょうか?


35ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(460,214ポイント)   Date: 2009/11/12(木) 23:13   No:41853     
Title: Re:龍神録60章にて    

>具体的にどういった計算方法で算出すればいいのでしょうか

 60章であれば

    const float angle40 = 40.f * (float)PI / 180.f;
    camera.up.x = -sinf(angle40);
    camera.up.y = cosf(angle40);

でいいと思います。

 カメラを本格的にいじり始めたらこれじゃダメですけど。


220ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,081,610ポイント)   Date: 2009/11/12(木) 23:15   No:41854     
Title: Re:龍神録60章にて    
短文で申し訳ないですが、
ver3が出たいまやもう昔の3D関数を使う意味はないので、
本格的に3D描画をしたいなら、新しく実装された3D関数をお使いになってはいかがでしょうか?

あんなに苦労したのにDXライブラリは便利になりすぎだよ、うぅ(悲嬉涙


45ポイント を落としてしまった。



Name: kai  ..初心者(7,699ポイント)   Date: 2009/11/04(水) 11:44   No:41367       
Title: 中ボスが逃げる方法    
こんにちは。
再び龍神録50章についてですが、
今度は東方みたいに中ボスを倒したら
消滅させるのではなく、画面上部に逃げてから
boss.flagを消すように実装したいのですがうまくいかなくて困ってます・・
boss_shot.cpp内に新しく作った


#define BOSS_POS2_X (FMX/2) //ボスの逃げる位置
#define BOSS_POS2_Y (-50)
//物理的計算をさせる登録をする(指定時間tで定位置に戻す)
void input_phy2(int t){ //t=移動にかける時間
double ymax_x,ymax_y;
if(t==0)t=1;
boss.phy.flag=1; //登録オン
boss.phy.cnt=0; //カウンタ初期化
boss.phy.set_t=t; //移動にかける時間をセット
ymax_x=boss.x-BOSS_POS2_X; //移動したい水平距離
boss.phy.v0x=2*ymax_x/t; //水平成分の初速度
boss.phy.ax =2*ymax_x/(t*t); //水平成分の加速度
boss.phy.prex=boss.x; //初期x座標
ymax_y=boss.y-BOSS_POS2_Y; //移動したい鉛直距離
boss.phy.v0y=2*ymax_y/t; //鉛直成分の初速度
boss.phy.ay =2*ymax_y/(t*t); //鉛直成分の加速度
boss.phy.prey=boss.y; //初期y座標
}

これをうまく活用したいのですが
何か良い方法はないでしょうか?
よろしくお願いします・・


210ポイント を手に入れた。


Name: Dixq (管理人) [URL]  ..ウィザード(1,081,987ポイント)   Date: 2009/11/04(水) 19:25   No:41411     
Title: Re:中ボスが逃げる方法    
ちょっと今サンプルがかける環境ではないのですが、
普通に画面外の座標にセットしたのではだめなのでしょうか?


50ポイント を手に入れた。

Name: トゥル太郎  ..ぴよぴよ(861ポイント)   Date: 2009/11/04(水) 19:48   No:41415     
Title: Re:中ボスが逃げる方法    
input_phy_posを使うといいんじゃないかと思います。

2ポイント を落としてしまった。

Name: kai  ..初心者(7,828ポイント)   Date: 2009/11/05(木) 01:41   No:41433     
Title: Re:中ボスが逃げる方法    
確かに
input_phy_pos(FMX/2,-50, 50)
これを使うと便利ですね・・
ただ、
if(boss.knd==boss.danmaku_num[0] || boss.knd==boss.danmaku_num[1]){//出すべき弾幕をだしきったら
   boss.flag=0; //消す
   enter_dn(10,40); //(45)
   se_flag[9]=1; //ボスが死んだ音
   return ;
}
else{
   enter_boss(1); //次の弾幕を登録
}
ここをどういじればいいのかよく分からないのです・・
サンプルお願いします・・


129ポイント を手に入れた。

Name: kokoro  ..初心者(6,090ポイント)   Date: 2009/11/06(金) 10:34   No:41507     
Title: Re:中ボスが逃げる方法    
横からすみませんが
私も知りたいです。私も出来なくて困ってました・・


23ポイント を手に入れた。

Name: kai  ..初心者(7,864ポイント)   Date: 2009/11/09(月) 11:07   No:41613     
Title: Re:中ボスが逃げる方法    
input_phy_pos(FMX/2,-50, 50) を使うとバグってしまうのですが・・

36ポイント を手に入れた。

Name: pooka [URL]  ..上級者(18,951ポイント)   Date: 2009/11/09(月) 16:09   No:41615     
Title: Re:中ボスが逃げる方法    
あまりテストしてませんがこんな感じでどうでしょうか?

//boss_shot.cpp
#define BOSS_POS2_X (FMX/2)    //ボスの逃げる位置
#define BOSS_POS2_Y (-50)
#define BOSS_MOVE_TIME 50      //移動時間

if(boss.knd == boss.danmaku_num[0])
{
    boss.state = 3;
    input_phy_pos(BOSS_POS2_X, BOSS_POS2_Y, BOSS_MOVE_TIME);
}
else if(boss.knd == boss.danmaku_num[1])
    //出すべき弾幕をだしきったら
{
    boss.flag=0;//消す


    //略


if(boss.state == 2)    //弾幕中なら
{
    boss_shot_bullet[boss.knd]();    //弾幕関数へ
    boss_shot_calc();                //弾幕計算
}
if(boss.state == 3)
{
    if(boss.y <= BOSS_POS2_Y + 1)
    {
        boss.flag = 0;
    }
}


683ポイント を手に入れた。

Name: kai  ..初心者(7,911ポイント)   Date: 2009/11/10(火) 02:43   No:41632     
Title: Re:中ボスが逃げる方法    
ありがとうございます。
無事出来たのですが、よく東方をみたら、
中ボスを倒したら、倒した位置で数カウント停止したのち
上に逃げるのですが、数カウント停止は出来ないのでしょうか?


47ポイント を手に入れた。

Name: pooka [URL]  ..上級者(19,403ポイント)   Date: 2009/11/10(火) 19:27   No:41668     
Title: Re:中ボスが逃げる方法    
例えば
#define BOSS_WAIT_TIME 100
として

if(boss.knd == boss.danmaku_num[0]) 

    boss.state = 3; 
    input_phy_pos(BOSS_POS2_X, BOSS_POS2_Y, BOSS_MOVE_TIME); 
}

if(boss.knd==boss.danmaku_num[0])
{
    boss.state = 3;
}


if(boss.state == 3) 

    if(boss.y <= BOSS_POS2_Y + 1) 
    { 
        boss.flag = 0; 
    } 
}

if(boss.state == 3)
{
    static int cnt = boss.cnt;
    if(boss.cnt - cnt == BOSS_WAIT_TIME)
    {
        input_phy_pos(BOSS_POS2_X, BOSS_POS2_Y, BOSS_MOVE_TIME);
    }
    if(boss.y <= BOSS_POS2_Y+1)
    {
        boss.flag = 0;
    }
}

でどうでしょうか。
真上に逃げるのであればBOSS_POS2_Xも変更してください。


452ポイント を手に入れた。

Name: kai  ..ぴよぴよ(135ポイント)   Date: 2009/11/11(水) 07:14   No:41699     
Title: Re:中ボスが逃げる方法    
pookaさんのを参考にさらに色々いじったら
無事、実装できました。
ありがとうございました!


2倍のポイントを手に入れた! 54ポイント を手に入れた。

Name: kai  ..初心者(8,044ポイント)   Date: 2009/11/12(木) 19:59   No:41838 解決!     
Title: Re:中ボスが逃げる方法    
自己解決しました

133ポイント を手に入れた。



Name: DM  ..ぴよぴよ(166ポイント)   Date: 2009/11/12(木) 18:46   No:41834       
Title: DirectMusicのメモリ読み込み    
IDirectMusicSegment8 *Segment[3];(se01.wav, se02.wav, se03.wav用)
こんな感じで用意して、
今まで LoadObjectFromFile で wav ファイルを読み込んでたんですが、
今回メモリからの読み込みに変えました。その場合 GetObject になるかと思います。
そしていざ実行してみると全て同じ音が鳴ります。
原因を調べたら、最初に読み込んだデータがメモリ上にキャッシュされていて、
次に読み込みを行なうデータはそれを参照してロードしているみたいです。
実際全てのアドレスが同じでした。キャッシュを開放したら今度はロードができなくなりました。
これの解決方法がわかりません。ちゃんとロードさせる方法を教えてください。


166ポイント を手に入れた。




Name: 256bit  ..かけだし(2,401ポイント)   Date: 2009/11/11(水) 18:10   No:41720       
Title: 敵のプログラム    
 敵の関係したプログラムを作りたいと思っています。2Dアクションゲームみたいに4方向に敵が動いたり、ショット飛ばしたりしたいのですが、どのプログラムを参考にしたらいいですか?

72ポイント を手に入れた。


Name: softya  ..プログラマー(36,389ポイント)   Date: 2009/11/11(水) 19:23   No:41724     
Title: Re:敵のプログラム    
サンプルプログラミングの館のMonsterAttackがご要望に近いかと。
http://dixq.net/sm/d12.html


2倍のポイントを手に入れた! 100ポイント を手に入れた。

Name: 256bit  ..かけだし(2,464ポイント)   Date: 2009/11/12(木) 15:36   No:41822     
Title: Re:敵のプログラム    
>>softyaさん

 申し訳ございません。紹介してもらったサンプルプログラムを見てみたのですが、構造が複雑でよくわかりませんでした。A^_^;
 現在敵プログラムの基礎的な所を学びたいので、参考にできる部分があったら教えてくださいm(__)m


63ポイント を手に入れた。

Name: softya  ..プログラマー(37,699ポイント)   Date: 2009/11/12(木) 16:16   No:41826     
Title: Re:敵のプログラム    
>シューティングゲームの館にある敵の概念で、考えることはできますか?
敵の行動が自立ではなく行動パターンで動いているので、そのままでは参考にならないかと思います。
簡単なAI処理が必要ですので、まずシューティングゲームの館の敵の行動パターンを改造して4方向に動いて自機を追いかけるとかから初めて見てはどうでしょうか?


93ポイント を手に入れた。

Name: 256bit  ..かけだし(2,493ポイント)   Date: 2009/11/12(木) 16:25   No:41827     
Title: Re:敵のプログラム    
>>softyaさん

 わかりました。まずそこからはじめてみます。
 またよろしくお願いします。


29ポイント を手に入れた。



Name: ひよこ  ..熟練のプログラマー(65,661ポイント)   Date: 2009/11/10(火) 10:08   No:41640       
Title: ポインタエラー    
引数をちょっと変更してポインタエラーが出て、戻しても、ポインタエラーになってしまいます。
龍神録とリストを使っているのですが、上のような状態になってしまいました。
場所はenemy.cppのenemy_enterのenter_enemy_t *next_enemy = check_enemy->next;//head_enemy->nextで
RyuJin.exe の 0x0054962a で初回の例外が発生しました: 0xC0000005: 場所 0xfdfdfe35 を読み込み中にアクセス違反が発生しました。
RyuJin.exe の 0x0054962a でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfdfdfe35 を読み込み中にアクセス違反が発生しました。
となっています。どうすればいいのでしょうか?
ソースは戻した状態なんですが。


230ポイント を手に入れた。


Name: softya  ..プログラマー(34,217ポイント)   Date: 2009/11/10(火) 10:24   No:41641     
Title: Re:ポインタエラー    
前にも言いましたがリストの繋がりをデバッガで追いかけた結果を教えてください。
例外が発生したときのcheck_enemyのポインタ値が疑わしいです。

>となっています。どうすればいいのでしょうか?
間違いなくバグっています。もし今まで動いていたなら偶然かもしれません。
前にも説明しましたが、リスト構造はうまく動いているように見えてもバグを内包している可能性がありますので、かならずデバッガでリスト構造を確認してください。もし、リスト構造を確認する上で分からない事があるなら聞いてください。


224ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,778ポイント)   Date: 2009/11/10(火) 10:47   No:41642     
Title: Re:ポインタエラー    
デバッガで追ってみると
load.cppで一回目のcsvの読み込みで
new_enter_enemy = new enter_enemy_t;new_enter_enemy->next=NULL;でNULLになるはずなのに
next = 0xfdfdfdfd {x=??? y=??? angle=??? ...}となっていませんでした。どうしてなんでしょうか?


117ポイント を手に入れた。

Name: softya  ..プログラマー(34,248ポイント)   Date: 2009/11/10(火) 11:18   No:41644     
Title: Re:ポインタエラー    
どの時点でnext = 0xfdfdfdfdとなっているいか、デバッガで1ステップづつ追いかけてみてください。

31ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,822ポイント)   Date: 2009/11/10(火) 11:44   No:41645     
Title: Re:ポインタエラー    
new_enter_enemy->next=NULL;でこの行を実行する前と実行後に0xfdfdfdfdがあります。

44ポイント を手に入れた。

Name: softya  ..プログラマー(34,272ポイント)   Date: 2009/11/10(火) 12:37   No:41646     
Title: Re:ポインタエラー    
new_enter_enemyは、何処を指していますか?


24ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,846ポイント)   Date: 2009/11/10(火) 12:48   No:41647     
Title: Re:ポインタエラー    
何処を指していますか?
>>意味のことですか?


24ポイント を手に入れた。

Name: softya  ..プログラマー(34,334ポイント)   Date: 2009/11/10(火) 13:00   No:41648     
Title: Re:ポインタエラー    
その時のnew_enter_enemyのポインタ値を教えてください。
>何処を指していますか?
ポインタなのでアドレスの何処を指すって表現をします。


62ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,893ポイント)   Date: 2009/11/10(火) 13:16   No:41650     
Title: Re:ポインタエラー    
そういう意味なんですか、
new_enter_enemy = 0x01e81288
next = 0xfdfdfdfd
です。


47ポイント を手に入れた。

Name: softya  ..プログラマー(34,541ポイント)   Date: 2009/11/10(火) 14:05   No:41651     
Title: Re:ポインタエラー    
>new_enter_enemy = 0x01e81288
まともなアドレスに見えますね。

>new_enter_enemy->next=NULL;でこの行を実行する前と実行後に0xfdfdfdfdがあります。
NULLを代入し損なう状況が分からないですね。

もう一度調べてもらえますか?
new_enter_enemy->next=NULL; ← ここの時点と
new_enter_enemy->count =atoi(inputc);break; ← ここの時点
それぞれ、new_enter_enemyとnew_enter_enemy->nextの値を調べてください。
それと、NULLの代入に成功している場合の値も教えてください。


207ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,928ポイント)   Date: 2009/11/10(火) 14:31   No:41652     
Title: Re:ポインタエラー    
NULLの代入は成功していないようです。
成功していたソースも同じように
new_enter_enemy->next 0xfdfdfdfd でした。


35ポイント を手に入れた。

Name: softya  ..プログラマー(34,571ポイント)   Date: 2009/11/10(火) 18:34   No:41666     
Title: Re:ポインタエラー    
うーん。謎ですね。
リリースビルドでデバッグしてるって事は無いですか?
その場合はデバッガは正しい値を表示しません。


30ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,958ポイント)   Date: 2009/11/10(火) 21:41   No:41677     
Title: Re:ポインタエラー    
デバッグですね。自分的にはおかしい部分はないと思うのですが、
softyaさんはソース見ましたか?


30ポイント を手に入れた。

Name: softya  ..プログラマー(34,925ポイント)   Date: 2009/11/10(火) 22:04   No:41678     
Title: Re:ポインタエラー    
>softyaさんはソース見ましたか?
ソースもjpgも見ました。
ソースは、load_enemy_data()を見る限り問題なさそうに見えますが、何か単純な見落としがあるんじゃないかと疑っています。その場合はデバッガしか頼れるものが無いんですよね。

えーと
>new_enter_enemy->next=NULL;
のところでデバッガで止めて、右クリックで逆アセンブルを表示でアセンブラコードがどうなっているか見せてもらえないでしょうか?さっきみたいにjpgでお願いします。


221ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,988ポイント)   Date: 2009/11/10(火) 22:36   No:41681     
Title: Re:ポインタエラー    
これでいいでしょうか、自分には意味がさっぱりなんですけど。

30ポイント を手に入れた。

Name: softya  ..プログラマー(35,717ポイント)   Date: 2009/11/10(火) 22:55   No:41683     
Title: Re:ポインタエラー    
はて?
NULLは代入してますが、NULLの代入オフセットが変ですね。

構造体は、こうですよね(オフセットの計算がしてあります)?
{
double x,y; 0x00,0x08
double angle; 0x10,0x18
double spd; 0x20
int state; 0x28
int knd; 0x2c
int wait; 0x30
int pattern; 0x34
int count; 0x38
int hp; 0x3c
struct enter_enemy_t* next; 0x40 //次の要素へのポインタ
};
これなら、0x40にNULLを代入するはずですが、
>mov dword ptr [eax+34h],0
で0x34にNULLを代入してますね。
それとも、デバッグで追いかけているのは違う構造体のプログラムなんでしょうか?


191ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,991ポイント)   Date: 2009/11/10(火) 23:13   No:41685     
Title: Re:ポインタエラー    
上の構造体です。enter_enemy_tです。
0xはどこに書いてあったか知りませんが、どこか初期化がいけないのでしょうか?


3ポイント を手に入れた。

Name: softya  ..プログラマー(35,913ポイント)   Date: 2009/11/10(火) 23:32   No:41687     
Title: Re:ポインタエラー    
>0xはどこに書いてあったか知りませんが、どこか初期化がいけないのでしょうか?
0xは構造体のオフセットを私が計算しましした。
問題なのは、コンパイラが0x34にnextポインタがあると思っている点です。
(私はx86のアセンブラが得意じゃないので、私が勘違いしている可能性もあります)
構造体の定義を見る限り0x40にnextポインタがあるべきです。

すいませんが確認のため
while( now_enter_enemy->next!=NULL ) {

now_enter_enemy->next = new_enter_enemy;

case 1: new_enter_enemy->pattern =atoi(inputc);break;
の部分のアセンブラコードを見せてもらえますか?


196ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(66,013ポイント)   Date: 2009/11/10(火) 23:48   No:41689     
Title: Re:ポインタエラー    
計算なんて、できるんですか。驚きです。
アセンブルのjpg2つです。


22ポイント を手に入れた。

Name: ぽこ  ..かけだし(1,824ポイント)   Date: 2009/11/11(水) 00:11   No:41692     
Title: Re:ポインタエラー    
正直、こういったやり取りするより、問題をきちんと再現できる
ソースをいただけると、5分で解決すると思うのですが。。。

ひよこさんがNo:41640で添付しているソースだけでは、
コンパイルは通せても、実行ができません。


95ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,263ポイント)   Date: 2009/11/11(水) 00:16   No:41693     
Title: Re:ポインタエラー    

> 構造体の定義を見る限り0x40にnextポインタがあるべきです

 1つずれてます。
 angleは double1つなので、nextは 0x38かと。
 
 だとしても nextが 0x34となっているのは解せないですが。


# メンバ hpを認識していない(?)ような気がしますね。
一度リビルドしてみては?


136ポイント を手に入れた。

Name: softya  ..プログラマー(36,197ポイント)   Date: 2009/11/11(水) 00:24   No:41694     
Title: Re:ポインタエラー    
>計算なんて、できるんですか。驚きです。
簡単ですよ。
各変数のサイズを16進で足していくだけです。

が、構造体の計算で寝ぼけていたのが発覚。簡単だけど間違いやすいです。
struct enter_enemy_t
{
double x,y; 0x00,0x08
double angle; 0x10
double spd; 0x18
int state; 0x20
int knd; 0x24
int wait; 0x28
int pattern; 0x2c
int count; 0x30
int hp; 0x34
struct enter_enemy_t* next; 0x38 //次の要素へのポインタ
};
だとしてもnextポインタは0x34じゃなくて0x38だなぁ。

こっちでも追いかけてみたいのですが、データは龍神録のデータで動きますか?
違う部分があれば、そのデータも欲しいです。
ちょっと追いかけるのに手間が掛かるので明日というか午後になりますけど。


284ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(66,287ポイント)   Date: 2009/11/11(水) 10:47   No:41701     
Title: Re:ポインタエラー    
龍神録ののデータを使っているので絵のほうはいいのですが、
csvでenemy_data0.csvを使います。
/カウンタ,移動パターン,敵の種類,x座標,y座標,状態,待機時間
/cnt,pattern,knd,x,y,state,wait
60,2,0,200,40,0,80
60,1,0,200,40,0,80
60,3,0,200,40,0,80
60,4,0,200,40,0,80
60,5,0,200,40,0,80
60,6,0,200,40,0,80
60,7,0,200,40,0,80
60,8,0,200,40,0,80
60,9,0,200,40,0,80
60,10,0,200,40,0,80
60,10,0,200,40,0,80


274ポイント を手に入れた。

Name: softya  ..プログラマー(36,289ポイント)   Date: 2009/11/11(水) 19:17   No:41723     
Title: Re:ポインタエラー    
結論から言いますと私の環境VisualStudio2005だと異常ないです。
なので、Justyさんの提案どおり一度リビルドかクリーンしてからビルドを行ってみてください。
どう考えてもload.cppは古いヘッダでコンパイルされたままだと思われます。ソリューションにヘッダが追加されていない可能性もありますので、ソリューションを確認してください。


92ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(66,332ポイント)   Date: 2009/11/11(水) 19:31   No:41725 解決!     
Title: Re:ポインタエラー    
リビルドしたら成功して、引数の追加ができました。
Justyさん、softyaさん、ありがとうございました。


36ポイント を手に入れた。

Name: softya  ..プログラマー(36,415ポイント)   Date: 2009/11/11(水) 19:58   No:41727     
Title: Re:ポインタエラー    
ソリューションにヘッダはありましたか?
無い場合は、また同じ問題が起こりますよ。


26ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(66,392ポイント)   Date: 2009/11/11(水) 20:32   No:41730     
Title: Re:ポインタエラー    
ソリューションにヘッダはありましたか?
ソリューションエクスプローラにヘッダがあるってことですか?


2倍のポイントを手に入れた! 60ポイント を手に入れた。

Name: softya  ..プログラマー(36,532ポイント)   Date: 2009/11/11(水) 20:57   No:41732     
Title: Re:ポインタエラー    
>ソリューションエクスプローラにヘッダがあるってことですか?
そうです。
struct.h
define.h
func.h
func2.h
function.h
gv.h
が全て登録されていますか?
されていないと自動的に更新を感知してコンパイルしてくれません。


117ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(67,936ポイント)   Date: 2009/11/11(水) 21:24   No:41735     
Title: Re:ポインタエラー    
func2.hはソースの中にないと思います。
hpを同じ方法で読み込もうとしたらいっきにおかしくなりました。勝手に敵が登録されたりします。
変なソースには見えませんが、
csv enemy_data1.csv

/カウンタ,移動パターン,敵の種類,x座標,y座標,状態,待機時間,敵のHP
/cnt,pattern,knd,x,y,state,wait,hp
60,2,0,200,40,0,80,1
60,1,0,200,40,0,80,2
60,3,0,200,40,0,80,3
60,4,0,200,40,0,80,4
60,5,0,200,40,0,80,5
60,6,0,200,40,0,80,6
60,7,0,200,40,0,80,7
60,8,0,200,40,0,80,8
60,9,0,200,40,0,80,9
60,10,0,200,40,0,80,10
60,10,0,200,40,0,80,11


load.cpp
void load_enemy_data(){
int num,i,fp;
char fname[32]={"../dat/csv/enemy_data1.csv"};
int input[64];
char inputc[64];

// 実態を作る。
enter_enemy_t *new_enter_enemy;
enter_enemy_t *now_enter_enemy;

fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

num=0;


while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0:
new_enter_enemy = new enter_enemy_t;
new_enter_enemy->next=NULL;
// 最初の処理なら。
if( head_enter_enemy==NULL ) {
// 最初の敵データ
head_enter_enemy = new_enter_enemy;
}
else
{
// リストの最後を探す。
now_enter_enemy = head_enter_enemy;
while( now_enter_enemy->next!=NULL ) {
now_enter_enemy = now_enter_enemy->next;
}
// リストの最後に接続する。
now_enter_enemy->next = new_enter_enemy;
now_enter_enemy=NULL;
}
new_enter_enemy->count =atoi(inputc);break;
case 1: new_enter_enemy->pattern =atoi(inputc);break;
case 2: new_enter_enemy->knd =atoi(inputc);break;
case 3: new_enter_enemy->x =atof(inputc);break;
case 4: new_enter_enemy->y =atof(inputc);break;
case 5: new_enter_enemy->state =atof(inputc);break;
case 6: new_enter_enemy->wait =atoi(inputc);break;
case 7: new_enter_enemy->hp =atoi(inputc);break;
}
num++;
if(num==8){
num=0;
}
}
EXFILE:
new_enter_enemy =NULL;
now_enter_enemy=NULL;
FileRead_close(fp);
}enemy.cpp
void enemy_enter(){
enter_enemy_t *check_enemy = head_enter_enemy;
enter_enemy_t *before_enemy = NULL;
while( check_enemy != NULL ) {
enter_enemy_t *next_enemy = check_enemy->next;//head_enemy->next
if(check_enemy->count==stage_count) {
enter_enemy(check_enemy->x,check_enemy->y,0,0,check_enemy->state,check_enemy->knd,check_enemy->pattern,check_enemy->wait,check_enemy->hp);
// 削除
if( before_enemy == NULL ) {//先頭か
head_enter_enemy = next_enemy;//一回目だったら、NULLを、2回目以上はアドレスへつなぐ
} else {
before_enemy->next = next_enemy;
}
delete check_enemy;
} else {//条件にひっかからなかったらそのアドレスをbefore_ememy
before_enemy = check_enemy;
}
check_enemy = next_enemy;
}
}
//softyaさん。
void enter_enemy(double x,double y,double angle,double spd,int state,int knd,int pattern,int wait,int hp){
// 実態を作る。
enemy_t *new_enemy;

new_enemy = new enemy_t;
new_enemy->next=NULL;
// 最初の処理なら。
if( head_enemy==NULL ) {
// 最初の敵データ
head_enemy = new_enemy;
}
else
{
// リストの最後を探す。
enemy_t *now_enemy = head_enemy;
while( now_enemy->next!=NULL ) {
now_enemy = now_enemy->next;
}
// リストの最後に接続する。
now_enemy->next = new_enemy;
}
new_enemy->x=x;
new_enemy->y=y;
new_enemy->angle=angle;
new_enemy->spd=spd;
new_enemy->vx=0;
new_enemy->vy=0;
new_enemy->state=state;
new_enemy->knd=knd;
new_enemy->pattern=pattern;
new_enemy->cnt=0;
new_enemy->flag=1;
new_enemy->muki=0;
new_enemy->img=0;
new_enemy->wait=wait;
new_enemy->hp=hp;
}


1,544ポイント を手に入れた。

Name: softya  ..プログラマー(36,577ポイント)   Date: 2009/11/11(水) 22:09   No:41739     
Title: Re:ポインタエラー    
func2.hはともかく他のヘッダは登録されているのですね?
あとソースとヘッダを一式でください。
コンパイルを通す手間が大変です。


45ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(67,963ポイント)   Date: 2009/11/11(水) 22:12   No:41740     
Title: Re:ポインタエラー    
上のソースじゃなくて今困っているソースがほしいということですか?

27ポイント を手に入れた。

Name: softya  ..プログラマー(36,639ポイント)   Date: 2009/11/11(水) 22:22   No:41741     
Title: Re:ポインタエラー    
はい。問題のある最新をください。
問題を確かめるには、確実に同じもので無いと無駄手間になるからです。
それとヘッダの件も答えてくださいね。
>func2.hはともかく他のヘッダは登録されているのですね?


62ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,039ポイント)   Date: 2009/11/11(水) 23:29   No:41748     
Title: Re:ポインタエラー    
すみませんが、ひとつお聞きしますが、
同じソースで実行結果が違うっていうのはありえませんよね。
見た目が同じソースなのに実行結果が違いました。
9が成功したほうで9?が失敗です。


76ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,061ポイント)   Date: 2009/11/11(水) 23:34   No:41750     
Title: Re:ポインタエラー    
func2.hは使っていません。
他はちゃんと入ってます。


22ポイント を手に入れた。

Name: softya  ..プログラマー(36,696ポイント)   Date: 2009/11/12(木) 01:11   No:41753     
Title: Re:ポインタエラー    
すいません、また午後に調べます。


12ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,912ポイント)   Date: 2009/11/12(木) 01:18   No:41755     
Title: Re:ポインタエラー    

> 見た目が同じソースなのに実行結果が違いました

 見た目が同じでも細かい条件が違えば実行結果は異なります。
 といっても添付のソースを見た限りでは見た目いろいろ違うようですね。

 最大の違いは読み込んでる csv名が違います。


61ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(43,849ポイント)   Date: 2009/11/12(木) 06:37   No:41765     
Title: Re:ポインタエラー    
WinDiffで比較してみましたが違うのはload.cppとmain.cppだけでした。
main.cppのほうはコメントの違いだけでプログラム部分は同じです
違うのはload.cppで読み込むファイル名の0と1の違いだけですね


90ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,190ポイント)   Date: 2009/11/12(木) 07:21   No:41766     
Title: Re:ポインタエラー    
確かにcsvだけですね。直してみたらできました。
その部分は修正して直ったと思っていたんですが。ビルドしたのに。きっと操作ミスですよ。
なぜ、おかしくなったのかが気になります。
読み込みで、numが7になるまででcsvのデータは6個(enemy_data0.csv)しかないので、ひとつずつデータが
ずれていって敵一体分くらいおかしくなると思うのですが、実行結果は勝手に敵が登録されたり、見えない敵がたくさんいるようです。どうしてなんでしょうか?


129ポイント を手に入れた。

Name: softya  ..プログラマー(37,173ポイント)   Date: 2009/11/12(木) 13:01   No:41810     
Title: Re:ポインタエラー    
とりあえずリストを表示する処理を作りました。

EXFILE:

now_enter_enemy = head_enter_enemy;
while( now_enter_enemy != NULL ) {
TCHAR str[256];
_stprintf(str,TEXT("enter_enemy_ptr=%p count=%d pattern=%d knd=%d x=%f y=%f state=%d wait=%d hp=%d next=%p \n"),now_enter_enemy,
now_enter_enemy->count,
now_enter_enemy->pattern,
now_enter_enemy->knd,
now_enter_enemy->x,
now_enter_enemy->y,
now_enter_enemy->state,
now_enter_enemy->wait,
now_enter_enemy->hp,
now_enter_enemy->next);
OutputDebugString( str );
now_enter_enemy = now_enter_enemy->next;
}

私の環境での実行結果。
enter_enemy_ptr=01CF4C78 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=01CF4CF8
enter_enemy_ptr=01CF4CF8 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=01CF4D78
enter_enemy_ptr=01CF4D78 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=60 wait=4 hp=0 next=01CF4DF8
enter_enemy_ptr=01CF4DF8 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=01CF4E78
enter_enemy_ptr=01CF4E78 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=01CF4EF8
enter_enemy_ptr=01CF4EF8 count=0 pattern=80 knd=60 x=7.000000 y=0.000000 state=200 wait=40 hp=0 next=01CF4F78
enter_enemy_ptr=01CF4F78 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=01CF4FF8
enter_enemy_ptr=01CF4FF8 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=01CF5078
enter_enemy_ptr=01CF5078 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=01CF50F8
enter_enemy_ptr=01CF50F8 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=-842150451 wait=-842150451 hp=-842150451 next=00000000

なぜ、このリストでおかしくなるかは自分でトレースしてみてください。


430ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,658ポイント)   Date: 2009/11/12(木) 14:08   No:41818     
Title: Re:ポインタエラー    
%pはポインタを表すのですか・・・%dとは違いますね。
トレースって処理を追いかけるってことですよね、
patternで関数ポインタがおかしくなって、きっとポインタがほかのアドレスを書き変えたりして、
いるんでしょうか?


104ポイント を手に入れた。

Name: softya  ..プログラマー(37,606ポイント)   Date: 2009/11/12(木) 15:44   No:41823     
Title: Re:ポインタエラー    
>%pはポインタを表すのですか・・・%dとは違いますね。
%pはポインタです。

>トレースって処理を追いかけるってことですよね、
そうです。

>patternで関数ポインタがおかしくなって、きっとポインタがほかのアドレスを書き変えたりして、
いるんでしょうか?
ENEMY_PATTERN_MAXでガードが掛かっているので大丈夫じゃないですか?
安易な想像をめぐらせず、ちゃんと調べてみましょう。
ちなみに、関数ポインタ配列の添え字外をアクセスして関数でないアドレスを関数として呼び出そうとしたら、ほぼ100%例外で異常終了します。試しにENEMY_PATTERN_MAXのガードを外して見たら分かります。

>きっとポインタがほかのアドレスを書き変えたりしているんでしょうか?
何が何を書き換えると言うのでしょう?
ポインタを読み出しているだけでは何もおきません。
書き換えるとしたらポインタを使った代入処理の部分です。
なので、リスト構造体の変数を書き換えている部分で、リスト構造体のポインタが異常な値なら異常な書き換えが起こりますが、それ以外の場合は大丈夫です。
ゲーム機(ファミコンやPSP)等と違い大半はOSがガードしてくれますよ。


433ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(69,705ポイント)   Date: 2009/11/12(木) 16:15   No:41825     
Title: Re:ポインタエラー    
どんなことが起きているかわからないので、softyaさんのソースをenemy_enter()に組み込んでみたら、
明らかに、csvのデータ数とは違う数が出てきました。
やっぱりcsvの読み込み一つでここまで変わるもんですね。

enter_enemy_ptr=02191288 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191308
enter_enemy_ptr=02191308 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=02191388
enter_enemy_ptr=02191388 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=60 wait=4 hp=0 next=02191408
enter_enemy_ptr=02191408 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=02191488
enter_enemy_ptr=02191488 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=02191508
enter_enemy_ptr=02191508 count=0 pattern=80 knd=60 x=7.000000 y=0.000000 state=200 wait=40 hp=0 next=02191588
enter_enemy_ptr=02191588 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=02191608
enter_enemy_ptr=02191608 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191688
enter_enemy_ptr=02191688 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=02191708
enter_enemy_ptr=02191708 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=-842150451 wait=-842150451 hp=-842150451 next=00000000
enter_enemy_ptr=02191308 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=02191388
enter_enemy_ptr=02191688 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=02191708
enter_enemy_ptr=02191488 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=02191508
enter_enemy_ptr=02191288 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191388
enter_enemy_ptr=02191608 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191708
enter_enemy_ptr=02191588 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=02191708
enter_enemy_ptr=02191408 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=02191508


1,047ポイント を手に入れた。



Name: きゃもり  ..ぴよぴよ(127ポイント)   Date: 2009/11/09(月) 21:44   No:41619       
Title: テトリスを作りたい    
超初心者です。
簡単なテトリスをDXライブラリで作ってみたいと思っていますが何をどうしたらいいのか分かりません;
取り合えず、ブロックを文字として表示している方がいましたが画像として表示したいです。
何を宣言してどんな関数を作ったり使ったりするのか。
その辺を教えていただきたいです。よろしくお願いします!



127ポイント を手に入れた。


Name: dic  ..プログラマー(36,936ポイント)   Date: 2009/11/09(月) 23:18   No:41622     
Title: Re:テトリスを作りたい    
これ読破してください
http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EC-%E7%AC%AC2%E7%89%88-ANSI%E8%A6%8F%E6%A0%BC%E6%BA%96%E6%8B%A0-B-W-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4320026926/ref=sr_1_2?ie=UTF8&s=books&qid=1257776255&sr=8-2


107ポイント を手に入れた。

Name: softya  ..プログラマー(33,953ポイント)   Date: 2009/11/09(月) 23:47   No:41627     
Title: Re:テトリスを作りたい    
ゲームプログラミングの館はご覧になりましたか?
http://dixq.net/g/
参考になる知識が色々とありますので、まず読んでいただいて一命令毎に何をしているか理解なさってください。で、ソースを改造して落ちてくるブロックの処理をまず作ってみてはどうでしょうか?


31ポイント を落としてしまった。

Name: ちゃお  ..かけだし(2,141ポイント)   Date: 2009/11/10(火) 01:37   No:41629     
Title: Re:テトリスを作りたい    
http://codezine.jp/article/detail/207
ここはどうでしょうか


22ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(112,191ポイント)   Date: 2009/11/10(火) 03:49   No:41634     
Title: Re:テトリスを作りたい    
>取り合えず、ブロックを文字として表示している方がいましたが画像として表示したいです。

おそらく、自分が提案して、SooAさんに知恵をいただき、
自分で書き換えていったやつのことかなっ?
っと勝手に思ってしまいますが。(添付ファイル)
ただ、これはテトリスとは全く関係なく、テトリスのオープニング画面
なんですけどね^^;
画像として表示したいのよく意味がわからないので、
説明を追記してください。

>何を宣言してどんな関数を作ったり使ったりするのか。
宣言はグローバル変数のことですか?それは自分の組み方次第です。
関数というよりは、どのようなものが最低限必要かを挙げてみます。

・キー入力を制御
・ミノを制御
・ゲームフィールドを制御
・ゲーム全体を制御

ですかね。
ミノを制御でしたら、
・ミノを生成する関数
・現在登場しているミノを回転により変形させる関数
・ミノの情報更新(ポジション等)関数

・・・

など、あげたらたくさんあります。
正直、テトリスはプログラミングをしたことのない人にとっては、
1からすべて自分で組むことは、結構難しいかと思います。
でもやる気があればなんとでもなりますw
がんばってください。

Windowsプログラミング研究所
ttp://www13.plala.or.jp/kymats/

↑のページは結構詳しく書いています。
コピペでテトリスが出来上がります。(Dxライブラリ不要)
参考にしてみてください


20ポイント を手に入れた。

Name: バグ  ..ハッカー(173,917ポイント)   Date: 2009/11/10(火) 06:36   No:41637     
Title: Re:テトリスを作りたい    
DXライブラリは使ってませんが…。開発言語はC++でWINAPIを使用したコンソールアプリです。たしかソース付で置いてあったと思いますんで、よかったらどうぞ…

http://park.geocities.jp/bugbugbugbug2001/


67ポイント を手に入れた。

Name: Naohiro19  ..ぴよぴよ(771ポイント)   Date: 2009/11/10(火) 17:41   No:41661     
Title: Re:テトリスを作りたい    
こんな動画もありました。

[【プログラミング】テトリスを1時間強で作ってみた【実況解説】]
http://www.nicovideo.jp/watch/sm8517855


59ポイント を落としてしまった。

Name: きゃもり  ..ぴよぴよ(181ポイント)   Date: 2009/11/12(木) 15:55   No:41824 解決!     
Title: Re:テトリスを作りたい    
みなさんどうもありがとうございます!!
見よう見まねですがなんとか頑張っていきたいです。
また質問に来るかもしれませんが…(苦笑)その時はよろしくお願いします。


54ポイント を手に入れた。



Name: 電気屋  ..入門者(2,804ポイント)   Date: 2009/11/12(木) 08:54   No:41772       
Title: ゲームパットを使うには?    
どうも、たびたびお世話になっています。
今回は、ゲームパットについてお聞きしたいと思っています。
ゲームパットからの入力データを得るにはどうしたらよいですか。一応ジョイパットのプログラムを参考にしたり、ほかのサイトのサンプルを使ったりして作成はしていますが、ゲームパットからの入力をうまく認識しません。サンプルをおいてくださると助かります。大変勝手なお願いですが、よろしくお願いします。

一応サンプルも貼り付けておきます。
要点
・ゲームパットから入力されたデータを確認する

最終目的
・キャラクターを動かす

使用コントローラ
・ELECOM(JC-2410TWH)


192ポイント を手に入れた。


Name: 御津凪 [URL]  ..ハッカー(120,046ポイント)   Date: 2009/11/12(木) 12:22   No:41800     
Title: Re:ゲームパットを使うには?    
MSDN の下記のページにジョイスティック(ゲームコントローラのこと)を使用するためのチュートリアルがあります。
http://msdn.microsoft.com/ja-jp/library/bb206283%28VS.85%29.aspx

一応、こちらでも適当なサンプルを書いてみますが…。


27ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(120,280ポイント)   Date: 2009/11/12(木) 14:28   No:41819     
Title: Re:ゲームパットを使うには?    
書いてきました。
コードが長いので添付しておきます。

一応、自作ライブラリから一部変更しての書き下ろしなので、何か問題があるかもしれません。

とりあえず、これに沿ってプログラムを組めば動くはずです。


なお、ジョイパッドの方向キーの状態を取得する場合、 DIJOYSTATE2(DIJOYSTATE) 構造体の lX, lY メンバ変数で下記のような条件で取得できます。

上: lY < 0 の時
下: lY > 0 の時
左: lX < 0 の時
右: lX > 0 の時

このとき、PSコントローラのようなスティックでも操作できるようになるのですが、
スティックはなにも触らなくても必ず 0 になることはなく、若干の偏りが発生するため、
上記のような判定でキャラクターを動かすようにしていた場合は、スティックが有効になったとたん、
勝手に移動することになってしまいます。

これを防ぐためには遊びの部分を作ることで対処します。
だいたい +-300 程度(軸の可動幅量を +-1000 とした時)でいいでしょう。
つまり、

上: lY < -300 の時
下: lY > +300 の時
左: lX < -300 の時
右: lX > +300 の時

となります。



234ポイント を手に入れた。

Name: 電気屋  ..入門者(2,817ポイント)   Date: 2009/11/12(木) 15:30   No:41821 解決!     
Title: Re:ゲームパットを使うには?    
どうもありがとうございました。

13ポイント を手に入れた。

Name: 電気屋   Date: 2009/11/18(水) 14:13   No:417721258521239     
Title: Re:ゲームパットを使うには?    
プログラムを組んだのですが、うまくいきません。どこがいけなかったでしょうか?

プログラム
if ( Key[ KEY_INPUT_UP ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_UP ) == 1){ //上ボタンが押されたら
ch.muki=0;} //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_LEFT ) == 1){ //左ボタンが押されたら
ch.muki=1;} //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_DOWN ) == 1){ //下ボタンが押されたら
ch.muki=2;} //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_RIGHT) == 1){ //右ボタンが押されたら
ch.muki=3;} //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる


4方向に歩くプログラムのKEY_INPUTの後にGetJoypadInputStateをいれて試していますが、DAWNしか反応しません。コントローラがいけないのかと、コントロールパネルで動作確認をしたのですが、どこにも異常はありませんでした。




Name: 初心者A  ..かけだし(1,665ポイント)   Date: 2009/11/11(水) 11:20   No:41704       
Title: スタックの実現    
大学の課題でスタックを実現せよというものです。
組むには組んだのですが、実行結果が思ったものになりません。
アドバイスをお願いします。
Cの知識は入門書レベル、環境はVine Linuxでgccでコンパイルしています。
欲しい実行結果:
入力
a
b
c
EOF
c
b
a


#include <stdio.h>

typedef struct {
char box[100];
int top;
} st;

void create(st *s);
char top(st *s);
void pop(st *s);
void push(char x, st *s);

int main(void)
{
st *s;
int x;

create(s);

while ((x = getchar()) != EOF){
push(x, s);
}

printf("%c\n", top(s));
pop(s);
printf("%c\n", top(s));
pop(s);
printf("%c\n", top(s));

return 0;

}


void create(st *s)
{
s->top = 0;
}

char top(st *s)
{
return (s->box[s->top]);
}

void pop(st *s)
{
(s->top)--;
}

void push(char x, st *s)
{
(s->top)++;
s->box[(s->top)] = x;
}


448ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(116,292ポイント)   Date: 2009/11/11(水) 11:32   No:41705     
Title: Re:スタックの実現    
pushのインクリメントするタイミングが変です。

s->box[(s->top)] = x;
(s->top)++;

ではないですか?


17ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(116,302ポイント)   Date: 2009/11/11(水) 11:33   No:41706     
Title: Re:スタックの実現    
top関数も変ですね。


10ポイント を手に入れた。

Name: 初心者A  ..かけだし(1,805ポイント)   Date: 2009/11/11(水) 11:42   No:41708     
Title: Re:スタックの実現    
インクリメントを後にするとprintfで表示するときに
文字が何も入ってない所を参照してしまわないでしょうか。
後top関数はスタックの現在の一番上の文字を返す関数のつもりで
書いていますが、これがおかしいのでしょうか。


2倍のポイントを手に入れた! 140ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(116,473ポイント)   Date: 2009/11/11(水) 11:55   No:41709     
Title: Re:スタックの実現    
> インクリメントを後にするとprintfで表示するときに
> 文字が何も入ってない所を参照してしまわないでしょうか。
> 後top関数はスタックの現在の一番上の文字を返す関数のつもりで
> 書いていますが、これがおかしいのでしょうか。

そうですね。
ですので、全体的な整合性を見直す必要があります。
普通、スタックは上位アドレスから下位アドレスに向かって延びるようにします。
具体的には、

void create(st *s)
{
s->top = sizeof(s->box)/sizeof(s->box[0]);
}

void push(char c, st *s)
{
--s->top;
st->box[s->top] = c;
}

char top(st *s)
{
return s->box[s->top];
}

void pop(st *s)
{
++s->top;
}

のようにです。


171ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,346ポイント)   Date: 2009/11/11(水) 12:40   No:41712     
Title: Re:スタックの実現    
スタックのメモリ確保がされてないのでは?
それに、入力は
abc[EOF]のように、改行を入れてはいけないのでは?


61ポイント を手に入れた。

Name: 初心者A  ..かけだし(2,008ポイント)   Date: 2009/11/11(水) 16:18   No:41716     
Title: Re:スタックの実現    
>スタックのメモリ確保がされてないのでは?
st *s を宣言するだけでは駄目ということでしょうか?

>abc[EOF]のように、改行を入れてはいけないのでは?
一文字ずつ積むイメージでそういう入力をしているのですが、これもマズいのでしょうか。
1文字入れる→pushで配列の番号が進むをwhileで繰り返しているつもりです。

>たかぎさん
具体的な解答ありがとうございます。
しかし、関数をその形に書き換えて再度実行を試みましたが、結果は変わりませんでした。


203ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,822ポイント)   Date: 2009/11/11(水) 18:34   No:41722     
Title: Re:スタックの実現    
>st *s を宣言するだけでは駄目ということでしょうか?
ポインタはアドレスを格納する変数であり、これだけでは実際にスタック(構造体st)の
メモリが確保されたわけではないので、暴走する危険があります。

st stk;
st *s;
s=&stk;
で試してください。
ただ、この問題ではポインタにする必要はないのですが。
私なら
st s;
にしておいて、
pop(&s);
のようにするかも。


>一文字ずつ積むイメージでそういう入力をしているのですが、これもマズいのでしょうか。
>1文字入れる→pushで配列の番号が進むをwhileで繰り返しているつもりです。
改行だって文字です。改行もスタックに積んでしまいます。

たかぎさんのプログラムは間違ってません。
試しに、abc[EOF]と改行を入れずに入力してみてください。

改行も入れたいなら、改行はスタックに積まないようにプログラムします。




2倍のポイントを手に入れた! 476ポイント を手に入れた。

Name: 初心者A  ..かけだし(2,071ポイント)   Date: 2009/11/12(木) 15:08   No:41820 解決!     
Title: Re:スタックの実現    
解決しました。
>改行だって文字です。改行もスタックに積んでしまいます。
これが原因でした。今までの出力結果も理解出来ました。
解答ありがとうございました。


63ポイント を手に入れた。



Name: ひよこ  ..熟練のプログラマー(68,530ポイント)   Date: 2009/11/12(木) 10:36   No:41785       
Title: これって何を意味するんですか?    
これって何を意味するのでしょうか?教えてください。
HEAP[RyuJin.exe]: HEAP: Free Heap block 605a090 modified at 605a0bc after it was freed


44ポイント を手に入れた。


Name: Naohiro19  ..ぴよぴよ(858ポイント)   Date: 2009/11/12(木) 11:06   No:41792     
Title: Re:これって何を意味するんですか?    
>フリーヒープブロック605a090の変更は、605a0bcの後に解放されます。
という意味の英語です。


48ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,550ポイント)   Date: 2009/11/12(木) 11:09   No:41793     
Title: Re:これって何を意味するんですか?    
これがでるってことはなんかプログラムに影響を与えるのでしょうか?

20ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(44,352ポイント)   Date: 2009/11/12(木) 11:36   No:41797     
Title: Re:これって何を意味するんですか?    
以下のコードで同じような結果が得られます

int *a = (int*)malloc(40);
free(a);
a[1] = 9;

freeした領域に書き込んでるのではないでしょうか


40ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,574ポイント)   Date: 2009/11/12(木) 12:56   No:41809     
Title: Re:これって何を意味するんですか?    
やってはいけないことをしているってことですよね。

24ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(44,504ポイント)   Date: 2009/11/12(木) 13:09   No:41814     
Title: Re:これって何を意味するんですか?    
私はfreeやdeleteの後はポインタを初期化するようにしています
delete hoge;
hoge = NULL;
とか
free(fuga);
fuga = NULL;
こうすれば解放後の代入時にアクセス違反でブレークするのでバグが見つけやすくなります。


73ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,554ポイント)   Date: 2009/11/12(木) 13:43   No:41817     
Title: Re:これって何を意味するんですか?    
これって上の表示が出たところが怪しいですか?

20ポイント を落としてしまった。



Name: やばさ  ..ぴよぴよ(21ポイント)   Date: 2009/11/11(水) 23:10   No:41746       
Title: 8方向    
シューティング系でどうやって8方向にすることができるのですか?

21ポイント を手に入れた。


Name: TKOZ  ..プログラマー(35,967ポイント)   Date: 2009/11/12(木) 13:03   No:41812     
Title: Re:8方向    
弾の移動でしょうか?
それとも、自機の移動でしょうか?

一応、両方書きます。

まず、自機の移動から書きます。

キーが押されている角度を求めます。int KeyAngle();//キーの押された角度を求める関数を作る
その後、#define RAD (3.14159265/180)と定義して、
x+=cos(KeyAngle*RAD)*speed;
y-=sin(KeyAngle*RAD)*speed;
とすれば、okです。

弾の移動は、
上、右上、右、右下、下、左下、左、左上とあるのですが、
それぞれ、移動角度を
90°45° 0° 315° 270°225°180°135°とし、
テーブルを作ります。int angle[8]={90,45,0,315,270,225,180,135};
x+=cos(angle[UPRIGHT)*RAD)*speed;
y-=sin(angle[UPRIGHT)*RAD)*speed;
とすればokです。分かりにくい点がありましたら、返信ください。


274ポイント を手に入れた。



Name: good!!  ..ぴよぴよ(246ポイント)   Date: 2009/11/12(木) 09:58   No:41779       
Title: 教えてください。part3    
以下の問題のC言語のプログラミングがわかりません。教えてください。
・「アスタリスクの数(*)」を読み込んで、その数だけアスタリスクを表示するプログラムを作成せよ。
以下のプロントタイプ宣言により

示される関数を作成し、これを用いること。
void draw_star(int number);
ここで関数 draw_starは、アスタリスクの数numberを受け取り、その数だけアスタリスクを表示する関数である。



72ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(116,968ポイント)   Date: 2009/11/12(木) 11:03   No:41789     
Title: Re:教えてください。part3    
> その数だけアスタリスクを表示するプログラムを作成せよ。

処理系が不明ですので、表示するための一般的な方法は存在しません。

> 以下のプロントタイプ宣言により

プロントタイプ宣言とは?


36ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(117,314ポイント)   Date: 2009/11/12(木) 11:48   No:41798     
Title: Re:教えてください。part3    
分からない部分は勝手に解釈して作ってみました。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>

void draw_star(int number)
{
while (number-- > 0)
fputs("アスタリスク", stdout);
}

int main(void)
{
int number = 0;
int c;

while ((c = getchar()) != '\n')
{
if (!isdigit(c)) abort();
if (number > INT_MAX / 10) abort();
number = number * 10 + (c - '0');
}
draw_star(number);
}

こんな感じでどうでしょうか?


191ポイント を手に入れた。

Name: good!!  ..ぴよぴよ(687ポイント)   Date: 2009/11/12(木) 12:24   No:41803 解決!     
Title: Re:教えてください。part3    
ありがとうございました。

16ポイント を手に入れた。



Name: good!!  ..ぴよぴよ(26ポイント)   Date: 2009/11/12(木) 09:51   No:41777       
Title: 教えてください.part1    
以下の問題のC言語のプログラミングがわかりません。教えてください。
・偶数の入力を要求し、偶数が入力された場合には何も表示せずに終了し、偶数が入力されなかった場合には「入力ミスです!」と表示して

終了するプログラムを作成せよ。
尚、以下のプロントタイプ宣言により示される関数を作成し、これを用いること。
void error_message(void)
ここで、関数 error_messageは、「入力ミスです!」と表示する関数であり、引数と返却値を持たない関数である。



26ポイント を手に入れた。


Name: toyo  ..熟練のプログラマー(44,292ポイント)   Date: 2009/11/12(木) 10:06   No:41782     
Title: Re:教えてください.part1    
これもpart5まで続くんでしょうか
丸投げの質問に回答を全部素直に教えることはないのであなたの出来る部分を教えてください
int main(void)
{
return 0;
}
ぐらいはかけますよね
プロントタイプではなくてプロトタイプ宣言ですがこの意味はわかりますか
同じ問題の画像に「ヒントに教科書のリスト5-2を参考」にって書いてあったのですがどのようなリストなのでしょうか


115ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(44,312ポイント)   Date: 2009/11/12(木) 10:07   No:41783     
Title: Re:教えてください.part1    
回答かいてたら本当にpart5まであった

20ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(116,819ポイント)   Date: 2009/11/12(木) 10:50   No:41787     
Title: Re:教えてください.part1    
> 偶数が入力されなかった場合には「入力ミスです!」と表示して

処理系が不明ですので、表示するための一般的な方法は存在しません。


19ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(117,123ポイント)   Date: 2009/11/12(木) 11:34   No:41796     
Title: Re:教えてください.part1    
よく分からない部分は勝手に解釈して作ってみました。

#include <stdio.h>

void error_message(void)
{
fputs("入力ミスです!\n", stderr);
}

int main(void)
{
char c;
if (scanf("偶数%c", &c) < 1 || c != '\n')
error_message();
}

こんな感じでどうでしょうか?


102ポイント を手に入れた。

Name: good!!  ..ぴよぴよ(671ポイント)   Date: 2009/11/12(木) 12:24   No:41802 解決!     
Title: Re:教えてください.part1    
ありがとうございました。

9ポイント を落としてしまった。



Name: good!!  ..ぴよぴよ(174ポイント)   Date: 2009/11/12(木) 09:55   No:41778       
Title: 教えてください。part2    
以下の問題のC言語のプログラミングがわかりません。教えてください。
・生まれた月を読み込むプログラムを作成せよ。
尚、以下のプロントタイプ宣言により示される関数を作成し、これを用いること。

int get_month(void);
ここで、関数 get_monthは、月を読み込み、その値を返す関数である。尚、関数 get_monthでは、0以下または13以上の値が入力された場合は再入力を促し、1以上12以下の値が入力されるまで処理を繰り返させること。



148ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(116,932ポイント)   Date: 2009/11/12(木) 11:01   No:41788     
Title: Re:教えてください。part2    
> 以下のプロントタイプ宣言により示される関数を作成し、

プロントタイプ宣言とは?
それはおいておいて、こんな感じでしょうか?


#include <stdio.h>
#include <stdlib.h>

int get_month(void)
{
char s[3];
retry:
if (scanf(" %2[0123456789]", s) == 1)
{
long month = strtol(s, NULL, 10);
if (1 <= month && month <= 12)
return month;
}
scanf("%*[^\n]");
goto retry;
}

int main(void)
{
get_month();
}

月を読み込んでどうするかは要求されていませんので、そのまま捨てています。


113ポイント を手に入れた。

Name: good!!  ..ぴよぴよ(680ポイント)   Date: 2009/11/12(木) 12:23   No:41801 解決!     
Title: Re:教えてください。part2    
ありがとうございました。

16ポイント を手に入れた。



Name: tiruving  ..かけだし(1,462ポイント)   Date: 2009/11/12(木) 11:14   No:41794       
Title: 詰んでしまった・・・?    
[1] 質問文
 自分は今友人と学校のパソコンを使ってゲームを作っています。
 知識をまったく持ち合わせて居ない状態だったので、ネットで調べならがら形だけでもとタイトル画面を作っ ていました。
 かなり簡素でしたが一応形だけできたので、しばらく文化祭などの学校行事に打ち込んでいてゲーム制作から 離れていましたが、あらかた片付いたのでまたゲーム制作に手を出したところ、プログラムにエラーが出てい て起動しなくなってしまいました。
 一応エラー一覧に出ているメッセージに従っていくつかエラーは改善できたのですが、調べてもよくわからな いエラーが出てきたので質問しようと思った次第です。
 ソースは
 
#include "DxLib.h"

int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;

}

void char_disp(int White,int y){

    LoadGraphScreen( 0 , 0 , "back.png", FALSE );
LoadGraphScreen( 250 , y , "hand.png" , TRUE ) ;
LoadGraphScreen( 280 , 300 , "New Game.png", TRUE ) ;
LoadGraphScreen( 280 , 320 , "Continue.png", TRUE ) ;
LoadGraphScreen( 280 , 340 , "option", TRUE ) ;
LoadGraphScreen( 280 , 360 , "end.png", TRUE ) ;

}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int Key[256];
int White , y=300;

ChangeWindowMode(TRUE);
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;

White = GetColor( 255 , 255 , 255 ) ;

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

char_disp(White,y);

if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_UP]%5==0 && Key[KEY_INPUT_UP]>30)){

y-=20;
if(y==280)
y=360;
}

if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
y+=20;
if(y==380)
y=300;
}

ScreenFlip();//裏画面反映
}

DxLib_End();
return 0;
出ているエラーは
error BK1506::No such file or directory
error C2065:' ':定義されていない識別子です
 error C2146:構文エラー:';'が、識別子'LoadGraphScreen'の前に必要です
 error C3872: '0x3000': この文字を識別子で使用することはできません ←二つ連続で一覧に並んでます
 fatal error C1075: 左側 中かっこ '{' に対応するものが 'i:\サンプルプログラム実行用フォルダ\test.cpp(26)' で見つかる前に EOF が検出されました。

[2] 環境  
 OS : Windows
 コンパイラ名 : Microsoft Visual Studio 2005
[3] その他
 ・どの程度C言語を理解しているか
 初心者です。
 ・ライブラリを使っている場合は何を使っているか
   DxLibを使っています

 文が拙い上に長文になってしまい非常に読みにくいとは思いますが、助言をお願いいたします。


1,462ポイント を手に入れた。


Name: toyo  ..熟練のプログラマー(44,431ポイント)   Date: 2009/11/12(木) 12:06   No:41799     
Title: Re:詰んでしまった・・・?    
”error C3872: '0x3000': この文字を識別子で使用することはできません”
このエラーは全角の空白文字があるときのエラーです
    LoadGraphScreen( 0 , 0 , "back.png", FALSE );
の先頭にあります

fatal error C1075: 左側 中かっこ '{' に対応するものが 'i:\サンプルプログラム実行用フォルダ\test.cpp(26)' で見つかる前に EOF が検出されました。

はプログラムの一番最後に
}
がないためです


79ポイント を手に入れた。

Name: tiruving   Date: 2009/11/19(木) 09:57   No:417941258592220 解決!     
Title: Re:詰んでしまった・・・?    
素早く返答していただきありがとうございます。
指示どおりに操作したところ、何度か躓きはしましたがなんとかバグを消せました。
週一くらいでしかパソコンを触れないため返事が遅れてしまったことをお詫び申し上げます。




Name: オラウー  ..ぴよぴよ(394ポイント)   Date: 2009/11/11(水) 21:01   No:41733       
Title: エラーについて    
こんばんは

Borland C++のBCC Developerで




#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}

DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ

WaitKey() ; // キー入力待ち

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}

とこのように打ち込んだのですが



> c:\borland\bcc55\Bin\make.exe -fDebug\test.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -eDebug\test.exe Debug\DrawPixel.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)

** error 1 ** deleting Debug\test.exe

Make End !! (Elapsed time 0:01.407)

という結果が出ました
エラーが出てしまい
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
これを見ても何をどうすればいいかわからないので教えてください


394ポイント を手に入れた。


Name: オラウー  ..ぴよぴよ(869ポイント)   Date: 2009/11/11(水) 21:19   No:41734     
Title: エラーについて    
ごめんなさい、早速利用規約に反してました
改めて同じ質問をします

Borland C++のBCC Developerで




<pre>
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}

DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ

WaitKey() ; // キー入力待ち

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}
<pre/>

とこのように打ち込んだのですが



> c:\borland\bcc55\Bin\make.exe -fDebug\test.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -eDebug\test.exe Debug\DrawPixel.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)

** error 1 ** deleting Debug\test.exe

Make End !! (Elapsed time 0:01.407)

という結果が出ました
エラーが出てしまい
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
これを見ても何をどうすればいいかわからないので教えてください


475ポイント を手に入れた。

Name: オラウー  ..かけだし(1,247ポイント)   Date: 2009/11/11(水) 21:24   No:41736     
Title: エラーについて    
本当に本当にごめんなさい、また間違えてしまいました
再度同じ質問をします

Borland C++のBCC Developerで




 

#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}

DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ

WaitKey() ; // キー入力待ち

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}


とこのように打ち込んだのですが



> c:\borland\bcc55\Bin\make.exe -fDebug\test.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -eDebug\test.exe Debug\DrawPixel.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)

** error 1 ** deleting Debug\test.exe

Make End !! (Elapsed time 0:01.407)

という結果が出ました
エラーが出てしまい
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
これを見ても何をどうすればいいかわからないので教えてください



378ポイント を手に入れた。

Name: オラウー  ..かけだし(1,252ポイント)   Date: 2009/11/11(水) 21:33   No:41737     
Title: エラーについて    
どうしても字下げができない・・・

すいません


5ポイント を手に入れた。

Name: オラウー  ..かけだし(1,258ポイント)   Date: 2009/11/12(木) 11:24   No:41795 解決!     
Title: エラーについて    
解決しました

6ポイント を手に入れた。



Name: good!!  ..ぴよぴよ(664ポイント)   Date: 2009/11/12(木) 10:01   No:41781       
Title: 教えてください。part5    
以下の問題のC言語のプログラミングがわかりません。教えてください。
・「誕生の月と」と「現在の月」を入力し、誕生日まで何ヵ月あるかを表示するプログラムを作成せよ。
尚、以下のプロントタイプ宣言により

示される関数を作成し、これを用いること。
void error_message(void)
int get_month(void)
ここで、関数 error_messageは、「入力ミスです!」と表示する関数であり、引数と返却値を持たない関数である。ただし、今回は、関数 get_monthの中で、関数 error_messageを呼び出し、これを用いて、「入力ミスです!」と表示させること。



224ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(117,021ポイント)   Date: 2009/11/12(木) 11:05   No:41791     
Title: Re:教えてください。part5    
> 誕生日まで何ヵ月あるかを表示するプログラムを作成せよ。

処理系が不明ですので、表示するための一般的な方法は存在しません。

> 以下のプロントタイプ宣言により

プロントタイプ宣言とは?


23ポイント を手に入れた。



Name: good!!  ..ぴよぴよ(440ポイント)   Date: 2009/11/12(木) 09:59   No:41780       
Title: 教えてください。part4    
以下の問題のC言語のプログラミングがわかりません。教えてください。
・2つの点の座標を入力し、2点間の距離を表示するプログラムを作成せよ。
尚、以下のプロントタイプ宣言により示される関数を作成し、

これを用いること。
double distance(int x1,int y1,int x2,int y2)
ここで、関数 distanceは、1つめの点のx座標x1とy座標y1,2つめの点のx座標x2とy座標y2を受け取り、2点間の距離を返す関数である。尚、平方根の計算には、数学関数 sqrtを用いること。



194ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(116,998ポイント)   Date: 2009/11/12(木) 11:05   No:41790     
Title: Re:教えてください。part4    
> 2点間の距離を表示するプログラムを作成せよ。

処理系が不明ですので、表示するための一般的な方法は存在しません。

> 以下のプロントタイプ宣言により

プロントタイプ宣言とは?


30ポイント を手に入れた。



Name: TERU  ..かけだし(1,292ポイント)   Date: 2009/11/11(水) 16:56   No:41717       
Title: 数字の後のfとは    
こちらのサイトでサンプルを見ながら学習しているのですが、
double型の数字にくっついているfの意味がわかりません。
うまくググることもできないので、教えて下さい。

こんな感じで使われています。
 

if(Key[KEY_INPUT_LEFT]==1){
Player.x-=4.0f;
if(Player.x<10.0)
Player.x=10.0;
}


90ポイント を手に入れた。


Name: YuO  ..プログラマー(35,233ポイント)   Date: 2009/11/11(水) 16:58   No:41718     
Title: Re:数字の後のfとは    
fはfloat型の定数のためのサフィックス (接尾辞) です。
# double型にサフィックスはありません。

double型の式中やdouble型への代入 (これも式ですが) で使うのは意味がないですが,
float型の式中やfloat型への代入では意味を持ちます。


62ポイント を落としてしまった。

Name: TERU  ..かけだし(1,311ポイント)   Date: 2009/11/12(木) 10:35   No:41784 解決!     
Title: Re:数字の後のfとは    
float型への代入に使うのですか。
ありがとうございます。


19ポイント を手に入れた。



Name: 23ッッッッッ☆ [URL]  ..ぴよぴよ(324ポイント)   Date: 2009/11/12(木) 03:02   No:41763       
Title: 関数のプログラミング(2)    
上記のURLの写真に記載されている問題の、C言語の関数のプログラミングが作れないのでできるだけ詳細に教えてください!!11月12日(木)の内に回答がもらえたら嬉しいです!!よろしくお願いします!

92ポイント を手に入れた。


Name: gero  ..ぴよぴよ(3ポイント)   Date: 2009/11/12(木) 03:38   No:41764     
Title: Re:関数のプログラミング(2)    
なにこれ…荒らし?

3ポイント を手に入れた。

Name: バグ  ..ハッカー(174,008ポイント)   Date: 2009/11/12(木) 07:36   No:41767     
Title: Re:関数のプログラミング(2)    
携帯からなんでリンク先は見られないけど、せめて問題文くらいは手書きしてほしいし、その問題の何が分からないのかをできるだけ詳細に記述してほしいし、あなたがC言語に対してどの程度の理解があるかも分かりませんし…

何が言いたいのかを簡潔にするとですね。

投稿規約を熟読しましょうね。

の一言に集約される訳ですわ。


91ポイント を手に入れた。

Name: Dixq (管理人)  ..ウィザード(1,082,019ポイント)   Date: 2009/11/12(木) 08:03   No:41768     
Title: Re:関数のプログラミング(2)    
う、平日昼は編集が出来ない;

こんなにいくつもトピを立てる意味あるのでしょうか・・?
しかし、、(1)は無いのかな^^;


Name: Naohiro19  ..ぴよぴよ(810ポイント)   Date: 2009/11/12(木) 08:24   No:41771     
Title: Re:関数のプログラミング(2)    
質問者に申し訳ありませんが、
こんな質問には誰も答えたくありませんね。


39ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(44,177ポイント)   Date: 2009/11/12(木) 09:05   No:41773     
Title: Re:関数のプログラミング(2)    
上記URLが消えたみたいです
↓の問題でした
/////////////////////////
 以下に示すように,偶数の入力を要求し,偶数が入力された場合には何も表示せずに終了し,偶数が入力されなかった場合には「入力ミスです!」と表示して終了するプログラムを作成せよ.
 なお,以下のプロトタイプ宣言により示される関数を作成し,これを用いること.
void error_message(void)
ここで,関数 error_message は、「入力ミスです!」と表示する関数であり,引数と返却値を持たない関数である.
 (ヒント:教科書リスト5-2を参考にせよ)
-----------------------------------
偶数を入力してください:4 return
-----------------------------------
-----------------------------------
偶数を入力してください:5 return
入力ミスです!
-----------------------------------
/////////////////////////


328ポイント を手に入れた。

Name: softya  ..プログラマー(36,743ポイント)   Date: 2009/11/12(木) 09:26   No:41775     
Title: Re:関数のプログラミング(2)    
マルチポストの様です。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1432869164


47ポイント を手に入れた。



Name: Marin  ..入門者(3,551ポイント)   Date: 2009/11/08(日) 16:19   No:41596       
Title: キャラクターから弾が出るようなプログラム    
こんにちは。
前回、非常に丁寧に質問に答えて下さいまして、本当にありがとうございます。
キャラクターが歩くプログラムを作ることができました。

今回は、その歩いているキャラクターから弾を出すようなプログラムを作りたいのですが、
思ったように上手くいきません><

----------------------------------------------------------------------

#include "DxLib.h"

typedef struct{
int x,y,img,muki,aruki;
}ch_t;

struct shot{
int x,y;
int flag;
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16];
char Key[256];
ch_t ch;

int i,counter=0; //counter=発射してからのカウントをする変数。

struct shot tama[10]; //tamaを10個作る。

for(i=0;i<10;i++){ //初期化処理
tama[i].x=640/2; tama[i].y=480; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

while(1){
ClearDrawScreen(); //裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る

if( ProcessMessage() == -1 ) break ; //異常がおきたら終了

if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ

else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
for(i=0;i<10;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=8; //座標を8減らす
LoadGraphScreen( tama[i].x , tama[i].y , "shot.bmp" , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break;//Escボタンが押されたらブレイク

ScreenFlip() ;//裏画面データを表画面へ反映
}



if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =288;
ch.y =448;
ch.muki=0;
ch.aruki=0;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了



if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.x=ch.x-6,ch.muki=1,ch.aruki=1;
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.x=ch.x+6,ch.muki=3,ch.aruki=1;
else
ch.muki=0,ch.aruki=0;
if(ch.x<(-6)) //もし、キャラのX座標が-6以下になった場合
ch.x=(-6); //ch.xは0にする。
if(ch.x>614) //もし、キャラのX座標が614以上になった場合
ch.x=614; //ch.xは608にする


if( Key[ KEY_INPUT_UP ] == 1 )
ch.x=320;

int cnt;


cnt = (cnt+1)&0x07;
if(ch.aruki==1)
ch.img=image[ch.muki*4+(cnt/2)]; //画像をセット
else
ch.img=image[ch.muki*4];

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

---------------------------------------------------------------------------------

サンプルプログラムでは「image[1]」というデータを表示する訳なんですが、
それとは別に、「shot.bmp」と言う名前のファイルを表示させたいのです

エラーは無いのですが、なぜかコンパイルしても起動しません><
どこが悪いのかがわかりません;;

そして、多分このプログラムだとキャラクターから弾が出ないと思うのですが…
キャラクターから弾が出るようにするには


tama[i].x=640/2; tama[i].y=480; //座標代入



の部分を、
tama[i].x=ch.x; tama[i].y=ch.y;
に変えればいいのでしょうか?

あと、
DrawGraph と
LoadGraphScreen の
違いってなんでしょうか><

回答よろしくお願いします><


2,170ポイント を手に入れた。


Name: ひよこ  ..熟練のプログラマー(65,335ポイント)   Date: 2009/11/08(日) 17:08   No:41599     
Title: Re:キャラクターから弾が出るようなプログラム    
あれ、最終的な自分のプログラムの形がないですけど、それは置いておいて、
while(1)が
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Ke[KEY_INPUT_ESCAPE])
の前にあってそしてDxLib_Init()が使われていないのでwhile文の中は動けません。

一度、ゲームプログラミングの館を見てきたほうがいいかもしれません。


93ポイント を手に入れた。

Name: Marin  ..初心者(5,931ポイント)   Date: 2009/11/09(月) 04:19   No:41605     
Title: Re:キャラクターから弾が出るようなプログラム    
はい、いろいろプログラムをつぎこんだらわけがわからなくなってしまって><
言われた通り、プログラミングの館を見て確認してみました。

-------------------------------------------------------

#include "DxLib.h"

typedef struct{
int x,y,img,muki,aruki;
}ch_t;

struct shot{
int x,y;
int flag;
};




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16],i,counter=0;
char Key[256];
struct shot tama[10];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =288;
ch.y =448;
ch.muki=0;
ch.aruki=0;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

for(i=0;i<10;i++){ //初期化処理
★1 tama[i].x=ch.x; tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}




while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

★★★

if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.x=ch.x-6,ch.muki=1,ch.aruki=1;
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.x=ch.x+6,ch.muki=3,ch.aruki=1;
else
ch.muki=0,ch.aruki=0;
if(ch.x<(-6)) //もし、キャラのX座標が-6以下になった場合
ch.x=(-6); //ch.xは0にする。
if(ch.x>614) //もし、キャラのX座標が614以上になった場合
ch.x=614; //ch.xは608にする


if( Key[ KEY_INPUT_UP ] == 1 )
ch.x=320;

int cnt;


cnt = (cnt+1)&0x07;
if(ch.aruki==1)
ch.img=image[ch.muki*4+(cnt/2)]; //画像をセット
else
ch.img=image[ch.muki*4];

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

★2 if(KEY_INPUT_Z ==1){

if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ

else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
for(i=0;i<10;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=8; //座標を8減らす
LoadGraphScreen( tama[i].x , tama[i].y , "shot.bmp" , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
}





ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}


---------------------------------------------------------

★1の部分、

tama[i].x=ch.x; tama[i].y=ch.y; //弾が出てくところ

tama[i].x=640/2 を tama[i].x=ch.x に変更し、
キャラクターから弾が出てくるようにします。

★2の部分、
ゲームプログラミングの館「26. シューティング基本」で
必要だろうと思う場所をコピーペーストして
Zキーが入力されている時、この処理を行うようにしているのですが・・・

キャラクターは動くのですが、
Zキーを入力しても弾が発射されません><

★★★の部分に、
LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;
を入力して、背景を設定してみたのですが、
これだと重くなってキャラの動作が鈍くなってしまいました;



質問多くてすみません><

1.弾が発射されない
2.背景「back.bmp」を表示すると重くなってしまう

これらの対処法を教えて頂ければ幸いです><


2,380ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,431ポイント)   Date: 2009/11/09(月) 06:24   No:41607     
Title: Re:キャラクターから弾が出るようなプログラム    
LoadGraphScreenはメモリに読み込まず、何度も読み込み続けているので重くなります。
LoadGraphとDrawGraphを使うといいでしょう、これもゲームプログラミングの館に書いてあります。
★2 if(KEY_INPUT_Z ==1)と書いてありますが、中にif( Key[ KEY_INPUT_RETURN ] == 1 )があります。
Zは★2ではなくRETURNをZに書き変えればいいです。


96ポイント を手に入れた。

Name: Marin  ..初心者(8,245ポイント)   Date: 2009/11/10(火) 23:51   No:41690     
Title: Re:キャラクターから弾が出るようなプログラム    
おお!画像は

tamagazou = LoadGraph( "shot.bmp" ) ;

などのように一度メモリに読みこんで、「shot.bmp」をintとして表すやり方を知ることが出来ました!
結果、とても軽く動作するようになりました!

本当にいつもありがとうございます!

ところで、

弾のプログラムは弾のプログラムで、
歩くプログラムは歩くプログラムで、のように
それぞれのプログラムをcppファイルごとに分けたいのですが、
サンプルプログラム(12章)を見てみると、

main.cppには

case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
enemy_main();//敵処理メイン
graph_main();//描画メイン
stage_count++;
break;

と入力されている部分がありますが、
例えばcalc_ch()なんですが、
case 100の場合calc_chの処理を行う、次にch_moveの…と
続いていくことだと思います。

char.cppファイルに
void calc_ch(){

と入力されている部分がありますが、
この{}の中の処理を行うと言う意味ですよね?

弾の部分だけのプログラムをshot.cppとして保存したいのですが、
とりあえず、今出来ているプログラムがこれです。

---------------------------------------------------------

#include "DxLib.h"

typedef struct{
int x,y,img,muki,aruki;
}ch_t;

struct shot{
int x,y;
int flag;
};




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16],i,counter=0;
char Key[256];
struct shot tama[10];
ch_t ch;
int tamagazou;




if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理



ch.x =288;
ch.y =448;
ch.muki=0;
ch.aruki=0;



SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

tamagazou = LoadGraph( "shot.bmp" ) ;

if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.x=ch.x-6,ch.muki=1,ch.aruki=1;
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.x=ch.x+6,ch.muki=3,ch.aruki=1;
else
ch.muki=0,ch.aruki=0;
if(ch.x<(-6)) //もし、キャラのX座標が-6以下になった場合
ch.x=(-6); //ch.xは0にする。
if(ch.x>614) //もし、キャラのX座標が614以上になった場合
ch.x=614; //ch.xは608にする


if( Key[ KEY_INPUT_UP ] == 1 )
ch.x=320;

int cnt;


cnt = (cnt+1)&0x07;
if(ch.aruki==1)
ch.img=image[ch.muki*4+(cnt/2)]; //画像をセット
else
ch.img=image[ch.muki*4];

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

for(i=0;i<10;i++){ //初期化処理
tama[i].x=ch.x+6; tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

if(ch.aruki==0){

//★-----------------------------------------------------------------------★

if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ

else if( Key[ KEY_INPUT_Z ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
}

for(i=0;i<10;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=14; //座標を8減らす
DrawGraph( tama[i].x , tama[i].y , tamagazou , TRUE );//玉を描画
if(tama[i].y < 0){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}

//★-----------------------------------------------------------------------★

}


ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

--------------------------------------------------------------------------



2,314ポイント を手に入れた。

Name: Marin  ..初心者(7,270ポイント)   Date: 2009/11/10(火) 23:52   No:41691     
Title: Re:キャラクターから弾が出るようなプログラム    
長いと言われたので、2つにわけさせていただきます><


★---★の間のプログラムをshot_tama(); にして、

別のcppファイル、「shot.cpp」には

----------------------------------------------------------

#include "DXlib.h"

void shot_tama(){
struct shot{
int x,y;
int flag;
};
char Key[256];
struct shot tama[10];
int tamagazou;
tamagazou = LoadGraph( "shot.bmp" ) ;
int i,counter=0;
for(i=0;i<10;i++){ //初期化処理
tama[i].x=288; tama[i].y=480; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}
if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ

else if( Key[ KEY_INPUT_Z ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<10;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}


for(i=0;i<10;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=14; //座標を8減らす
DrawGraph( tama[i].x , tama[i].y , tamagazou , TRUE );//玉を描画
if(tama[i].y < 0){ //もし画面外まで来たら
tama[i].y=480; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
}

----------------------------------------------------------

色々めちゃくちゃではありますが・・・

ここでのエラーは、

「'shot_tama': 識別子が見つかりませんでした」
と出ました。これはshot_tama以外に、
ヘッダーファイルなどで何か準備するべきところがあるのでしょうか?

あと、赤字で囲ってあるプログラムについて、

-----------------------------------------------

for(i=0;i<10;i++){ //初期化処理
★1 tama[i].x=ch.x; tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

------------------------------------------------

このプログラムの位置についてなんですが、
前回の書き込みのプログラムの位置だと
これの前に

ch.x =288;
ch.y =448;

などの宣言があるので、
tama[i].xやtama[i].yなどが
288、448と代入されてしまい、
(288,448)の部分からしか弾が出ませんでした><

なので、今回は位置を変えてみたのですが、
この位置だとキャラクターの頭上には表示されますが、
飛ばずにすぐに消えてしまうようになりました><

いったいこのプログラムをどこに置けば
キャラクターの位置、すなわち(ch.x,ch.y)の座標から弾が出るように出来るのでしょうか><


975ポイント を落としてしまった。

Name: ひよこ  ..熟練のプログラマー(66,296ポイント)   Date: 2009/11/11(水) 11:02   No:41702     
Title: Re:キャラクターから弾が出るようなプログラム    
ファイルを分けるなら、extern 宣言がいります。
シューティングゲームの館を参考にしましょう。
これで実行は出来ますが、初期化、読み込み、描くなのでうまくいきません。
一回文法を勉強したほうがいいかもしれません。昔、私もすごい処理をしていました。


9ポイント を手に入れた。

Name: Marin  ..初心者(7,676ポイント)   Date: 2009/11/12(木) 02:40   No:41761     
Title: Re:キャラクターから弾が出るようなプログラム    
サンプルプログラムを見て、色々処理の整理の仕方を学んでいきたいと思います。

あの、

for(i=0;i<10;i++){ //初期化処理
tama[i].x=ch.x+8; tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

の位置を色々変えてはみたのですが、

Whileの{}の外に置くと弾はちゃんと動くのですが、
ch.x =288;
ch.y =448;
と宣言してしまっているので、弾が出てくる座標は常に(288.448)となってしまいます。

Whileの{}の中に入れると、
画像はきちんとキャラクターの上に表示されるのですが、
一瞬表示されるだけですぐに消えてしまいます。
これはどういうことでしょうか?


178ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(68,486ポイント)   Date: 2009/11/12(木) 09:12   No:41774     
Title: Re:キャラクターから弾が出るようなプログラム    
これが原因ですね。tama[i].x=288; tama[i].y=480; //座標代入
少し説明をします。
for(i=0;i<10;i++){ //初期化処理
tama[i].x=288; tama[i].y=480; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}
はすべての玉を初期化します。それをwhile文の中に置くと玉が飛んでいても、ループの度に消えます。
for(i=0;i<10;i++){
if(tama[i].flag==1){ //発射している玉なら
発射している玉を探して
tama[i].y-=14; //座標を8減らす
DrawGraph( tama[i].x , tama[i].y , tamagazou , TRUE );//玉を描画
描画します。
int tamagazou;
tamagazou = LoadGraph( "shot.bmp" ) ;
変数tamagazouを作りそこにshot.bmpをいれています。これは
Winmainのcppで宣言し読み込みましょう。
毎回読むとどんどん重くなります。
externを使って直しましょう。


296ポイント を手に入れた。



Name: Ma  ..上級者(20,330ポイント)   Date: 2009/11/10(火) 05:07   No:41635       
Title: mqo ファイルと透明化    
DXライブラリ Ver 3.00e
Visual C++ 2008 Express Edition
の環境で、簡単な3Dプログラムを組んでいる者です。

今回、メタセコ(ver2.4.9)で作ったモデルに透明なテクスチャをあてて、描画させようとしたのですが
どうも実際に描画してみるとメタセコでの表示とDXライブラリでの表示を一致させることができません。


モデルは、雪の結晶でただの面を両面化しています。
テクスチャー画像作成には、png,gif,jpg,tga 等をPhotoShopやSAIで用意しました。


『メタセコで、どうテクスチャを設定したか』
まず、材質設定からマッピングも模様の欄のところで以下の方法をこころみました。
 1.単純に模様のところに 透明度つきpngファイルを当てる。
  (メタセコの画面では成功、DXライブラリでは透明になるべきところが真っ黒に。)
 2.模様に、jpgファイルを割り当て、透明に白黒の bmp ファイルをあててみる。
  (メタセコの画面では成功、DXライブラリでは透明になるべきところが真っ黒に。)

画像サイズはすべて 256×256です。

模様を空欄にし、透明のところだけにテクスチャを指定すると、

 Load Texture Error : カラーチャンネル画像ファイル ..\\materials の読み込みに失敗しました
 Read Model Convert Error : テクスチャ snowg.png の読み込みに失敗しました

このようなメッセージが出力に表示されます。

ただしい、透明化の仕方のご教授お願いします。


459ポイント を手に入れた。


Name: Ma  ..上級者(20,672ポイント)   Date: 2009/11/10(火) 05:14   No:41636     
Title: 追記    

 メタセコのテクスチャーの欄では、DXライブラリでのプログラムから表示する場合
 ゲームの作業フォルダからの相対パスを指定するものだとばかり思っていたのですが、
 ファイル名だけでも参照できるのはなぜでしょうか?(mqoとjpg等が同フォルダにあるから?)

 それどころか、ファイルパスとしてでたらめなフォルダ名をつけても、ファイル名が正しければ
 画像がしっかり開けているのが不思議です。
 たとえば、(フォルダ afjegwogaso は存在してなくても)
afjegwogaso/snowg.png なんて指定してもしっかり開いてくれるんですよね・・・。


2倍のポイントを手に入れた! 342ポイント を手に入れた。

Name: Ma  ..上級者(20,692ポイント)   Date: 2009/11/11(水) 01:54   No:41695     
Title: Re:追記    
http://masao.s5.pf-x.net/download2/snow-fall.zip
ソース、画像、mqo 等追加しました。


20ポイント を手に入れた。

Name: pp  ..ぴよぴよ(24ポイント)   Date: 2009/11/11(水) 22:27   No:41742     
Title: Re:追記    
プログラムは実行してませんが恐らく描画順番の問題かと
地面や天井の後に雪を描画してみたら多分期待する結果になると思いますよ


24ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(459,606ポイント)   Date: 2009/11/11(水) 22:59   No:41744     
Title: Re:追記    

>mqoとjpg等が同フォルダにあるから?

 そのようです。
 基本的には mqoファイルで指定されているテクスチャのパスを信用して
ライブラリはアクセスにいきますが、見つからなかった場合は
(その位置が mqoのあるフォルダと別なら)mqoファイルのあるフォルダも
見に行くようです。


103ポイント を手に入れた。

Name: Ma  ..上級者(20,758ポイント)   Date: 2009/11/12(木) 01:17   No:41754 解決!     
Title: Re:追記    
> プログラムは実行してませんが恐らく描画順番の問題かと
>地面や天井の後に雪を描画してみたら多分期待する結果になると思いますよ

ビンゴでした!ありがとうございました。
もしかしたら、バグなのかもしれないのでDXライブラリの掲示板のほうに報告してきます。

>基本的には mqoファイルで指定されているテクスチャのパスを信用して
>ライブラリはアクセスにいきますが、見つからなかった場合は
>(その位置が mqoのあるフォルダと別なら)mqoファイルのあるフォルダも >
>見に行くようです。
やはりそうですよね、ありがとうございました。

これにて解決にさせていただきます。


66ポイント を手に入れた。



Name: yskey  ..入門者(4,192ポイント)   Date: 2009/11/10(火) 20:04   No:41670       
Title: 【戦略シミュ】ユニット管理方法でのリスト構造について    
どうもお世話になっています。yskeyです。
ただいまDxlibで戦略シミュを製作中なのですが、前回質問したとき、
ユニット(兵士、城、、、)の管理にリスト構造体を使用すればよいと聞きました、、、
そこでなんですが、リスト構造を作ったとしてどのように特定のデータを得ることができるのでしょうか?

構造体の中にint IDという変数を用意して最初から順に検索していき、目的のIDがあるところのデータを習得、、、

という感じですか?しかし、データが1000個ぐらいにまで膨大になって頭から検索は有効なんでしょうか?

そもそもリスト構造がまだまだ熟知できてないのでワケノワカランことを言っていたらご指摘ください・・・


245ポイント を手に入れた。


Name: softya  ..プログラマー(34,704ポイント)   Date: 2009/11/10(火) 20:43   No:41671     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
1000個ぐらいで、数値IDで検索するなら気にするほどの時間は掛かりません。
リスト構造を数値ID順に並べておけば、バイナリサーチも使えます。その他にもハッシュテーブルで検索とか、検索だけのリストポインタを持つとか、幾らでも高速化の手はありますから今は気にしなくて良いと思いますよ。


133ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(116,275ポイント)   Date: 2009/11/10(火) 20:53   No:41673     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
そもそもリスト構造にする必要なんかないのでは?
素直にstd::vectorを使っておけばよいと思います。


21ポイント を手に入れた。

Name: yskey  ..入門者(4,255ポイント)   Date: 2009/11/10(火) 21:05   No:41675     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
>>softayさん
>>たかぎさん
ありがとうございます。
C++は最近手を出したばかりなので知りませんでした。
C++って結構便利そうですね・・・


63ポイント を手に入れた。

Name: yskey  ..入門者(4,408ポイント)   Date: 2009/11/10(火) 21:27   No:41676     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
ところでなんですが
DxLibを使う時、
<stdio.h>や<math.h>をインクルードする必要はなぜないんですか?
<DxLib.h>内ですべてインクルードされているのでしょうか?

vectorコンテナを使うとき<vector>はインクルードする必要はあるみたいなのですが・・・
C++系のインクルードはされてないって事ですか?


153ポイント を手に入れた。

Name: softya  ..プログラマー(35,410ポイント)   Date: 2009/11/10(火) 22:11   No:41679     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
>DxLibを使う時、<stdio.h>や<math.h>をインクルードする必要はなぜないんですか?
><DxLib.h>内ですべてインクルードされているのでしょうか?
DxLibが使っているからインクルードされているんでしょうね。
何でも無闇にインクルードするとコンパイルが遅くなりますから。

>vectorコンテナを使うとき<vector>はインクルードする必要はあるみたいなのですが・・・
>C++系のインクルードはされてないって事ですか?

DXライブラリは、C++系用のライブラリでは無いですからね。
そもそも関数で提供されていてクラスじゃないですから。

>そもそもリスト構造にする必要なんかないのでは?
>素直にstd::vectorを使っておけばよいと思います。

たかぎさんのご意見は正しと思います。
下手な検索をするよりvectorを添え字でアクセスするほうが早いって事ですよね。
ただ、何事も経験ですのでリスト構造ぐらい知っていたほうが良いんじゃないかなと私は思うわけです。
速度を気にしているみたいですので、使ってみて比べてもらえるのが一番ですが。
最終的に使う方の判断にお任せします。


485ポイント を手に入れた。

Name: yskey  ..入門者(4,467ポイント)   Date: 2009/11/11(水) 23:55   No:41751 解決!     
Title: Re:【戦略シミュ】ユニット管理方法でのリスト構造について    
>>softyaさん
どうもご返信ありがとうございます。
リスト構造も面白い物なのでやってみようと思います。
ありがとうございました。


59ポイント を手に入れた。



Name: やっくん  ..中級者(11,716ポイント)   Date: 2009/11/11(水) 03:22   No:41697       
Title: VC++で実行時のエラー    
VC++でコンパイルし、実行時にエラーが出ます。
以下のようなエラーが出て、「致命的なエラーです」と表示され実行されません。

Dbug Assertion Failed!
File:f:\(中略)\fgetc.c
Expression: stream != NULL

自分はstdio.hをインクルードして、fopenやsprintf,fgets,fgetcを使用していますが問題があるのでしょうか?
warningが出ても「これより安全な関数が準備されてますよ」という忠告にしか捕らえてませんでした。

以下はfgetcを使っている部分です。

FILE *fp;
char buf1;
int bug2;

fp = fopen("../../dat/csv/teki_dat/teki01.txt", "r");

buf1 = buf2 = fgetc(fp);

while(fgetc(fp)!='\n');


どこがおかしいところがあればご指摘をお願いいたしますm(__)m


308ポイント を手に入れた。


Name: toyo  ..熟練のプログラマー(43,759ポイント)   Date: 2009/11/11(水) 06:26   No:41698     
Title: Re:VC++で実行時のエラー    
おそらくfopenに失敗したのにfgetcを実行したためでしょう。
fopenは失敗することもあります(ファイルが存在しなかったりパスが間違っていたりファイルが使用中とか権限がないとか)。
失敗するとNULLを返しますのでfopenの戻り値をチェックするようにしましょう。

fp = fopen("../../dat/csv/teki_dat/teki01.txt", "r");
if (fp == NULL)
{
printf("ファイルのオープンに失敗しました\n");
}
else
{
buf1 = buf2 = fgetc(fp);
while(fgetc(fp) != '\n');

fclose(fp);
}



189ポイント を手に入れた。

Name: やっくん  ..中級者(11,990ポイント)   Date: 2009/11/11(水) 16:58   No:41719     
Title: Re:VC++で実行時のエラー    
toyoさん、ありがとうございます。
おっしゃる通りでファイルパスが間違えていました。

"../../dat/csv/teki_dat/teki01.txt"
       ↓
"dat/csv/teki_dat/teki01.txt"

としたらファイルを読み込めました。
ですが、fopenを使っている関数(state.c)からteki01.txtの相対パスは最初の書き方です。
結果から見るとfopenでファイルを開く場合はprojectから見た相対パスを書かなければいけないのでしょうか?
前まではprojectと同じ階層に.cのソースファイルは置いていたためか問題なく動いていたのでfopenを使った関数がある場所からの相対パスと思い込んでいました。

root
|
|-project
|
|-dat
| |-csv
| |-teki_dat
| |-teki01.txt
|
|-my_dat
| |-source
| |-state.c


274ポイント を手に入れた。

Name: YuO  ..プログラマー(35,791ポイント)   Date: 2009/11/11(水) 18:19   No:41721     
Title: Re:VC++で実行時のエラー    
> 結果から見るとfopenでファイルを開く場合はprojectから見た相対パスを書かなければいけないのでしょうか?

ソースファイルもプロジェクトファイルも関係ありません。
相対パスは,必ずカレントディレクトリからの相対として解決されます。
実行ファイルからの相対パスを指定したいのであれば,GetModuleFileName Win32APIなどを使って実行ファイルの位置を取得し,そこからの相対パスとして絶対パスを組み立てる必要があります。

MSDN: GetModuleFileName Function (Windows)
http://msdn.microsoft.com/en-us/library/ms683197.aspx
MSDN: PathCombine Function ()
http://msdn.microsoft.com/en-us/library/bb773571.aspx

ちなみに,カレントディレクトリは簡単に変更されます。
たとえば,ショートカットの作業フォルダはカレントディレクトリの初期値になります。


2倍のポイントを手に入れた! 558ポイント を手に入れた。

Name: やっくん  ..中級者(12,064ポイント)   Date: 2009/11/11(水) 23:33   No:41749 解決!     
Title: Re:VC++で実行時のエラー    
YuOさん、返信ありがとうございます。

全く勘違いをしていたみたいです。
サイトの紹介をしてもらっていて悪いのですが、Win32APIは知識がないため使えないのでカレントディレクトリからの相対パスを指定することにします。


74ポイント を手に入れた。



Name: TAG  ..初心者(5,185ポイント)   Date: 2009/11/11(水) 07:24   No:41700       
Title: アイテムの点数を画面に張り付ける方法    
を、現在改造してる龍神録で実装しようとしてるのですが
うまくいかなくて困ってます。

out.cpp内
//アイテムとの接触
void ch_and_item(){
for(int i=0;i<ITEM_MAX;i++){
if(item[i].flag>0){
double x=item[i].x-ch.x,y=item[i].y-ch.y;
if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){
switch(item[i].knd){
case 0:
break;
case 1:
item[i].flag2=1;
if(ch.y<ITEM_GET_BORDER_LINE){
ch.score+=50000;//
item[i].score+=50000;
}
for(int a=0;a<=347;a++){
if(ch.y<ITEM_GET_BORDER_LINE+1+a&&ch.y>ITEM_GET_BORDER_LINE+a){ //itemボーダーらいんを超えたならば
ch.real_score+=49900-a*100;
item[i].score+=49900-a*100;
}
}略

graph.cpp内

//アイテム描画
void graph_item(){
int i;
for(i=0;i<ITEM_MAX;i++){

if(item[i].flag2==1){
int score =item[i].score; //アイテム用のスコア
for(int a=0;a<6;a++){ //スコア表示
DrawRotaGraph(item[i].x-13*a,item[i].y-10,1.0f,0.0f,img_num[0][score%10],TRUE);
score/=10;
}
}
}
}

と実装してるのですが、
アイテムのスコアが画面に張り付かずに
そのままアイテムと一緒に落下してしまうのですが、どうしたら
よいでしょうか?アドバイスお願いします・・


515ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(459,851ポイント)   Date: 2009/11/11(水) 23:09   No:41745     
Title: Re:アイテムの点数を画面に張り付ける方法    
 このスコアというのはトータルの得点ではなく、何か個別に表示が必要なスコアでしょうか。


>DrawRotaGraph(item[i].x-13*a,item[i].y-10,1.0f,0.0f,img_num[0][score%10],TRUE);

 ここが原因でしょうね。
 アイテムの位置を元にスコアを表示しているように見えます。
 なので、アイテムが移動すれば一緒にスコアもついていきます。

 多分スコアを表示しようとした瞬間の座標をどこかに覚えておいて、
その座標を元に表示すればうまくいくのではないかと思います。


 ところで余談ですが、今はアイテムの表示関数内でスコアを表示しているようですが、
いっそのことスコア表示システムを独立させて、アイテム側からリクエストを出して
表示してもらった方が汎用性があって(つまりアイテム以外からでもスコアが表示できるようになる)
いいのかもしれません。


245ポイント を手に入れた。



Name: nanashi  ..ぴよぴよ(226ポイント)   Date: 2009/11/11(水) 19:41   No:41726       
Title: if文について    
以下のようなプログラムで、前者のif文でif内が実行されると
思っていたのですが、実際は後者のようにしないとif文内が実行されません。
どうしてなのか、ご教授願えないでしょうか?

#include <stdio.h>
int main(){
char a = 0xf0;

if((unsigned char)a & 0xff == 0xf0) //こちらでは条件にあてはまらない
//if(((unsigned char)a & 0xff) == 0xf0) //こちらでは条件にあてはまる
{

}

return 0;
}



221ポイント を手に入れた。


Name: box  ..ハッカー(146,013ポイント)   Date: 2009/11/11(水) 20:18   No:41729     
Title: Re:if文について    
== 演算子の方が & 演算子よりも優先順位が高いからです。


2倍のポイントを手に入れた! 44ポイント を手に入れた。

Name: nanashi  ..ぴよぴよ(256ポイント)   Date: 2009/11/11(水) 20:36   No:41731 解決!     
Title: Re:if文について    
なるほで。==は優先順位が一番下だと思ってました。
ありがとうございました。


2倍のポイントを手に入れた! 30ポイント を手に入れた。

Name: box  ..ハッカー(145,984ポイント)   Date: 2009/11/11(水) 21:34   No:41738     
Title: Re:if文について    
演算子の優先順位については、おおかたの入門書に書いてあるはずです。
ただ、すべての順位を覚える必要はありません。
自分が行ないたいようにカッコを書けばよいです。変にうろ覚えするより、よほど確実です。


29ポイント を落としてしまった。



Name: kuroka  ..ぴよぴよ(366ポイント)   Date: 2009/11/10(火) 13:08   No:41649       
Title: 単位に必要なんです!//球の体積    
/* rand2.c */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i,n=10000000;
double x,y,z,sum=0.0;
srand((unsigned int)time(0));
for(i=0;i<n;i++){
x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= y <= 1
z=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= z <= 1
if(x*x+y*y+z*z<=1.0) {sum=sum+1.0;} // 条件
}
printf("%f %f \n",sum/((double)n)*8., acos(-1.0)*4/3);
return 0;
}


球の体積をもとめるプログラムです
教授がヒントを出して、それを少しいじったたのが上のプログラムです
よければ確認、助言などをいただけたらありがたいです。


366ポイント を手に入れた。


Name: non  ..熟練のプログラマー(67,781ポイント)   Date: 2009/11/10(火) 15:30   No:41654     
Title: Re:単位に必要なんです!//球の体積    
何をどう確認、助言して欲しいのかわかりませんが、
>x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
仮にRAND_MAXが 32767だとすると、
32767/(32767+1)なので < 1  ですから、
コメントにあるように
-1<= x <= 1 でなく
-1 < x < 1 ですね。


142ポイント を手に入れた。

Name: kuroka  ..ぴよぴよ(426ポイント)   Date: 2009/11/10(火) 16:05   No:41655     
Title: Re:単位に必要なんです!//球の体積    
説明が不足してしまって申し訳ありません。
実は、私自身なにをどうしていいのやらよくわかっていないのです。

/* rand2.c */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i,n=100000;
double x,y,sum=0.0;
srand((unsigned int)time(0));
for(i=0;i<n;i++){
x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= y <= 1
if(x*x+y*y<=1.0) {sum=sum+1.0;} // 条件
}
printf("%f %f \n",sum/((double)n)*4., acos(-1.0));
return 0;
}

これは教授(といっても専攻は物理)が示した円の面積のプログラムです。
これをいじって体積を求めるプログラムを書けというのが問題なんですが、
いじったモノが質問内容のモノです。
面積を求めるプログラムを書き換えて、体積を求めるプログラムにしたわけですが、
それが正解かどうか、不正解なら助言などを頂きたいと思って質問しました


60ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,185ポイント)   Date: 2009/11/10(火) 16:26   No:41657     
Title: Re:単位に必要なんです!//球の体積    
モンテカルロ法というアルゴリズムです。
通常は円周率を求めるために使うものです。

面積や、体積を求めるために使うのはなにか違うような気もしますが、
課題ならしょうがない。

先ほどのxやyの範囲のコメントも教授がそう示すなら、これもしょうがない。
答えが、出たのだからいいのでは?


145ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(116,055ポイント)   Date: 2009/11/10(火) 17:25   No:41658     
Title: Re:単位に必要なんです!//球の体積    
> 教授がヒントを出して、

単なるヒントなら無視してもよいでしょう。
要件が球の体積を求めるだけであれば...

#include <iostream>

const double r = 1.0;
const double π = 3.141592653589793;

int main()
{
std::cout << 4.0/3.0*π*r*r*r << std::endl;
}

で十分です。
とりあえず半径は1.0にしていますが、必要に応じて適当に調整してください。

ちなみにモンテカルロ法を使うのであれば、rand関数には荷が重いので、メルセンヌツイスタ等に置き換えるべきです。
そこまでする必要はまったくないとは思いますが...


162ポイント を手に入れた。

Name: YuO  ..プログラマー(35,295ポイント)   Date: 2009/11/10(火) 17:27   No:41659     
Title: Re:単位に必要なんです!//球の体積    
> 通常は円周率を求めるために使うものです。
> 面積や、体積を求めるために使うのはなにか違うような気もしますが、

円周率は副産物です。
元となる面積や体積がわかる物体の中に求めたい物体をおき,その中にある確率を求めることで,求めたい物体のおおよその面積や体積をはかっています。

円周率は,式であるπr2や4πr3/3を知らないと計算できません。
日能研の「シカクいアタマをマルくする」2004年4月の問題が,丁度よい例になっています。
http://www.nichinoken.co.jp/column/shikakumaru/archive/mondai/sm_sa_0404.html
これ自体は円周率を求めなさいとなっていますが,実験で得られるのは面積であり,その面積からの逆算で円周率を出しています。

今回の場合だと,一辺の長さが2の立方体に内接する球の体積 (=半径1の球の体積) を求めようとしています。
元のものは円の面積ですね。n/sumが確率で,4が元となる円に外接する正方形の面積になります。


> それが正解かどうか、不正解なら助言などを頂きたいと思って質問しました

提示されたプログラムは,体積を計算するプログラムに改良するというのが課題であるならば問題ないでしょう。
ただし,次回からは規約と注意事項にあるように,pre要素を使って字下げをしてください。


377ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,231ポイント)   Date: 2009/11/10(火) 18:28   No:41665     
Title: Re:単位に必要なんです!//球の体積    
>円周率は,式であるπr2や4πr3/3を知らないと計算できません。
ああ、そうですね。勘違いしました。


46ポイント を手に入れた。

Name: kuroka  ..ぴよぴよ(662ポイント)   Date: 2009/11/11(水) 20:09   No:41728 解決!     
Title: Re:単位に必要なんです!//球の体積    
皆様のご協力のおかげで
無事なんとかなりました、ありがとうございます

利用規約の点は見落としてしまい、結果として
御迷惑をおかけしてしまい申し訳ありませんでした

これからもまだまだ若輩ものですから
C言語の取得に全力を尽くしていく所存でありますので
ご協力のほどを頂けたら幸いです。

本当にありがとうございました


2倍のポイントを手に入れた! 236ポイント を手に入れた。



Name: yossiy  ..入門者(3,454ポイント)   Date: 2009/11/11(水) 11:15   No:41703       
Title: BGMとSEを一括管理    
DXライブラリで
オプションとか作りたいのですが
BGMの全部の音量とSEの全部の音量を
調整できるようにしたいのですが
どうやったらいいのでしょうか?


56ポイント を手に入れた。


Name: kazuoni [URL]  ..ハッカー(112,263ポイント)   Date: 2009/11/11(水) 12:35   No:41710     
Title: Re:BGMとSEを一括管理    
自作スライドなり用意して、
関数ChangeVolumeSoundMem
でボリュームを調節することができます。

本家参照
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_sound.html#R8N11


72ポイント を手に入れた。

Name: Mikan [URL]  ..中級者(10,906ポイント)   Date: 2009/11/11(水) 12:37   No:41711     
Title: Re:BGMとSEを一括管理    
オプションという意味がよくわからないのですが、
音量を変更するだけだったらChangeVolumeSoundMem関数で設定できます。

ただ、ChangeVolumeSoundMem関数は全体ではなく、
サウンドハンドル別に設定しなければいけないので、
Handle[10]などの配列にサウンドハンドルを入れてあげて、
変更する関数などでループさせて一括で変更すればできます。

ChangeVolumeSoundMem関数リファレンス
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_sound.html#R8N11


151ポイント を手に入れた。



Name: 電気屋  ..かけだし(2,353ポイント)   Date: 2009/11/05(木) 15:03   No:41463       
Title: 会話シーン2    
プログラムが長文ですが乗せてみます。略ができるところは削りました。要点は一番下です。
#include "DxLib.h"
#define MOJI_SIZE 24
#define MOJI_X 8
#define MOJI_Y 14
int DrawPointX , DrawPointY ; // 文字列描画の位置
int SP , CP ; // 参照する文字列番号と文字列中の文字ポインタ
char String[][ 256 ] =//4列×21文字の表示
{
         ”文章”
} ;
// 改行関数
int Kaigyou( void )
{
       //改行のプログラムなので省略
}


typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTRlpCmdLine, int nCmdShow ){

int image[16];
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。

      //フラグため省略

}

if(ch.walking_flag==1){ //歩くフラグが立っていたら

        //移動のプログラムなので省略

}
if(ch.y>=200 && ch.x>=400){
int EndFlag ; // 終了フラグ
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列

SetGraphMode( 640 , 480 , 16 ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}


// 描画位置の初期位置セット
DrawPointX = MOJI_X ;
DrawPointY = MOJI_Y ;

// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字

// フォントのサイズセット
SetFontSize( MOJI_SIZE ) ;


// 終了フラグを倒す
EndFlag = 0 ;
// ループ

while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
char Moji ;

// 文字の描画

Moji = String[ SP ][ CP ] ;
switch( Moji ){

                 //詳しく書くと長かったので、大事なところを残して省略


case 'E' : // 終了文字

// 終了フラグを立てるおよび参照文字位置を一つ進める
EndFlag = 1 ;
CP ++ ;
break ;

case 'C' : // クリア文字

// 画面を初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
ClearDrawScreen() ;
DrawPointY = MOJI_Y;
DrawPointX = MOJI_X ;
CP ++ ;
break ;
default : // その他の文字
                  
//省略

ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

このプログラムでエラー1,とこのプログラムの改善点を教えてください。
書き下手ですいません

要点

・一定の位置にいくと会話(文字の表示)が開始される
・マップやキャラが動かなくなり背景として使用。
・会話が終わり次第、元のゲーム戻る
・画面クリアしたときに、背景がすべて消えないようにする
などなどです。
そのほかにも足した方がいいところがあったらよろしくお願いします。


1,051ポイント を手に入れた。


Name: kazuoni [URL]  ..ハッカー(111,779ポイント)   Date: 2009/11/05(木) 15:25   No:41465     
Title: Re:会話シーン2    
前回のスレは放置ですか?別に新スレを立てなくても、
レスでプログラムを張り付けてくれればよかったのですが^^;

そして、またもや答えにはなりませんが、
規約は読まれましたか?
プレタグ、インデントがなされてません。
なので、そのあたりを修正して再度プログラムを張り付けてください。
直接書かなくても、添付ファイルもこの掲示板では使えます(容量制限あり)


99ポイント を手に入れた。

Name: 電気屋  ..入門者(2,554ポイント)   Date: 2009/11/07(土) 11:53   No:41549     
Title: Re:会話シーン2    
どうもしませんでした。(><)
まだ掲示板になれていなくて。

目的としては、自分の作成した。文字の表示のプログラムを『ゲームプログラムの館.22章.4方向に歩かせる』プログラムに組み込み、一定の座標(ch.x=400,ch.y=200)にいったら文字表記をして、表記が終わったらキャラの移動に戻る。みたいなプログラムにしたいと思っています。プログラムはTEXT形式で、画像は別に張りたいと思います。アドバイスお願いします。


201ポイント を手に入れた。

Name: 電気屋  ..入門者(2,563ポイント)   Date: 2009/11/07(土) 11:57   No:41551     
Title: Re:会話シーン2    
画像です。

9ポイント を手に入れた。

Name: 電気屋  ..入門者(2,603ポイント)   Date: 2009/11/07(土) 11:59   No:41552     
Title: Re:会話シーン2    
形式が、ビットマップからGIF形式に変更しているのでご了承してください。

40ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(112,171ポイント)   Date: 2009/11/07(土) 16:04   No:41557     
Title: Re:会話シーン2    
このコードのまま続けていくなら、
まずは、歩き回るプログラムから、
対象物に当たり、条件を満たしたなら
関数GetDrawScreenGraphあたりで画面をキャプチャーし、
その画像を先にを出力しながら、文字を出力していく
方法しかないかと。

今のまま規模を拡大していくと、
かなり大変なコードになりそうな気がします^^;
まずは、それぞれの機能を関数化して分担させたほうがよいかと思います。
ここの回答者であるarrayさんのHPにサウンドノベルシステムを
紹介しているので、参考になるかと思います。
http://sinkai.net/rp/19.php
っと言っても、画面更新等は電気屋さんとは異なっていますから、
結局は、根本から作り直しになりますが^^;

現在、時間に余裕があまりないので、サンプル作れませんorz


202ポイント を手に入れた。

Name: 電気屋  ..入門者(2,612ポイント)   Date: 2009/11/11(水) 11:34   No:41707 解決!     
Title: Re:会話シーン2    
どうもありがとうございました

9ポイント を手に入れた。



Name: banba  ..ぴよぴよ(184ポイント)   Date: 2009/11/09(月) 02:30   No:41604       
Title: 弾の最大数が、選択武器によって変わる場合    
C++初心者です。このサイトのゲームプログラミングの館の内容がわかり、龍神録の館の内容がだいたいわかる程度の能力です。

さっそく質問にうつります。僕は今、シューティングゲームではないんですけど
武器を決まった数選んで敵と戦うゲームを作ろうと思っています。
それぞれ違う武器を選ぶとなると、武器それぞれ性能により画面内に出せる弾の最大数が違う事になります。

そうなってくるとGV.hで
武器1の弾、武器2の弾〜と全種類の武器の最大弾数分、構造体変数を宣言してしまっていいのでしょうか?

結構な量になると思うのですが、こういうのって容量的に大丈夫なのでしょうか?
それとも「選択した武器の最大弾数分、変数を用意して戦闘が終わったら消す」的なコードは作れたりしないのでしょうか?

ごめんなさい、かなりトンチンカンな質問かもしれません…。回答いただけたらありがたいです。


184ポイント を手に入れた。


Name: Naohiro19  ..ぴよぴよ(830ポイント)   Date: 2009/11/09(月) 07:40   No:41609     
Title: Re:弾の最大数が、選択武器によって変わる場合    
こういう場合は構造体を利用すべきです。

typedef struc weapon
{
int weapon_type; //武器の種類
int bullet_type: //玉の種類
int bullet_max; //発射できる最大数
int flag; //玉の消失フラグ(0:消えている、1:消えていない)
}WEAPON;



124ポイント を手に入れた。

Name: banba  ..ぴよぴよ(493ポイント)   Date: 2009/11/09(月) 18:10   No:41617     
Title: Re:弾の最大数が、選択武器によって変わる場合    
回答ありがとうございます。やはり質問のしかたが良くなかったです、スミマセン…

構造体を利用しなくてはいけないのはわかるのですが、

たとえば武器1の弾は最大で画面に50発出せるモノとします。

次に弾を表す構造体が必要になるとなります。なので50個構造体の配列が必要になります。

他にも多く武器はあるのです。他に武器2があり最大の弾の数が20個だとするともう一種類、構造体の配列
が20個必要になります。
このまま続くと最終的に、全ての武器の最弾数分の構造体配列を宣言することになります。

この場合、宣言される構造体配列が膨大な量になってしまいます…
コレは最近のパソコンなら容量的に大丈夫なのでしょうか?
そうでなければ、「必要な分だけ、指定された構造体を宣言して使い終わった後は破棄、解放する」
というプログラムを組むにはどうすればよいのでしょうか?


309ポイント を手に入れた。

Name: ぽこ  ..かけだし(1,729ポイント)   Date: 2009/11/09(月) 23:30   No:41625     
Title: Re:弾の最大数が、選択武器によって変わる場合    
> この場合、宣言される構造体配列が膨大な量になってしまいます…
> コレは最近のパソコンなら容量的に大丈夫なのでしょうか?

大丈夫です。
構造体1つが1KBのサイズであっても、武器を1000個作ってようやく1MBです。

> そうでなければ、「必要な分だけ、指定された構造体を宣言して使い終わった後は破棄、解放する」
> というプログラムを組むにはどうすればよいのでしょうか?

new/delete/C++というキーワードで検索してみてください。
うじゃうじゃ出ます。


73ポイント を手に入れた。

Name: banba  ..ぴよぴよ(505ポイント)   Date: 2009/11/10(火) 20:58   No:41674 解決!     
Title: Re:弾の最大数が、選択武器によって変わる場合    
回答ありがとうございます!
助かりました!


12ポイント を手に入れた。



Name: 鈴木  ..ぴよぴよ(571ポイント)   Date: 2009/11/10(火) 17:43   No:41662       
Title: 無題    

int dus;
for (ii=0; ii<RINGLENGTH; ii++){
que[ii] = 0; // キューの初期化
}
front = 0; //front, rear の初期値
rear = 0;
while(1){
inp = getchar(); // 標準入力からキャラクタを獲得
if (isdigit(inp)) {
EnQue(inp-48); // inp は char 型、 48 引くと真値になる
Print(que, RINGLENGTH, front, rear);
}
else {
switch (inp){
case (’d’): //DeQue 処理を行う
dus = DeQue();
if (dus != -1){
printf("Dequed=%d, ", dus);
Print(que, RINGLENGTH, front, rear);
break;
}
break;
case(’s’): // キューを表示する
Print(que, RINGLENGTH, front, rear);
break;
case(’q’): // キューを表示する
return 0;
}
}
}
}
/* ------------------------------
*
* EnQue
* e(enque) を入力すると r を追加してキューが伸びる
* input int r: 入力数
*
---------------------------------*/
void EnQue(int r)
{
// ここ関数がわかりません よろしくおねがいします
}
/* ------------------------------
*
* DeQue
* d(deque) を入力すると front にある数値を出力する
*
---------------------------------*/
int DeQue()
{
// ここの関数もわかりません よろしくお願いします
}
/* ------------------------------
*
* キューを表示する
* front から rear までのキューと
* (front, rear) の表示
---------------------------------*/
void Print(int* a, int n, int front, int rear)
{
int ii;
if (rear < front) rear = (rear + RINGLENGTH);
printf("Que=[ ");
for(ii=front; ii<rear; ii++){
printf("%d ", a[ii%RINGLENGTH]);
}
printf("], (front=%d rear=%d)\n", front, rear%RINGLENGTH);
}


571ポイント を手に入れた。


Name: conio [URL]  ..比類無きプログラマー(73,845ポイント)   Date: 2009/11/10(火) 20:49   No:41672     
Title: Re:無題    
とりあえず、"キュー"って何だと思いますか?
そこから分からないのであれば、"キュー"自体について把握すべきだと思います。


58ポイント を手に入れた。



Name: 小堺  ..ぴよぴよ(173ポイント)   Date: 2009/11/10(火) 18:01   No:41664       
Title: 逆オーランド方式    
/* 逆ポーランド記法による入力文字列(空白で区切られている)に対して、
16進数と10進数で答えを返すプログラムrpnを作っているのですが、Lの28 35 39
わかりません
入力はrpn 5 2 + 7 * のようにして
出力は0x31, 49(decimal)のようにしたいです よろしくおねがいします */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACKLENGTH 10 // スタックサイズを 10 とする
int stack[STACKLENGTH]; // スタック
int stack_p = 0; // スタックポインタ
int Pop(void);
void Push(int);
/*
*
* 逆ポーランド記法を用いた Hex の計算
* 使用例 rpn 1 2 +
* 使える演算子 +、 -、 /、 *、 ˆ
*
*/
int main(int argc, char** argv)
{
int v;
sscanf(argv[1], "%x", &v); // 1番目の数を読み取る
Push(v);
sscanf(argv[2], "%x", &v); // 2番目の数を読み取る
Push(v);
switch(argv[3][0]){
// ここがわかりません
}
printf("0x%x, %d\n", stack[0], stack[0]);
return 0;
}
void Push(int c)
{
// ここもわかりません
}
int Pop()
{
// ここもわかりません
}


173ポイント を手に入れた。


Name: Tororo  ..ぴよぴよ(664ポイント)   Date: 2009/11/10(火) 19:00   No:41667     
Title: Re:逆オーランド方式    
あまり関係ないけどタイトル間違ってますよ^^;

25ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,285ポイント)   Date: 2009/11/10(火) 19:30   No:41669     
Title: Re:逆オーランド方式    
検索したら、似たようなプログラムは出てくると思いますよ。
検索に 「逆ポーランド スタック」などで


54ポイント を手に入れた。



Name: biginner  ..ぴよぴよ(101ポイント)   Date: 2009/11/09(月) 16:36   No:41616       
Title: 配列関係    
#include<stdio.h>
#define N 3
int p[N+1];
int g=0;
int a[6][6];
void perm(int);
int i;
void main(void){
int y,z;
for(i=1;i<=N;i++)
p[i]=i;
perm(1);
for(y=0;y<=5;y++){
for(z=0;z<=5;z++){
printf("%d",a[y][z]);
}
printf("\n");
}
int g,j;
int b[N];
int hp0[N][2],hp1[N][2],hp2[N][2];
for(g=0;g<=N-1;g++){ //0列目(全hp共通)
hp0[g][0]=2*g;
hp1[g][0]=2*g;
hp2[g][0]=2*g;
}
for(g=0;g<=N-1;g++){ //1列目(hp0)
b[g]=(4*N+1-2*g)%(2*N);
hp0[g][1]=b[g];
}
for(g=0;g<=N-1;g++){ //1列目(hp1)
hp1[g][1]=(hp0[g][1]+2)%(2*N);
}
for(g=0;g<=N-1;g++){ //1列目(hp2)
hp2[g][1]=(hp1[g][1]+2)%(2*N);
}
printf("[hp0]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp0[i][j]);
}
printf("\n");
}
printf("\n");
printf("[hp1]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp1[i][j]);
}
printf("\n");
}
printf("\n");
printf("[hp2]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp2[i][j]);
}
printf("\n");
}
printf("\n");
}
void perm(int i){
int j,k,t;
if(i<N){
for(j=i;j<=N;j++){
t=p[j];
for(k=j;k>i;k--)
p[k]=p[k-1];
p[i]=t;
perm(i+1);
for(k=i;k<j;k++)
p[k]=p[k+1];
p[j]=t;
}
}
else{
for(j=1;j<=N;j++){
a[g][2*j-2]=2*j-2;
a[g][2*j-1]=2*p[j]-1;
printf("%d-%d ",2*j-2,2*p[j]-1);
}
g++;
printf("\n");
}
}
結果は↓のような感じで表示されると思いますが
012345
012543
:
052341
[hp0]
01
25
43
[hp1]
03
21
45
[hp2]
05
23
41
配列a[][]の各行の要素を前から2つずつ区切って、2つをセットで辺として考えます。
i行目{a[i][0]-a[i][1] , a[i][2]-a[i][3] , a[i][4]-a[i][5]}
このとき各[hp0][hp1][hp2]に共通の辺を持っている行だけ抜き出したいのですがどうすればよいでしょうか?

例えば
0行目は012345なので{0-1,2-3,4-5}と考えます。
(0-1)は[hp0]に存在し、(2-3)は[hp2]に存在し、(4-5)は[hp1]に存在するので0行目は採択します。
1行目は012543なので{0-1,2-5,4-3}とします。
(0-1)は[hp0]に存在しますが、(2-5)と(4-3)は存在しないので1行目は棄却します。

このようにすべての行を調べて、各[hp0][hp1][hp2]に1本ずつ共通の辺を持っている行だけを
抜き出したいと思ってます。もっと大規模なものを考えていますので、まずは今回のような小規模のものから
考えようと思ってます。


101ポイント を手に入れた。


Name: biggner  ..ぴよぴよ(19ポイント)   Date: 2009/11/10(火) 10:53   No:41643     
Title: Re:配列関係    
簡単に言えばint a[6][6]において
i行目(i=0〜5)を{a[i][0]-a[i][1] , a[i][2]-a[i][3] , a[i][4]-a[i][5]}としたとき
例えば
a[i][0]a[i][1]=hp0[x][0]hp0[x][1]
a[i][2]a[i][3]=hp1[y][0]hp1[y][1]
a[i][4]a[i][5]=hp2[z][0]hp2[z][1]
となればi行目を残したいです。hpの添え字は一回ずつ使えば順番は気にしません。
a[i][0]a[i][1]=hp2[x][0]hp2[x][1]
a[i][2]a[i][3]=hp0[y][0]hp0[y][1]
a[i][4]a[i][5]=hp1[z][0]hp1[z][1]
でも構いません。


19ポイント を手に入れた。

Name: non  ..熟練のプログラマー(68,040ポイント)   Date: 2009/11/10(火) 16:17   No:41656     
Title: Re:配列関係    
誰からのRESもありませんね。気の毒なので、RESがない理由

1 <pre>が使ってない。読みたくないよね。こんなプログラム。
2 再帰呼び出しを使える人がなんでこんなプログラムを書くのだろう、または
 なんでこんな質問をという疑問がある。
3 力ずくでプログラムをすれば済みそうだけど、条件があいまい。

さて、この条件という話。
なんの、プログラムか検討がつかないので 
実行結果の
最初の012345って何よ?この数字は頂点の番号?じゃ、六角形?ダビデの星?
例えば 0-1と1-0は同じとして扱うの?違うものなの?
>共通の辺を持っている行だけ抜き出したい
抜き出すってどこに?printfすればいいの?
>存在しないので1行目は棄却します
どこに捨てちゃうの?

と、もろもろ・・・・・わからないし、面倒だし、答える気にならない。


259ポイント を手に入れた。

Name: biginner  ..ぴよぴよ(286ポイント)   Date: 2009/11/10(火) 17:51   No:41663     
Title: Re:配列関係    
>最初の012345って何よ?
頂点の番号です。

>例えば 0-1と1-0は同じとして扱うの?
同じとして扱いますが、今回は一応1-0というのは出てこないです。

>抜き出すってどこに?
printfで共通の辺を持っている行のみです。

>どこに捨てちゃうの?
表現が悪かったです。棄却ではなくそのままにしておきます。

プログラミングというものをやったのが初めてなのでご迷惑おかけしています。すみません。


185ポイント を手に入れた。



Name: min  ..ぴよぴよ(29ポイント)   Date: 2009/11/09(月) 21:40   No:41618       
Title: ウィンドウのサイズ    
ウィンドウのサイズを縦480*横640のサイズを変更する方法はどのような感じになりますか?

29ポイント を手に入れた。


Name: Mist  ..比類無きプログラマー(70,590ポイント)   Date: 2009/11/09(月) 22:25   No:41620     
Title: Re:ウィンドウのサイズ    
まず規約をよく読んでください。
開発環境がわからないと答えようがありません。


30ポイント を手に入れた。

Name: min  ..ぴよぴよ(103ポイント)   Date: 2009/11/09(月) 22:35   No:41621     
Title: Re:ウィンドウのサイズ    
失礼しました。
使用ヘッダーはDxLib.hで,osはウィンドウズ,コンパイラはvs2008です。

質問内容はChangeWindowmode(TRUE);とした後に表示される画面のサイズのことです。


74ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(43,570ポイント)   Date: 2009/11/10(火) 07:18   No:41638     
Title: Re:ウィンドウのサイズ    
SetGraphMode( )という関数があります
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R4N1
使い方は↑に解説してあります。



78ポイント を手に入れた。



Name: ジャイ  ..ぴよぴよ(135ポイント)   Date: 2009/11/09(月) 00:51   No:41603       
Title: エフェクト    
初心者です!

19章で、敵の消滅エフェクトを表示するためのコードを、そのままコピペしたのですが、敵の行動がおかしくなってしまいました。
エクセルに敵の行動パターンを入力しても、enemy_act_pattern.cppのファイルに書いてある通りに動かないのです。エフェクトは出るのですが・・・

分かるかたよろしくお願いします!


135ポイント を手に入れた。


Name: softya  ..プログラマー(33,993ポイント)   Date: 2009/11/09(月) 23:52   No:41628     
Title: Re:エフェクト    
龍神録であれば。「全ての章のプロジェクトを一括ダウンロード」で完全なソースがダウンロードできますので19章のソースを見比べてみてください。


40ポイント を手に入れた。



Name: 蒼熊  ..ぴよぴよ(95ポイント)   Date: 2009/11/09(月) 23:22   No:41624       
Title: FPSを60にすると画像がカクカクする    
画像を右から左に流すだけのプログラムを作りました。
そのままだと滑らかな表示で流れていってくれるのですが、
http://dixq.net/rp/43.html を参考にFPSを60に固定した所、
移動が妙にカクカクするようになってしまいました。(移動距離にムラがあるようです)
何か解決手段などありませんでしょうか。
よろしくお願いします。


95ポイント を手に入れた。




Name: dic  ..プログラマー(36,761ポイント)   Date: 2009/11/08(日) 10:52   No:41579       
Title: ランタイムエラー    
vector<string> に格納している内容をテキストに出力するという関数を自作してるのですが
ランタイムエラーというのがでて エラーが起きてるようですが、原因がまったくわかりません

ソースは以下のとおりとなってます

void DebugOut( const vector<string> *v, char *filename ) {
int i;
FILE *file = fopen( filename, "wt" );
for( i=0; i<v->size(); i++ ) {
char buf[10240];

// 文字列の長さチェック 開始
int len = strlen( v->at(i).c_str() );
printf( "i = %d len = %d\n", i, len );
if( len >= 10240 ) {
fputs( "over! error\n", file );
continue;
}
// 文字列の長さチェック 終了

memset( buf, 0, sizeof(buf) );
sprintf( buf, v->at(i).c_str() );
fputs( buf, file );
}
fclose( file );
}

どなたかエラーの原因が分かるかたいませんでしょうか?


238ポイント を手に入れた。


Name: dic  ..プログラマー(36,829ポイント)   Date: 2009/11/08(日) 11:29   No:41580     
Title: Re:ランタイムエラー    
自己解決しました

sprintf( buf, v->at(i).c_str() );



strcpy( buf, v->at(i).c_str() );

に変更したらエラーがでなくなりました


68ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(115,893ポイント)   Date: 2009/11/08(日) 16:59   No:41598     
Title: Re:ランタイムエラー    
文字列に % が含まれていたのでしょうね。


17ポイント を手に入れた。

Name: dic  ..プログラマー(36,951ポイント)   Date: 2009/11/09(月) 23:22   No:41623 解決!     
Title: Re:ランタイムエラー    
解決おしてませんでした
すいません


15ポイント を手に入れた。



Name: エラーになってしまうんです。。。  ..ぴよぴよ(369ポイント)   Date: 2009/11/05(木) 23:53   No:41491       
Title: エラーがでます    
/*
プログラム1-3(Prog1-3.cpp)
ファイル入出力
*/
#include <stdio.h>
#include <stdlib.h>

#define INFILE "normal.csv"
#define OUTFILE "result.txt"
#define LF 0x0A /* 改行コード */

void dsperr(const char *);
double *dvector(int);
int get_num(FILE *);
void read_vec(FILE *,double *,int);

int main(void)
{
FILE *fp;
int i,n;
double *x,s,ss,avg,var;

if((fp=fopen(INFILE,"r"))==NULL)
dsperr("ファイルを開くことができません.");
n=get_num(fp); /* データ数を取得 */
x=dvector(n);
rewind(fp); /* ファイルの位置指定を先頭に戻す */
read_vec(fp,x,n);
fclose(fp); /* ファイルを閉じる */
s=ss=0;
for(i=0,max=x[i],min=x[i];i<n;++i){
s+=x[i];
ss+=x[i]*x[i];
if(max<x[i]){max=x[i];}
if(min>x[i]){min=x[i];}
}
avg=s/n; /* 平均 */
var=ss/n-avg*avg; /* 分散 */
range=max-min/*最大-最小*/
if((fp=fopen(OUTFILE,"w"))==NULL)
dsperr("ファイルを開くことができません.");
fprintf(fp,"データ数 = %d: 平均 = %f: 分散 = %f\n",n,avg,var);
fclose(fp);
free(x);
return EXIT_SUCCESS;
}

/* メッセージを出力して強制終了 */
void dsperr(const char *msg)
{
fprintf(stderr,"%s\n",msg);
exit(EXIT_FAILURE);
}

/* サイズ n の double 型 1 次元配列のメモリ確保,及びゼロで初期化 */
double *dvector(int n)
{
double *v;

v=(double *)calloc(n,sizeof(double));
if(!v) dsperr("メモリ確保失敗");
return v;
}

/* CSV 形式のファイルから標本サイズを調べる */
int get_num(FILE *fp)
{
int n=0;

while(!feof(fp)) /* EOF に達するまで LF の数を調べる */
if(LF==fgetc(fp)) ++n;
return n;
}

/* データ読み込み */
void read_vec(FILE *fp,double *x,int n)
{
int i;

for(i=0;i<n;++i)
fscanf(fp,"%lf",&x[i]);
}
/* EOF */
もともと平均と分散のみを記述したプログラムに、データの最大と最小を求める関数を付け足して、レンジを出力するプログラムにしたんですが、エラーがでます!データの最大と最小を求めるところでエラーがでるんですがこのプログラムのどこをどう直したら良いのでしょうか????
教えてくださいお願いします。


369ポイント を手に入れた。


Name: ドラ  ..かけだし(2,423ポイント)   Date: 2009/11/06(金) 00:50   No:41493     
Title: Re:エラーがでます    
ケアレスミスが多いです。
以下を修正すればとりあえずコンパイルは通ります。
(内容までは吟味していませんが・・・)

・定義していない変数(max, min, range)をいきなり使用している。
・全角の{ }が混入。
・セミコロンのつけ忘れ。


100ポイント を手に入れた。

Name: 初級者  ..初心者(6,982ポイント)   Date: 2009/11/06(金) 14:07   No:41513     
Title: Re:エラーがでます    
「どんな」エラーが出るのですか?

コンパイル時のエラーであれば、
なるべくご自分で修正してください。


41ポイント を手に入れた。

Name: エラー  ..ぴよぴよ(40ポイント)   Date: 2009/11/09(月) 07:37   No:41608     
Title: Re:エラーがでます    
range の定義が定義されていないとでるんです・・・定義していない変数をつかっているとでるんですよ

40ポイント を手に入れた。

Name: non  ..熟練のプログラマー(67,639ポイント)   Date: 2009/11/09(月) 10:10   No:41612     
Title: Re:エラーがでます    
double range;
と宣言します。

ドラさんが指摘されている部分をまずチェックしてください。


50ポイント を手に入れた。



Name: TKOZ  ..プログラマー(35,099ポイント)   Date: 2009/11/06(金) 23:15   No:41526       
Title: ファミコンプログラムをCC65でやってるんですが…    
http://www.cc65.org/
cc65というのは、ファミコン用のC言語開発環境の1つです。
そこで、パッド入力判定を以下のページを参考に作ってみたのですが、どこがおかしいでしょうか?
http://gikofami.fc2web.com/nes/nes006.html

void KeyInput(char *x,char *y)
{
char A,B,Sel,Start,Up,Down,Left,Right;

*(char*)0x4016 = 1;
*(char*)0x4016 = 0;

A=*(char*)0x4016;
B=*(char*)0x4016;
Sel=*(char*)0x4016;
Start=*(char*)0x4016;
Up=*(char*)0x4016;
Down=*(char*)0x4016;
Left=*(char*)0x4016;
Right=*(char*)0x4016;

if(Up&1) *y--;
if(Down&1) *y++;
if(Left&1) *x--;
if(Right&1) *x++;
}


174ポイント を手に入れた。


Name: ぽこ  ..かけだし(1,347ポイント)   Date: 2009/11/06(金) 23:30   No:41527     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
端的に言えば、質問がおかしいです。

cc65コマンドでコンパイルは通りました。
TKOZさんが書いたとおりに動くはずです。

TKOZさんはこのプログラムに何を期待して、何が期待と異なったのでしょうか?


83ポイント を手に入れた。

Name: ぽこ  ..かけだし(1,426ポイント)   Date: 2009/11/06(金) 23:40   No:41529     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
もしかして、これが期待通りの動きですか?


(略)
if(Up&1) (*y)--;
if(Down&1) (*y)++;
if(Left&1) (*x)--;
if(Right&1) (*x)++;


79ポイント を手に入れた。

Name: ぽこ  ..かけだし(1,656ポイント)   Date: 2009/11/06(金) 23:49   No:41530     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
No:41531でsoftyaさんに指摘を頂いたので、以下の発言は
取り消させていただきます。

----
ファミコンの仕様が分からないので、他におかしいと思った
箇所を指摘しておきます。

void KeyInput(char *x,char *y)
{
char A,B,Sel,Start,Up,Down,Left,Right;

*(char*)0x4016 = 1;
*(char*)0x4016 = 0;

A=*(char*)0x4016;
B=*(char*)0x4016;
Sel=*(char*)0x4016;
Start=*(char*)0x4016;
Up=*(char*)0x4016;
Down=*(char*)0x4016;
Left=*(char*)0x4016;
Right=*(char*)0x4016;

/*
どう考えても、マスクがおかしい。
Up&1とDown&1は必ず同じ値(4016hの1ビット目)を取るから、
(*y)の値は結果として変わらない。
Up&1が正しいなら、Down&2とかDown&4とかになるのでは?
同様に、LeftとRightにも同じことが言える。
*/
if(Up&1) (*y)--;
if(Down&1) (*y)++;
if(Left&1) (*x)--;
if(Right&1) (*x)++;
}

----


230ポイント を手に入れた。

Name: softya  ..プログラマー(33,984ポイント)   Date: 2009/11/06(金) 23:57   No:41531     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
ここを見る限りではアーキテクチャとしては合っているみたいですよ。
http://hp.vector.co.jp/authors/VA042397/nes/joypad.html
ハードで特殊なシフト処理を行っていますので、同じポートにアクセスしても毎回違う値が得られます。


95ポイント を落としてしまった。

Name: TKOZ  ..プログラマー(35,268ポイント)   Date: 2009/11/07(土) 10:00   No:41542     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
>>ぽこさん
>>softyaさん
返信ありがとうございます。

質問の仕方が悪かったようです。

パッド入力判定で、上下左右にスプライトが動かないのがおかしいです。
しかし、指摘された部分で()で囲み修正したら、

if(Up&1) (*y)--;
if(Down&1) (*y)++;
if(Left&1) (*x)--;
if(Right&1) (*x)++;

↑ボタンを押したら、スプライトが下に移動しました。
↓ボタンを押したら、スプライトが左に移動しました。
←ボタンを押したら、スプライトが右に移動しました。
→ボタンを押したら、スプライトは動きませんでした。


169ポイント を手に入れた。

Name: TKOZ  ..プログラマー(35,347ポイント)   Date: 2009/11/07(土) 10:07   No:41543     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
NesterJとgnesだと、さっき書いた通りにスプライトが動いたのですが、
virtuanesだと、BGとスプライトが表示されるものの、スプライトは
全く動きませんでした。
fcfanplusだと、読み込み実行したら、エラーが出て強制終了しました。


79ポイント を手に入れた。

Name: TKOZ  ..プログラマー(35,693ポイント)   Date: 2009/11/07(土) 11:23   No:41545 解決!     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
問題が解決しました。
皆様、ありがとうございました。


#define A 0x80
#define B 0x40
#define SELECT 0x20
#define START 0x10
#define UP 0x08
#define DOWN 0x04
#define LEFT 0x02
#define RIGHT 0x01

unsigned char PadState;

void KeyInput(char *x,char *y)
{
unsigned char t;
char i;

*(char*)0x4016 = 1;
*(char*)0x4016 = 0;

for (i = 0; i < 8; i++) {
t = *(char *)0x4016;
t &= 0x01;
PadState <<= 1;
PadState += t;
}

if(PadState & UP) (*y)--;
if(PadState & DOWN) (*y)++;
if(PadState & LEFT) (*x)--;
if(PadState & RIGHT) (*x)++;
}


として、上下左右に見事動かす事が出来ました。ありがとうございました。


346ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(43,492ポイント)   Date: 2009/11/09(月) 09:25   No:41611     
Title: Re:ファミコンプログラムをCC65でやってるんですが…    
A=*(char*)0x4016;
B=*(char*)0x4016;
Sel=*(char*)0x4016;
Start=*(char*)0x4016;
Up=*(char*)0x4016;
Down=*(char*)0x4016;
Left=*(char*)0x4016;
Right=*(char*)0x4016;
で最適化処理されちゃいそうですね
*(char*)0x4016

*(volatile char*)0x4016
にしたほうがいいのでは
自分なら
#define IO_PAD (*(volatile char*)0x4016)
のように定義して使うかな



156ポイント を手に入れた。



Name: pkt  ..ぴよぴよ(520ポイント)   Date: 2009/11/04(水) 18:24   No:41399       
Title: 初期集団の生成    
現在大学で遺伝的アルゴリズムについて学んでいます。
今回は初期集団をランダムでだし、重ならないようにするプログラムを行っています。
しかし、エラーはないのですが、結果がうまく表示されません。よければご意見いただけると助かります。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define PS 10 /*遺伝子プール*/
#define GL 10 /*長さ*/
#define start 0/*スタート*/
#define goal 9/*ゴール*/
int xrand(int, int);
int main(void)
{
int p[PS][GL];
int g[GL];
int i,j,k,m;
int rnd;
srand((unsigned)time(NULL));
printf("初期集団\n");
for(i=0;i<PS;i++){
for(j=1;j<GL-1;j++){
rnd=xrand(2,8);
g[rnd]=1;
if(g[j]==0){
p[i][j]=rnd;
}else{
continue;
}
//printf("%d",p[i][j]);
}
//printf("\n");
}

for(i=0;i<PS;i++){
for(j=0;j<GL;j++){

if(j==0){
p[i][0]=start;
}else if(j==9){
p[i][j]=goal;
}
printf("%d",p[i][j]);
}
printf("\n");
}
}
int xrand(int lower, int upper)
{
return (upper - lower + 1) * (int)rand() / 32768 + lower;
}

よろしくお願いいたします。


520ポイント を手に入れた。


Name: pkt  ..ぴよぴよ(552ポイント)   Date: 2009/11/04(水) 18:26   No:41401     
Title: Re:初期集団の生成    
言葉が足りてないですね。乱数でだし、同じ数値が出ないようにしたいのです。
1334425などのようなものを出したくないのです。


32ポイント を手に入れた。

Name: non  ..熟練のプログラマー(65,315ポイント)   Date: 2009/11/04(水) 18:58   No:41406     
Title: Re:初期集団の生成    
原因の1つめは、
g[GL]を初期化していないこと。
2つめは、
既に使った数字の場合、continueしていること。
よくわからないのは、乱数の発生xrandが2から8の範囲だけど、
start=0でgoal=9なら1から8の乱数を発生させるのでは?



37ポイント を手に入れた。

Name: pkt  ..ぴよぴよ(648ポイント)   Date: 2009/11/04(水) 19:16   No:41409     
Title: Re:初期集団の生成    
レスありがとうございます。
1つ目の初期化については理解することができます。
2つめのcontinueのほうがいまいち理解できません。
最後の指摘はおっしゃる通りです。ありがとうございます


2倍のポイントを手に入れた! 96ポイント を手に入れた。

Name: conio [URL]  ..比類無きプログラマー(72,033ポイント)   Date: 2009/11/04(水) 19:45   No:41413     
Title: Re:初期集団の生成    

>>2つめのcontinueのほうがいまいち理解できません。

とりあえず、1〜10までの乱数を発生させるとします。
で、「既に使った数字ならcontinue」と言う風にすると、もし数字が被った場合
何も値が入らないまま処理が次へ進むことになります。
--------------------------------------------------------
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main(void)
{
srand((unsigned int)time(NULL));
int Value[10] = {0};
int g[10] = {0};

for(int i = 0; i < 10; i++){
int Num = rand() % 10 + 1;

if(g[Num - 1] == 0){
Value[i] = Num;
g[Num - 1] = 1;
}else{
continue;
}
}

for(int i = 0; i < 10; i++){
printf("Value[%d] = %d\n",i, Value[i]);
}

return(0);
}

【実行結果】
Value[0] = 8
Value[1] = 6
Value[2] = 2
Value[3] = 0  ←数字が被り、値を設定する処理が飛ばされている。
Value[4] = 7
Value[5] = 0  ←数字が被り、値を設定する処理が飛ばされている。
Value[6] = 0  ←数字が被り、値を設定する処理が飛ばされている。

Value[7] = 5
Value[8] = 0  ←数字が被り、値を設定する処理が飛ばされている。
Value[9] = 0  ←数字が被り、値を設定する処理が飛ばされている。

続行するには何かキーを押してください . . .
--------------------------------------------------------

実行結果を見てもらえば分かりますが、値を入れる処理が行われなかった場合は初期値のままです。
これは、「被らない乱数を発生させる」という意図に反する結果です。


334ポイント を手に入れた。

Name: pkt  ..ぴよぴよ(711ポイント)   Date: 2009/11/04(水) 20:00   No:41417     
Title: Re:初期集団の生成    
なるほど。回答ありがとうございます。
continueでは、入力されないまま次へ行ってしまう。ということですね。
となると、処理の方法は全く別なものを考えないといけないっぽいですね・・・。


63ポイント を手に入れた。

Name: pkt  ..かけだし(1,613ポイント)   Date: 2009/11/04(水) 21:19   No:41420     
Title: Re:初期集団の生成    
皆様の意見を参考に作りなおしてみました。
しかし、わからないところが出てきてしまいましたので、再度質問させてください。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define PS 10 /*遺伝子プール*/
#define GL 10 /*長さ*/
#define start 0/*スタート*/
#define goal 9/*ゴール*/
int xrand(int, int);
int main(void)
{
int p[PS][GL];
int g[GL-1]={0,0,0,0,0,0,0,0,0};
int i,j,k,m;
int rnd=0;
srand((unsigned)time(NULL));
printf("初期集団\n");
for(i=0;i<PS;i++){
for(j=1;j<GL-1;j++){
rnd=xrand(1,8);
if(g[rnd]==0){ // ここから
p[i][j]=rnd;
}else{
p[i][j]=0;
} // ここまで
g[rnd]=1;
//printf("%d",p[i][j]);
}
//printf("\n");
}

for(i=0;i<PS;i++){
for(j=0;j<GL;j++){

if(j==0){
p[i][0]=start;
}else if(j==9){
p[i][j]=goal;
}
printf("%d",p[i][j]);
}
printf("\n");
}
}
int xrand(int lower, int upper)
{
return (upper - lower + 1) * (int)rand() / 32768 + lower;
}


印をつけさせていただいたところの処理がうまくいきません。
あいているところに1〜8をすべて収めたいのですが・・・何か良いアイデアはありますでしょうか?
p[i][j]=0;
というのは、まだなにも思いついてなくて仮にいれてあります。
現在のプログラムの実行結果では
初期集団
0126870009
0040030009
0500000009
0000000009
0000000009
0000000009
0000000009
0000000009
0000000009
0000000009
続行するには何かキーを押してください . . .
のように2次元配列すべてのなかで、重ならない数字が出てきてしまいます。
きっとelse文での処理が重要なのだと思うのですが・・・
ご意見いただけると嬉しく思います


902ポイント を手に入れた。

Name: conio  ..比類無きプログラマー(72,983ポイント)   Date: 2009/11/04(水) 22:14   No:41425     
Title: Re:初期集団の生成    

一つの考え方としては、
----------------------------------------------------------------------------------------------
【1】乱数を生成する
【2】その乱数が、今まで代入してきたどの値とも一致していなければ【3】へ。被っていれば【1】へ。
【3】値を代入し、配列の一番最後の要素でなければ【1】へ。 一番最後であれば終了。
----------------------------------------------------------------------------------------------

例えば int Num[10];があり、Num[5]に8を代入しようとするとします。
この場合はNum[0] 〜 Num[4]まで探索し、8が無いかを探します。
---------------
┃Num[0] = 1
┃Num[1] = 2
┃Num[2] = 6
┃Num[3] = 4
▼Num[4] = 7
---------------
この場合だと8は存在しないので、Num[5]に8を代入します。

---------------
┃Num[0] = 1
┃Num[1] = 2
┃Num[2] = 6
┃Num[3] = 4
▼Num[4] = 8
---------------
この場合は、Num[4]に8があるので、もう一度乱数を生成し直します。
そして、もういちどNum[0] 〜 Num[4]まで探索します。


それと、もう一つの考え方としては、
---------------------------------------------
【1】予め、代入する値の配列を定義しておく
【2】配列の要素をランダムに入れ替える
【3】添え字の順番どおりに代入していく
---------------------------------------------
です。

例えば、まず1 〜 9 までの配列を定義しておきます。
int temp[9] = {1,2,3,4,5,6,7,8,9};

そして、内部の要素を入れ替えます。
---------------------------------------
【前】内部の要素⇒ 1 2 3 4 5 6 7 8 9
【後】内部の要素⇒ 9 4 5 6 7 2 3 8 1
---------------------------------------

後は単純に、順番通りに代入して行くだけです。
----------------------------
for(int i = 0; i < 9; i++)
Num[i] = temp[i];
----------------------------

で、前者と後者の場合は、後者の方が効率は良いです。
前者の場合は、被った乱数を生成する場合がある(特に、後半は高確率で被る)からです。

後者の場合は、プログラムの仕組み上、絶対に被る事はありません。



あと、とりあえず 最後のこの部分ですが、
--------------------------------------------------------
for(i=0;i<PS;i++){
for(j=0;j<GL;j++){

if(j==0){
p[i][0]=start;
}else if(j==9){
p[i][j]=goal;
}
printf("%d",p[i][j]);
}
printf("\n");
}
--------------------------------------------------------


↓こうした方が良いと思います。
--------------------------------------------------------
for(i=0;i<PS;i++){
p[i][0] = start;
p[i][9] = goal;
for(j=0;j<GL;j++){
printf("%d",p[i][j])
}
printf("\n");
}
--------------------------------------------------------

むしろ、最初のfor文で値の代入はやっておいて、最後のfor文ではprintf関数のみ(表示する処理のみ)
にした方が良いと思います。


950ポイント を手に入れた。

Name: pkt  ..かけだし(1,622ポイント)   Date: 2009/11/04(水) 22:42   No:41427     
Title: Re:初期集団の生成    
ご意見ありがとうございます。
どちらの方法も判り易く説明していただいて助かります。
前者の2の操作なのですが、3へ進む、1へ戻るの処理の方法がなかなか難しく悩んでおります。
戻るという処理を今まで書いたことがないというのもありますが・・・
よければ、処理方法の例などを参考にさせていただけないでしょうか?
申し訳ありません。


9ポイント を手に入れた。

Name: conio [URL]  ..比類無きプログラマー(73,401ポイント)   Date: 2009/11/04(水) 23:08   No:41430     
Title: Re:初期集団の生成    

「条件が達成できるまで繰り返す」というのはdo while文を使ったりします。
自分は一応こんな感じにしました。
---------------------------------------------------------------------------
do{
flag = 0
//乱数を生成し、被っていればflag = 1 (繰り返す)
//被っていなければ何もしない。 (flag に0が代入されているので、do while文を抜ける)
}while(flag);
---------------------------------------------------------------------------

前回の記述との対応関係はこんな感じでしょうか。
---------------
do{
flag = 0;
【1】
【2】
}while(flag);
【3】
---------------



全体のプログラムの中でいうと、赤字の部分です。
このままコピーペーストで実行できます。
-----------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
srand((unsigned int)time(NULL));
int Value[10][10] = {0};

for(int i = 0; i < 10; i++){
Value[i][0] = 0;
Value[i][9] = 9;
for(int j = 1; j < 10 - 1; j++){
int temp;
int flag;
do{
flag = 0;
temp = rand() % 8 + 1;
for(int k = 1; k <= j; k++){ //被っていないか以前の要素を探索
if(temp == Value[i][k]){
flag = 1;
break;
}
}
}while(flag);

Value[i][j] = temp;
}
}

//表示処理
for(int i = 0; i < 10; i++){
printf("Value[%d] = ",i);
for(int j = 0; j < 10; j++){
printf("%2d", Value[i][j]);
}
puts(" ");
}

return(0);
}
-----------------------------------------------------------------------


418ポイント を手に入れた。

Name: non  ..熟練のプログラマー(65,622ポイント)   Date: 2009/11/05(木) 08:33   No:41437     
Title: Re:初期集団の生成    
なるべく、元のプログラムを尊重しました。


#define PS 10 /*遺伝子プール*/
#define GL 10 /*長さ*/
#define start 0/*スタート*/
#define goal 9/*ゴール*/
int xrand(int, int);
int main(void)
{
int p[PS][GL];
int g[GL];
int i,j,k,m;
int rnd;
srand((unsigned)time(NULL));
printf("初期集団\n");
for(i=0;i<PS;i++){
for(j=1;j<GL-1;j++)
g[j]=0;
for(j=1;j<GL-1;j++){
do{
rnd=xrand(1,8);
if(g[rnd]==0)
break;
}while(1);
p[i][j]=rnd;
g[rnd]=1;
//printf("%d",p[i][j]);
}
//printf("\n");
}

for(i=0;i<PS;i++){
for(j=0;j<GL;j++){

if(j==0){
p[i][0]=start;
}else if(j==9){
p[i][j]=goal;
}
printf("%d ",p[i][j]);
}
printf("\n");
}
return 0;
}


307ポイント を手に入れた。

Name: pkt(自宅)  ..ぴよぴよ(360ポイント)   Date: 2009/11/06(金) 14:13   No:41514     
Title: Re:初期集団の生成    
すごくわかりやすく説明していただいて助かりました。
ありがとうございました。
さらにここに

const char list[kazu][6]={
1,2,3,-1,-1,-1,/*A*/
0,2,5,8,-1,-1,/*B*/
0,1,3,4,5,-1,/*C*/
0,2,4,-1,-1,-1,/*D*/
2,3,5,6,-1,-1,/*E*/
1,2,4,6,7,-1,/*F*/
4,5,9,-1,-1,-1,/*G*/
5,8,9,-1,-1,-1,/*H*/
1,7,-1,-1,-1,-1,/*I*/
6,7,-1,-1,-1,-1/*J*/};

のような隣接リストの情報を加え、より経路探索のための初期集団にしていこうと思っています。
この隣接リストの関連付けを行う方法を調べていたのですが、予想以上に進みませんでした。
どのような方法で行うのがよいのでしょうか?教えていただけると嬉しく思います。


360ポイント を手に入れた。

Name: non  ..熟練のプログラマー(66,394ポイント)   Date: 2009/11/07(土) 10:45   No:41544     
Title: Re:初期集団の生成    
誰からもRESがない理由は、意味がわからないからです。
あなたと同じ、授業を受けているわけではありませんので、
世間一般でわかるように説明してもらわないと、なんのことを質問
されているのかわかりません。


2倍のポイントを手に入れた! 150ポイント を手に入れた。

Name: pkt(自宅)  ..ぴよぴよ(662ポイント)   Date: 2009/11/07(土) 11:32   No:41546     
Title: Re:初期集団の生成    
そうですね。すいません。言葉が全く足りてませんね。

const char list[kazu][6]={
1,2,3,-1,-1,-1,/*A*/
0,2,5,8,-1,-1,/*B*/
0,1,3,4,5,-1,/*C*/
0,2,4,-1,-1,-1,/*D*/
2,3,5,6,-1,-1,/*E*/
1,2,4,6,7,-1,/*F*/
4,5,9,-1,-1,-1,/*G*/
5,8,9,-1,-1,-1,/*H*/
1,7,-1,-1,-1,-1,/*I*/
6,7,-1,-1,-1,-1/*J*/};

上のプログラムはノードのつながりを表していまして
Aの点とB、C、D
Bの点とA、C、F、I
とつながっているという事を表したリストになります。
これをプログラムに関連付けることによって
0の次は1,2,3のうちの1つをランダムで出す。
1の次は0,2,5,8からランダムで1つ出す。
のようなプログラムを作りたいのですが、関連付けのさせ方がわからず困っていました。
方法としてはどのようなものがあるのでしょうか?


302ポイント を手に入れた。

Name: conio  ..比類無きプログラマー(73,787ポイント)   Date: 2009/11/07(土) 12:22   No:41554     
Title: Re:初期集団の生成    
おおまかな流れはこんな感じでしょう。
-------------------------------------------------------
【1】それぞれの遷移先の数を調べる。
【2】rand()の値を、遷移先の数で割った余りを求める。
【3】その余りを添え字として使い、配列の値を得る。
【4】得られた配列の値を、現在の状態とする。
-------------------------------------------------------


まず遷移先の数を求めます。

"A"の場合は3です。
"A"の遷移先の数は3なのでその余りを求めます。
--------------------------------------------
temp = rand() % 3; //0〜2の値が出る。
--------------------------------------------

その結果を添え字として使います。
-------------------------------
NowState = list[NowState][temp];
-------------------------------

NowStateには、list[0][0]、list[0][1]、list[0][2]のどれかの値が入ることになります。
(つまり、1・2・3のどれか

また遷移する場合は、上記の計算を全く同じ方法で行うだけです。
"B"の遷移先の数は4で、 temp = rand() % 4; ・・・・みたいな。

あと、添え字に使うので、listはchar型ではなく、int型がいいと思います。


319ポイント を手に入れた。

Name: non  ..熟練のプログラマー(66,652ポイント)   Date: 2009/11/07(土) 12:44   No:41555     
Title: Re:初期集団の生成    
ぱっと、conioさんの文章を読んだだけなので、勘違いかもしれないけど、
既に使ったノードかをチェックして乱数を再発生する必要がありそうです。
そうすると、ノードの順番によっては、先に進めなくなる可能性もあるかも。
すると、再帰呼び出しが必要かなぁ?
その場合は乱数でなくて、解が何通りあるかを全部出して、その中から
乱数で解を選んだ方がいいかもしれない。
ちょっと、絵でも描いて、なぞってみないとわかんないです。
pktさん、絵を描いてそんなことはありませんでしたか?
ところで、先頭は必ずAですか?



258ポイント を手に入れた。

Name: non  ..熟練のプログラマー(66,660ポイント)   Date: 2009/11/07(土) 13:39   No:41556     
Title: Re:初期集団の生成    
それから、最後はJ?



8ポイント を手に入れた。

Name: pkt(自宅)  ..ぴよぴよ(743ポイント)   Date: 2009/11/07(土) 23:09   No:41568     
Title: Re:初期集団の生成    
conioさんありがとうございます。少しみながら頑張ってみたいと思います。
nonさん、現在はAからJですが、ゴールはまだまだ伸びますので、複雑になるのかなぁとは思います。
教授にお聞きしたところ、最低でも100という答えがきてまして・・・


81ポイント を手に入れた。

Name: non  ..熟練のプログラマー(66,676ポイント)   Date: 2009/11/08(日) 09:36   No:41578     
Title: Re:初期集団の生成    
やっぱり、再帰がいいでしょうね。


16ポイント を手に入れた。

Name: pkt(自宅)  ..ぴよぴよ(792ポイント)   Date: 2009/11/08(日) 11:45   No:41581     
Title: Re:初期集団の生成    
再帰とはどのような方法なのでしょうか?
いままで自分がやろうと思っていたやり方とは全く別物な感じでしょうか?


49ポイント を手に入れた。

Name: non  ..熟練のプログラマー(67,014ポイント)   Date: 2009/11/08(日) 12:41   No:41583     
Title: Re:初期集団の生成    
再帰呼び出し、リカーシブコールで検索するといいでしょう。
考え方として、
題意から、
ネットワークの図を書いてみて下さい。
A,B・・・Fのノードは○で囲み、関連づけを線で繋ぎます。
この絵で、AからFまですべてのノードを通る一筆書きが求める解ですね。
あなたは、この解を紙と鉛筆でもれなく全ての解をみつけなければいけないと
したら、どのような方法をとりますか。
AからBCDと3通りありますが、どの道を選ぶか、乱数で決めますか?
そんなことは、しないでしょう。
もれなく道を選ばなければいけないとしたら、まず、Bを選び、Bから行ける
道を全て試した後、C、Dと順番に試して行くでしょう。
すなわち、あるノードから順番に道に進んでいく、進めなくなったら、前に戻り
次の道を進むという方法を繰り返していくわけです。
これを実現するプログラムの方法が再帰呼び出しです。

今回、この課題が卒論などのゼミで行われているのであれば、自分で基本から
勉強することをお勧めします。ただ単に、授業の課題なら、解答例のプログラムを
お見せしてもかまいません。


338ポイント を手に入れた。

Name: pkt(自宅)  ..ぴよぴよ(872ポイント)   Date: 2009/11/09(月) 00:13   No:41602     
Title: Re:初期集団の生成    
今回の課題はここまでとなっています。
授業では、あまり詳しくやってくださらない教授なのでなかなか困っています。
自分でも再帰呼び出しについて調べてみました。
考え方はわかりましたが、なかなかプログラムとして上手くいきません。
よければ、助けていただけないでしょうか?


80ポイント を手に入れた。

Name: non  ..熟練のプログラマー(67,589ポイント)   Date: 2009/11/09(月) 09:09   No:41610     
Title: Re:初期集団の生成    
>今回の課題はここまでとなっています。
まだ、遺伝的アルゴリズムには入ってませんよ。
これから、もっと難しくなるので、理解することをお勧めします。


#include <stdio.h>
int list[10][6]={
1,2,3,-1,-1,-1,/*A*/
0,2,5,8,-1,-1,/*B*/
0,1,3,4,5,-1,/*C*/
0,2,4,-1,-1,-1,/*D*/
2,3,5,6,-1,-1,/*E*/
1,2,4,6,7,-1,/*F*/
4,5,9,-1,-1,-1,/*G*/
5,8,9,-1,-1,-1,/*H*/
1,7,-1,-1,-1,-1,/*I*/
6,7,-1,-1,-1,-1/*J*/};
int g[10]={0};
int p[10];
void disp_list(int m)
{
int i;
for(i=0;i<=m;i++)
printf("%d ",p[i]);
printf("\n");
}
void make_list(int m,int n)
{
int i;
if(g[n]==1)
return;
p[m]=n;
if(m==9 && n==9){
disp_list(m);
return;
}
g[n]=1;
for(i=0;i<6;i++){
if(list[n][i]!=-1)
make_list(m+1,list[n][i]);
}
g[n]=0;
return;
}
int main(void)
{
make_list(0,0);
return 0;
}






575ポイント を手に入れた。



Name: 初心者  ..プログラマー(38,227ポイント)   Date: 2009/11/06(金) 01:13   No:41495       
Title: 無題    
C言語をはじめて間もない者です。
行き詰ったので助けていただきたく投稿します。

ゲームプログラミングの館の方で”画像を表示する”のステップより…。
自分で作った画像(PNG)をウィンドウに表示させようとしたら映されませんでした。
その後、うまくできなかった人用に書かれてあったもう一つのプログラムで挑戦したところ
今度はうまく映してくれました。
(練習用にあった画像は最初のプログラムでも映すことができました。)

プログラムを書いていく身、今のうちにひとつ目のプログラムで映せなかった原因を解いておきたい次第です。

お手数ですが力を貸していただけないでしょうか。
よろしくお願いします。




307ポイント を手に入れた。


Name:  ..かけだし(2,456ポイント)   Date: 2009/11/06(金) 03:17   No:41497     
Title: Re:無題    
自分がプログラムを答えていい身分の人間かはわからんが、DxLibで
自分も過去に経験した例から可能性を上げてみると、


LoadGraphScreenではなくDrawGraphのようにメモリに読み込む必要がある関数ではないか?
この場合LoadGraph等画像をメモリに読み込む必要がある。

拡張子を間違ってないか?
.bmp .png etc

visual studioでF7などでビルドその後実行ファイル(.exe)を起動したとき場合、画像への相対パスが誤っていないか?
この場合に限らず相対パスが正しいかどうか?

裏画面への描写になっていないか?
表画面への描写またはScreenFilpの使用。


自分が経験したのはこんなとこだろうか…


正直自分も初心者なんで的を得た答えになっているかはわからんが…

質問の内容を見る限りそんなに長いソースでもなさそうなんで、実際にソースコードをあげてみてはどうか…


389ポイント を落としてしまった。

Name: kazuoni [URL]  ..ハッカー(111,944ポイント)   Date: 2009/11/06(金) 03:25   No:41498     
Title: Re:無題    
初めての投稿でしょうか?
「初心者」「匿名」「通りすがり」などはいろいろな方が使用されています。(かぶっている)
今後も質問するかもしれないならば、違う名前にしたほうが、
以後、質問しやすくなるかと思います。

今回の質問の件ですが、様々な理由が考えられます。
・記述ミス(ファイル名、描写の仕方等)
・画像の保存先を間違えていた。
・画像の描写はしているが、その画像の上に、さらに画像を書いてしまっていて見えない
など。
二つのコードorプロジェクトごとUPすれば、
よりよい回答が得られるかと思いますよ^^


165ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(111,969ポイント)   Date: 2009/11/06(金) 03:25   No:41499     
Title: Re:無題    
ごめんなさい。。内容がもろかぶりでしたorz

25ポイント を手に入れた。

Name: スタートメニュー  ..ぴよぴよ(429ポイント)   Date: 2009/11/06(金) 08:07   No:41502     
Title: Re:無題    
名前は(初心者)改め(スタートメニュー)

寺さん
ご返事ありがとうございます。
引っかかったことは(LoadGraph等画像をメモリに読み込む必要)というところでした。
メモリに読み込ませるには単にビルドするという事ではないのでしょうか?
load.ccpは以下の通りです。

#include "../include/GV.h"

extern int img_ch[1][12];

void load(){
LoadDivGraph( "../dat/img/char/1.png" , 12 , 4 , 3 , 73 , 73 , img_ch[1] ) ;
}

main.ccpが以下の通りです。

#define GLOBAL_INSTANCE
#include "../include/GV.h"

//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);

//データのロード
extern void load();

//描画メイン
extern void graph_main();

int img_ch[1][12]; //キャラクタ画像9枚分 X2(変身用)
ch_t ch; //キャラクタデータ宣言

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン

if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}

後はgraph.ccpが以下の通りです。

#include "../include/GV.h"

extern ch_t ch;
extern int img_ch[1][12];

void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[1][ch.img],TRUE);
}

void graph_main(){
graph_ch();
}


こんな感じになっています。
尚、これは龍神録プログラミングの4章までを立てて、charフォルダ内に1.pngを作って実行させようとしているところです。

kazuoni
ご返事ありがとうございました。
上部プログラムを0.pngに戻すと龍神録プレイヤーが映ります。
1.pngを作り上部プログラムを1.pngに書き直すと表示されません。
困っております…。

名前は初心者改め(スタートメニュー)にします。


429ポイント を手に入れた。

Name: Mikan  ..中級者(10,755ポイント)   Date: 2009/11/06(金) 12:50   No:41510     
Title: Re:無題    
んー2点ほど・・・

1.
>上部プログラムを0.pngに戻すと龍神録プレイヤーが映ります。
ファイルの場所を0.pngと同じところに保存していますか?

2.
作成されたpngファイルは、ダブルクリックすると見ることができますでしょうか?
見ることができなければ、pngファイルじゃない可能性があります。


124ポイント を手に入れた。

Name:  ..入門者(2,526ポイント)   Date: 2009/11/06(金) 19:41   No:41523     
Title: Re:無題    
プログラムの問題じゃなくて、画像ファイルのほうの問題かな?


サイズがあってないとか…


自分もよくSAI等でデジ絵を描いてて出来上がった後、リサイズ忘れてpixivにはっちゃったりとかした経験があるんで…


あとは1.pngの1が全角になっているとか…


70ポイント を手に入れた。

Name: ひよこ  ..熟練のプログラマー(65,242ポイント)   Date: 2009/11/06(金) 22:06   No:41524     
Title: Re:無題    
int img_ch[1][12];で
LoadDivGraph( "../dat/img/char/1.png" , 12 , 4 , 3 , 73 , 73 , img_ch[1] ) ;
これはだめです。img_ch[0]にしましょう。これだと、配列の外にアクセスしていると思います。


89ポイント を手に入れた。

Name: スタートメニュー  ..ぴよぴよ(625ポイント)   Date: 2009/11/07(土) 01:32   No:41535     
Title: Re:無題    
Mikanさん
ご返事ありがとうございます。
1について
はい。0.pngと同じところ(charフォルダに)いれてます。
2について
ダブルクリックするとWindows画像とFAXビューアウィンドウに表示されます。

寺さん
ご返事ありがとうございます。
大きさは0.pngと同じ292×219となっております。
またプログラム上全角にはなってませんでした。

ひよこさん
ご返事ありがとうございます。
LoadDivGraph( "../dat/img/char/1.png" , 12 , 4 , 3 , 73 , 73 , img_ch[1] ) ;
のところだけ変えても表示されませんでした。
もしかして全てのimg_ch[1]のところでしょうか?


ご意見よろしくお願いいたします。


196ポイント を手に入れた。

Name: Akira  ..ぴよぴよ(40ポイント)   Date: 2009/11/07(土) 16:26   No:41561     
Title: Re:無題    
void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[1][ch.img],TRUE);
}
のimg_ch[1][ch.img]をimg_ch[0][ch.img]に変更したらいいかと思います。


40ポイント を手に入れた。

Name: スタートメニュー  ..ぴよぴよ(767ポイント)   Date: 2009/11/07(土) 17:23   No:41562     
Title: Re:無題    
Akiraさん
ご返事ありがとうございます。
変更してみましたが映りませんでした。
ここまで映らないと画像に疑惑感が出てきました。

そういえば、寺さんの「pixivにはる」とはどういうことでしょうか。教えてください。

龍神録のcharフォルダにもともと入っているball.pngなどに書き換えると、
そちらはちゃんと映し出されるのでやはり自分の描いた画像に何らかがあると思うのです。
(自分はSAIを使用)

皆さんのご意見お待ちしております。


142ポイント を手に入れた。

Name: スタートメニュー  ..ぴよぴよ(818ポイント)   Date: 2009/11/07(土) 17:30   No:41563     
Title: Re:無題    
pixivは調べました。
一つ疑問に思うんですが、
SAIで292×219(龍神録の0.pngの大きさと同じ)で新規作成したらリサイズって必要ないですよね?


51ポイント を手に入れた。

Name: Akira  ..ぴよぴよ(0ポイント)   Date: 2009/11/07(土) 18:10   No:41565     
Title: Re:無題    
適当にペイントソフトで292*219の画像を作成して、charフォルダに同じように1.pngという名前を作成してテストしてみました。
1.pngには単に画面を埋め尽くす四角形を描いただけですが、テスト結果からみル限り、ウィンドウの左上に1.pngの左上周辺が描かれていました。
尚、同じように龍神録プログラミング4章の内容を利用して、修正したのはload.cppのLoadDivGraph関数の画像リンク先を0.pngから1.pngに変更した程度です。その他は一切変更していません。
参考になるかは分かりませんが、適当な画像を作成して改めてテストしてみてはいかがでしょうか。


172ポイント を落としてしまった。

Name: スタートメニュー  ..ぴよぴよ(848ポイント)   Date: 2009/11/08(日) 01:20   No:41569     
Title: Re:無題    
Akiraさん
ご返事+試行までしていただきありがとうございます。

指示通りにペイントで作って実行しましたが映りませんでした。
0.pngは映るのに1.pngに変えたとたんウィンドウは真っ黒のみです。

一応フォルダ構成を載せます。

gameフォルダ
トdatフォルダ
トDebugフォルダ
トincludeフォルダ
トgame.ncb
トgame.sln
トgame.suo

datフォルダ
トcsvフォルダ
トfontフォルダ
トimgフォルダ
トmusicフォルダ
トseフォルダ

Debugフォルダ
トLog.txt
トgame.exe
トgame.ilk
トgame.pdb

include
トDX関連と思われる19項目


ご意見お待ちしております。


30ポイント を手に入れた。

Name: Akira  ..ぴよぴよ(203ポイント)   Date: 2009/11/08(日) 18:46   No:41600     
Title: Re:無題    
 No:が異なるかもしれませんが、Akiraです。
 手間ですが、SAIで0.pngを読み込み、何もしないで別の名前(今回の場合でしたら1.pngでしょうか)で保存。その画像を読み込ませると映るかどうか、テストしてみてください。映るようでしたら画像データには問題はないと思います。
 問題がないことを確認したら、1.pngに描かれているキャラクタに高さ・幅ともに被せるように、自作の画像を切り取って貼り付けするなりしてみてください。位置を変更してはいけません。画像データの読み込みに成功していても、何もない場所を映している可能性がありますから。位置を変更しなければ0.pngの一番左上のキャラクタの、右下に当たる部分が映る筈です。
 とりあえず、以上の手順を試して見てはいかがでしょうか。


203ポイント を手に入れた。

Name: スタートメニュー  ..ぴよぴよ(874ポイント)   Date: 2009/11/08(日) 19:56   No:41601 解決!     
Title: Re:無題    
Akiraさん
ご返事ありがとうございます。

自分はとんだ勘違いをしておりました。
私はVisual C++ 2008を使っております。
まだ始めたばかりの自分は"ビルド"した後の開くウィンドウをてっきり実行画面と思っておりました。

申し訳ありません。

ビルドした後は実行ファイルから確認するべきでした。
game.exeファイルから実行したらしっかり映っていました。

kazuoniさん
Mikanさん
寺さん
ひよこさん
Akiraさん
上記皆様、自分のケアレスミスによってご迷惑をおかけして
本当にごめんなさい。
そしてご意見ありがとうございました。


26ポイント を手に入れた。



Name: ピーマァン  ..ぴよぴよ(112ポイント)   Date: 2009/11/07(土) 20:39   No:41566       
Title: DXライブラリの使い方    
東方みたいなシューティングを作りたいと思いC言語をはじめてみました
それで基礎は一通りやったので
DXライブラリをつかっていろいろしようとおもったのですが
DXライブラリというものがそもそもなにでどうやって設定したりするのか
まったくわかりません><
自分はあまり賢くないのでわかりやすく誰か教えてください
おねがいします


112ポイント を手に入れた。


Name: チルチル  ..比類無きプログラマー(73,685ポイント)   Date: 2009/11/07(土) 21:32   No:41567     
Title: Re:DXライブラリの使い方    
とりあえず本家のサイトは見たでしょうか?

http://homepage2.nifty.com/natupaji/DxLib/


37ポイント を落としてしまった。

Name: ピーマァン  ..ぴよぴよ(221ポイント)   Date: 2009/11/08(日) 06:51   No:41576     
Title: Re:DXライブラリの使い方    
もう一度最初から見直したらできました
ありがとうございます^^

ですがDXライブラリの使い方を学習していたんですが
一つのプロジェクトにたくさんあると見にくいので2つ目のプロジェクトをつくったんですが
「WinMain@16 は既に 1〜9.obj で定義されています」
とでてエラーになります
コノ場合はどうすればいいのでしょうか?
どこかで設定を間違えたのでしょうか?


109ポイント を手に入れた。

Name: チルチル  ..比類無きプログラマー(73,830ポイント)   Date: 2009/11/08(日) 11:52   No:41582     
Title: Re:DXライブラリの使い方    
え〜と状況が良くわからないのですが

>一つのプロジェクトにたくさんあると見にくいので

何が沢山あるのでしょうか?

>2つ目のプロジェクトをつくったんですが

そこには何を入れていますか?

>「WinMain@16 は既に 1〜9.obj で定義されています」

おそらく1〜9.cppがあるんだと思いますが
そこには何が書かれていますか?

全部にWinMain関数が書いてあったりしませんか?


145ポイント を手に入れた。

Name: ピーマァン  ..ぴよぴよ(326ポイント)   Date: 2009/11/08(日) 12:57   No:41584     
Title: Re:DXライブラリの使い方    
回答ありがとうございます

>何が沢山あるのでしょうか?
ちょっと間違えました><
えと二つ目のcpp形式のものを作りたかったということです

>全部にWinMain関数が書いてあったりしませんか?
二つ目のものにも1つ目と同じようにかきました
二つ目からはどのようにかけばいいのでしょか?


105ポイント を手に入れた。

Name: チルチル  ..比類無きプログラマー(73,952ポイント)   Date: 2009/11/08(日) 13:22   No:41585     
Title: Re:DXライブラリの使い方    
あ〜なるほど、何となくわかったかもしれません

とりあえずプログラムが複数のプロジェクトにまたがっているのはマズイので
プロジェクトが複数あるなら1つにしてください

おそらく分割コンパイルが良くわからないみたいなので

http://www.geocities.jp/ky_webid/c/032.html

この辺が参考になるかもしれません


122ポイント を手に入れた。

Name: ピーマァン  ..ぴよぴよ(152ポイント)   Date: 2009/11/08(日) 13:49   No:41586     
Title: Re:DXライブラリの使い方    
よくわからないのでもう一度かかせてもらいます><

今したいことは
二つ目以降のcppのファイルで今までどおりのをコピペして実行したところ
WINAPIのところのやつで再定義されているとでてしまったのでそれの解決法がしりたいってことです

参考にだしてもらったのを見ましたが
自分で定義した関数を複数のファイルに読み取らせるにはexternをつけなきゃいけないよ
ってことですよね?

てことはDxLib.hのファイルに何か手を加えないといけないってことですか?

もし意味不明だったらすいません;;


174ポイント を落としてしまった。

Name: チルチル  ..比類無きプログラマー(73,160ポイント)   Date: 2009/11/08(日) 14:28   No:41588     
Title: Re:DXライブラリの使い方    
>二つ目以降のcppのファイルで今までどおりのをコピペして実行したところ

一つ目と二つ目以降は全部同じものが書かれているんでしょうか?

差し支えなければプログラムを全部添付していただけませんか?

>WINAPIのところのやつで再定義されているとでてしまったのでそれの解決法がしりたいってことです

そこは理解しているので大丈夫です

先ほどのサイトの内容が理解できれば解決できると思いますが
さすがにアレだけで理解するのは無理がありますね・・

エラーの内容は「WinMain関数が複数定義されているので、どれを使えば良いかわからない」と言うものです

なのでWinMain関数を1つだけ残して後は消してください

そして

>自分で定義した関数を複数のファイルに読み取らせるにはexternをつけなきゃいけないよってことですよね?

これは方法によります

externを使わなくてもできますが
どの方法が一番良いかは時と場合によります

とりあえず今回はexternを使えば良いと思います

前提知識の話ですが
ヘッダをインクルードするのは
コンパイル時にヘッダに書かれている内容が
インクルードしている場所に貼り付けられると言うものです

なので複数のcppに同じ宣言を書く時はヘッダに書いておいてインクルードした方が管理がしやすいのです
つまりプログラムの「大きな」部品化です、「小さな」は関数とかです

>てことはDxLib.hのファイルに何か手を加えないといけないってことですか?

ヘッダファイルに手を加える必要は無いです

関数はブラックボックスと言う考え方があります
つまり引数と戻り値がわかっていれば中身を知らなくても使えます

ヘッダファイルには宣言を書きます
関数ならプロトタイプ宣言を書きます
つまり引数と戻り値が何かを宣言します

ソースファイルには定義を書きます
関数の実体、つまり中身です

例えばmain.cppにWinMain関数の定義を書きます

WinMain関数の中でSum関数を使います

Sum関数の定義はSum.cppに書いてあります

Sum関数のプロトタイプ宣言はSum.hに書かれています

main.cppでWinMain関数の前にSum.hをインクルードすれば

WinMain関数からSum関数の中身は見えませんが

Sum関数の使い方は見えるのでWinMain関数はSum関数を使う事ができます

>もし意味不明だったらすいません;;

今の所はわかりやすいので大丈夫ですよ


792ポイント を落としてしまった。

Name: ピーマァン  ..ぴよぴよ(185ポイント)   Date: 2009/11/08(日) 14:50   No:41589     
Title: Re:DXライブラリの使い方    
なるほど!
WINAPIのところをなくしてint main()にしたらできました
わかりやすい説明ありがとうございました m(_ _)m


33ポイント を手に入れた。

Name: チルチル  ..比類無きプログラマー(73,197ポイント)   Date: 2009/11/08(日) 14:58   No:41590     
Title: Re:DXライブラリの使い方    
ん?DXライブラリを使うのにWINAPI WinMain関数じゃなくてmain関数って言うのは大丈夫なんでしょうかね・・

37ポイント を手に入れた。

Name: ピーマァン  ..ぴよぴよ(396ポイント)   Date: 2009/11/08(日) 15:14   No:41591     
Title: Re:DXライブラリの使い方    
一応できました;;
ですが3つめのをmain関数にするとまたエラーが・・・

二つ目に作ったのをのせるので間違っているところがあれば教えてください><

#include "DxLib.h"
int main(){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了



//3、4 画像表示

LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
//つまりtrueが透過処理をする falseが透過処理をしない


WaitKey(); // キーの入力待ち(なにかキー入力があるまで待つ)
DxLib_End(); // DXライブラリの終了処理
return 0;
}



これって一つのパソコンの中にWINAPIやmainは一回しか書かない
というような意味なんでしょうか?
違いますよね? どうすればいいんでしょう・・・


211ポイント を手に入れた。

Name: チルチル  ..比類無きプログラマー(73,957ポイント)   Date: 2009/11/08(日) 15:42   No:41592     
Title: Re:DXライブラリの使い方    
あ〜なるほど説明不足でした

オーバーロードは別として基本的にmain関数に限らず同名の関数とか変数とかは
コンパイラがどれを使えば良いかわからないのでエラーになります

と言うかWINAPI WinMainでもmainでもmain関数である事に変わりはありません

コンソールプログラムの時はmainを使って

Windowsプログラムの時はWINAPI WinMainを使うといった違いがあるだけです

DXライブラリを使うのでWINAPI WinMainですね

プログラムは基本的にmain関数から始まるので複数あってはいけません

main.cppにWINAPI WinMain関数を書いて

他の関数は別々のcppに定義を書いておいて

対応するヘッダをmain.cppでインクルードして

WINAPI WinMain関数で他の関数を呼び出すのが基本的な流れです

今回の場合においては

まずmain.cppと言うソースファイルを作ってWINAPI WinMain関数を書きます



>ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
>if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

この辺はmain.cppに書いておけば良いと思います



>LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
>LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
>//つまりtrueが透過処理をする falseが透過処理をしない

この辺は別の関数の中に書いておいて
その関数は別のcppファイルに定義を書いておきます

そしてこの関数のプロトタイプ宣言を対応するヘッダに書いておきmain.cppでインクルードします



WINAPI WinMain関数でその関数を呼び出した後に

>WaitKey(); // キーの入力待ち(なにかキー入力があるまで待つ)
>DxLib_End(); // DXライブラリの終了処理
>return 0;

この辺を書いておきます



#include "DxLib.h" はDXライブラリの関数を使っているcppだけに書けばOKです


760ポイント を手に入れた。

Name: ピーマァン  ..ぴよぴよ(570ポイント)   Date: 2009/11/08(日) 16:10   No:41595     
Title: Re:DXライブラリの使い方    
理屈はだいたいわかりましたが書きかたがいまいちわかりません

>>LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
>>LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
>>//つまりtrueが透過処理をする falseが透過処理をしない
(とくに上のインクルードのところです)

何か具体例でいいので書き方一覧を見たいのですがそれがのっているサイトはありませんか?


174ポイント を手に入れた。

Name: ピーマァン  ..ぴよぴよ(619ポイント)   Date: 2009/11/08(日) 16:20   No:41597 解決!     
Title: Re:DXライブラリの使い方    
あ さっき紹介してくださったサイトみてみたらできました^^
最後まで教えてくださってありがとうございましたm(_ _)m


49ポイント を手に入れた。



Name: IF  ..ぴよぴよ(88ポイント)   Date: 2009/11/08(日) 14:18   No:41587       
Title: if文    
すみません。単発な質問なんですが
龍神録で現在のステージカウントがボス登場時間の10分の9以上ならば
という条件を作りたいのですがうまくいかなくて困ってます・・
どうすればいいのかお願いします。

if(stage_count>=boss.appear_count[1]*9/10){
}


88ポイント を手に入れた。


Name: 初級者  ..初心者(6,994ポイント)   Date: 2009/11/08(日) 15:44   No:41593     
Title: Re:if文    
どのようにうまくいかないかを具体的に書いてください。

12ポイント を手に入れた。

Name: IF  ..ぴよぴよ(130ポイント)   Date: 2009/11/08(日) 16:01   No:41594 解決!     
Title: Re:if文    
すみません。自己解決しました。
というより
最初に書いてあるとおりでいけました。


42ポイント を手に入れた。



Name: high_lows  ..ぴよぴよ(244ポイント)   Date: 2009/11/08(日) 01:35   No:41570       
Title: エクセルと文字列    
龍神録プログラミングの館に、エクセルを使って、敵のデータを読み込む方法が記載されていますが、
あの要領で、敵の名前や説明を読み込めるようにしたいです。
しかし、文字列なので整数と同じに扱うわけにもいかず、itoa関数でもうまくいきません。
どうすればいいでしょう。


129ポイント を手に入れた。


Name:  ..ぴよぴよ(186ポイント)   Date: 2009/11/08(日) 01:56   No:41571     
Title: Re:エクセルと文字列    
11章関連であってますかね?

case X: strcpy( char型の配列へのポインタ , 読み込んだ文字列 );

でどうでしょうか。
(<string.h>のインクルードが必要です。)


91ポイント を手に入れた。

Name: high_lows  ..ぴよぴよ(303ポイント)   Date: 2009/11/08(日) 03:01   No:41573     
Title: Re:エクセルと文字列    
ぴよぴよさん、回答感謝します。
しかし、「読み込んだ文字列」と書いてありますが、その読み込み方がわからないのです。
エクセルのあるセルに文字列を書いて、それを読み込む方法が。。。


59ポイント を手に入れた。

Name: box  ..ハッカー(145,969ポイント)   Date: 2009/11/08(日) 08:06   No:41577     
Title: Re:エクセルと文字列    
Excelで保存するときに「CSV形式」を使うのはおわかりですか?

27ポイント を手に入れた。



Name: ft  ..初心者(6,298ポイント)   Date: 2009/11/07(土) 02:14   No:41536       
Title: シフト演算    
こんにちは。PSPにて弾幕ゲーを再現しようと試みております。
ある画像がスライドしながら次第に大きくなっていく状態を300カウントでループし描き続けようと思い、
次のようにしてみました。
A:サイズの倍率
B:初期倍率
C:変化量
として、画像サイズが256カウントでA=1(倍)となり、300カウント後に最初に戻るというものです。

float A,B,C;
int cnt;

B=0.5f;
C=0.5f;
cnt++;
while(300<=cnt)cnt-=300;

A=B+C*(float)cnt/256;

このままでも動作するのですが、複数用いるため/256(*0.00390625fとしております)部分がネックとなりPSP上の動作が不安定です。
そこで/256は右シフトでも表せることを利用したのですが
A=B+C*(float)(cnt>>8);
とやるとうまくいきませんでした。どのように書けばいいのでしょうか?


302ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(458,403ポイント)   Date: 2009/11/07(土) 03:10   No:41539     
Title: Re:シフト演算    

>右シフトでも表せることを利用したのですが

 シフト演算ができるのは整数だけです。

 とりあえず whileを ifにし、cntを floatにしてint->float変換を無くし、
Cの 0.5を定数化して

A=B+cnt*0.001953125f;

とすればわずかに早くなるかもしれませんが、ほとんど効果はないでしょうね……。



 本題とは異なりますが、本当にそこがネックになっているのでしょうか?
 そこがネックになっているとはにわかにはちょっと信じがたいのですが、
パフォーマンスを測定したらその行に問題があった、ということでしょうか?

 あと、試しにコードの最適化オプションをつけてビルドしたり、
或いはその画像の表示命令だけをコメントアウトして実行するとどうなりますか?


301ポイント を手に入れた。

Name: ft  ..初心者(6,490ポイント)   Date: 2009/11/07(土) 03:46   No:41540     
Title: Re:シフト演算    
256という数字を沢山見て、シフトできる→ここが重い、という考えに直結していました。
ここの描画をコメントアウトしたところ、確かに処理が重くなる原因は他の箇所にある事が分かりました。

あと最適化オプションはどうやるのでしょうか?
VC++を使っておりまして、最適化オプションについて調べてみたのですが、説明していることと表示されるウィンドウがどうも違っておりうまくいきませんでした。


192ポイント を手に入れた。

Name: box  ..ハッカー(145,942ポイント)   Date: 2009/11/07(土) 07:38   No:41541     
Title: Re:シフト演算    
>  シフト演算ができるのは整数だけです。

質問者さんは

>A=B+C*(float)(cnt>>8);

のように、int型のcntをシフトした「後で」float型に
キャストしています。
指摘になっていないというか、質問者さんが「実際に」行なったことを
なぞっているだけというか…。


40ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(458,556ポイント)   Date: 2009/11/07(土) 11:36   No:41547     
Title: Re:シフト演算    
 ftさん
>ここの描画をコメントアウトしたところ、確かに処理が重くなる原因は他の箇所にある事が分かりました

 実際観てみないことには詳細はわからないのですが、
CPIの負荷でなく描画の負荷が高いという可能性もありそうですね。

 なんにしても一度きちんとパフォーマンスを測定して、
ボトルネックを正確に絞っていった方がいいかと思います。


 最適化オプションの方は makefileの中のコンパイルオプションに -O2とか -03を
つければいいはずです(ひょっとしたらもう付いているかもしれませんが)。


 ftさん、boxさん
>int型のcntをシフトした「後で」float型に キャストしています

 あ、ほんとですね。少し寝ぼけていたようです。
 失礼しました。
 


153ポイント を手に入れた。

Name: ft  ..初心者(6,614ポイント)   Date: 2009/11/07(土) 16:12   No:41559     
Title: Re:シフト演算    
最適化オプションはどうやら付いていたみたいです。


あと、何度か試しても何か動作がおかしいのでどこかで情報が落ちているのかもしれません。
具体的には画像の大きさがずっと変化しないままスライドしていき、ある時間でいきなり大きく変化する状態です。


124ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(458,683ポイント)   Date: 2009/11/08(日) 02:22   No:41572     
Title: Re:シフト演算    

>大きさがずっと変化しないままスライドしていき、ある時間でいきなり大きく変化する状態です

 それは A=B+C*(float)(cnt>>8) の場合の話ですか?
 cntが 256を越えるまで cnt>>8 の結果が 0なので
そういう挙動になるのだと思います。

 元の A=B+C*(float)cnt/256 にすれば直ると思うのですが、どうでしょう?


127ポイント を手に入れた。

Name: ft  ..初心者(6,662ポイント)   Date: 2009/11/08(日) 03:05   No:41574 解決!     
Title: Re:シフト演算    
やはりそうでしたか、ありがとうございます。元に戻すことにします。
256という数字に妙にこだわり過ぎていました;


48ポイント を手に入れた。

Name: ft  ..初心者(6,712ポイント)   Date: 2009/11/08(日) 03:05   No:41575 解決!     
Title: Re:シフト演算    
やはりそうでしたか、ありがとうございます。元に戻すことにします。
256という数字に妙にこだわり過ぎていました;


50ポイント を手に入れた。



Name: S.K  ..ぴよぴよ(93ポイント)   Date: 2009/11/06(金) 23:39   No:41528       
Title: 敵データの管理について    
現在マリオ風のアクションゲームを作成しております。
現在、敵のデータを管理するのに各ステージごとに敵情報を書いたCSVファイルを作成しています。
これでは今後ステージを増やすごとに敵情報を書いたCSVファイルがどんどん増えていきそうなので、一つのファイルにまとめようと考えています。

しかし、どのようにステージ1の敵、ステージ2の敵、ステージ3の・・・と、分けて読み込めばいいか見当がつきません。
今は、一つのステージにつき一つのファイルで、ステージが始まる直前に該当するファイルを読む込むような形になってます。(読み込み方は龍神録プログラミングの館を参考にさせていただいています。)

どのようにすれば、うまくいくかアドバイスいただけないでしょうか?
わかりにくい文章だとは思いますがよろしくお願いいたします。


93ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(458,102ポイント)   Date: 2009/11/07(土) 01:31   No:41534     
Title: Re:敵データの管理について    

>分けて読み込めばいいか見当がつきません

 別にステージ毎に CSVを分けいても、最終的にアーカイブ化しておけばいいと思うのですが。

 敢えて1つにまとめるなら、要は記述されている敵のデータがどのステージに属しているかが
判別のつくような状態にすればいいわけで、方法はいろいろあります。

 例えばこんなのはどうでしょう。
 最初の列にステージ番号(或いはステージ識別ID)を入れ、
次の列からそのステージの1つめの敵のデータを並べます。
 2つめの以降の敵のデータは次の行の2列目から記述し、1列目は空白にしておきます。

  をタブとすると CSVは


1  敵1のデータA   敵1のデータB   敵1のデータC
   敵2のデータA   敵2のデータB   敵2のデータC
   ..
   敵15のデータA  敵15のデータB  敵5のデータC
2  敵1のデータA   敵1のデータB   敵1のデータC
   敵2のデータA   敵2のデータB   敵2のデータC
   ..
   敵32のデータA  敵32のデータB  敵32のデータC
3  敵1のデータA   敵1のデータB   敵1のデータC
   ..
   敵64のデータA  敵64のデータB  敵64のデータC


こんな感じです。


 CSVの読み込みは1ファイルですしそれほど容量もないと思うので起動時に一気に
全部読み込んでしまっても良しです。


 ステージ毎に読むならまず1列目のステージ番号を頼りに番号が一致するところまで
読み捨て、一致したところから2列目以降の敵のデータを読みます。

 そうして次の行へと移り1列目が空白であるかどうかを調べ、空白であれば
それを2つめの敵のデータとして読み込みます。

 以降、同様の処理を続け1列目にステージ番号の記述があったらそこで読み込みを
打ち切ればいいかと思います。


795ポイント を手に入れた。

Name: S.K  ..ぴよぴよ(0ポイント)   Date: 2009/11/07(土) 17:32   No:41564 解決!     
Title: Re:敵データの管理について    
>Justyさん
 分かりやすい説明ありがとうございます。
 無事に思い通りに実装することができました。

 >最終的にアーカイブ化
 なるほど。そういう方法もあったのですね。
 いろいろ試しながらよさそうな方法を見つけてみたいと思います。
 この度はありがとうございました。


147ポイント を落としてしまった。



Name: UKONN  ..かけだし(1,818ポイント)   Date: 2009/11/07(土) 16:10   No:41558       
Title: 無題    
初歩的な質問ですいません.

sin,cos計算をするにあたり,
math.h というヘッダをインクルードする必要があります.とあるのですがインクルードとはそもそもどういうことでしょうか?


86ポイント を手に入れた。


Name: UKONN  ..かけだし(1,833ポイント)   Date: 2009/11/07(土) 16:24   No:41560 解決!     
Title: Re:無題    
すいません、自己解決いたしました.

15ポイント を手に入れた。



Name: AS  ..初心者(7,792ポイント)   Date: 2009/11/04(水) 16:59   No:41393       
Title: 文字列の\nの取り扱いについて    
わかる方がいましたら是非回答をお願いします。

ゲームの会話シーンなどで文字列を少しずつ表示させたいのですが、その際複数行を出せるようにしたいのです。少しずつ出す方法はゲームプログラミングの館のサウンドノベル風文字列表示法を使っています。

今日は
とっても
いい天気ですね。

この例ですと、一度に3行出ていることになります。

そして現在エクセルに書き込んだメッセージを配列に代入させるところまではできたのですが、
\nの扱いに困っています。

メッセージの代入は
mes[256] = "今日は\nとっても\nいい天気ですね。";
のように入っている状態です(と思う)。
これをmes_disp[256]に少しずつ代入して、少しずつ表示させます。
printfDxでmesとmes_dispを表示させると、しっかりと意図したところで改行がなされています。

しかし先ほどのmesもしくはmes_dispをDrawFormatStringで表示させてもエスケープシーケンスの\nは使用できないようなので、
今日は..とっても..いい天気ですね。というように表示されて改行がされません。

そこでmes_dispを
mes_disp[4][64]
という形に変更し、mes_disp[0]は一行目、mes_disp[1]は二行目…と最大で4行表示させようと考えました。
なので、まずはmesの中から\nの位置を知らなければ!ということで、テスト的に…

for(int i=0; i<256; i+=2;){//全角単位で読み込むためi+=2
if(mes[i]=='\n') printfDx("確認");
}

としてみたところ、「確認」の文字が表示されませんでした。
ここでi+=2のところをi++に変更すると、今度は「確認」の文字が表示されます。
i+=2なのでmes[1]やmes[3]のように奇数に\nが入っていた場合、飛ばされてしまい上手く「確認」の文字が表示されないのもわかりますが、
私の場合は全て全角文字しか使用していません。
つまり「今日は\nとっても\nいい天気ですね」の場合
一つ目の\nはmes[6]に、二つめの\nはmes[15]となり、少なくとも一つ目の\nは認識されるはずです。
なのにもかかわらず一度も「確認」の文字が表示されないのはどういうことなのでしょうか…?



そして申し訳ないですがもう一つ…
龍神録プログラミングの館のエクセルを使って敵の出現データを作ってみようにて
一番初めに宣言されている、int input[64]とchar inputc[64]は何故わざわざ分けられているのでしょうか?
他の部分は全て理解できたのですが、ここだけが理解できません…

int n,num,i,fp;
char fname[32]={"../dat/csv/storyH0.csv"};
int input[64];//コレ!!
char inputc[64];//とコレ!!

fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}


1,348ポイント を手に入れた。


Name: non  ..熟練のプログラマー(65,278ポイント)   Date: 2009/11/04(水) 17:55   No:41398     
Title: Re:文字列の\nの取り扱いについて    
>for(int i=0; i<256; i+=2;){//全角単位で読み込むためi+=2

エラーがあるのが原因では?

2つめはわからないです。


33ポイント を手に入れた。

Name: yskey  ..入門者(3,947ポイント)   Date: 2009/11/04(水) 18:24   No:41400     
Title: Re:文字列の\nの取り扱いについて    
僕もサウンドノベル風文章表示を作りましたが、DXライブラリ置き場さんのサンプルプログラムにある
「サウンドノベル風文字列描画」がとても参考になりました。(DxLibを使ってればの話ですが)

int input[64]とchar inputc[64]に分ける理由は
int input[64]に直接エクセルの数値を読み込むよりも、char inputc[64]に入れてからatoi関数で数値に変換してint input[64]に入れる方が安全だからじゃないでしょうか?




145ポイント を手に入れた。

Name: dic  ..プログラマー(36,523ポイント)   Date: 2009/11/04(水) 18:42   No:41402     
Title: Re:文字列の\nの取り扱いについて    
エクセルで文章を入力しているようでしたら
改行が\r\nになっている可能性もありますので

mes[256] = "今日は\nとっても\nいい天気ですね。";

とたしかになっているか変数の中身を確かめてください



2倍のポイントを手に入れた! 200ポイント を手に入れた。

Name: non  ..熟練のプログラマー(66,138ポイント)   Date: 2009/11/05(木) 10:47   No:41446     
Title: Re:文字列の\nの取り扱いについて    
>int input[64]に直接エクセルの数値を読み込むよりも、char inputc[64]に入れてからatoi関数で数値に変換してint input[64]に入れる方が安全だからじゃないでしょうか?

違うとおもうけどなぁ。作者に聞かないとわからないけど、
FileRead_getc が int型を返すからint型に一回いれて、atoiで数値に変換したいから、
文字列にするために再度char型に入れたのではないでしょうか?
でも、スラッシュとスラッシュ以外でintとcharでわけているのはよくわからないです。


184ポイント を手に入れた。

Name: Libra  ..中級者(9,968ポイント)   Date: 2009/11/05(木) 12:27   No:41455     
Title: Re:文字列の\nの取り扱いについて    
No.24805で自分が質問してJustyさんが答えてくれました。
↓過去ログより


Name: Justy

 まず第一に FileRead_getc() / fgetc()の戻り値は int型です。
 その戻り値を charで受けると、EOFの判定が正しくできないことがあります。
 その為、文字列として格納するために inputcに、EOFや文字の判定の為の変数として inputに格納しているのでしょう。
 とはいえ、inputに関しては配列である必要はなく、ふつうの int型の変数でいいとは思います。


一度公開したものを修正すると、全ての章を変えないといけなくなるので、
int inputが配列なのは、そのままらしいです。


275ポイント を手に入れた。

Name: AS  ..初心者(8,091ポイント)   Date: 2009/11/05(木) 16:48   No:41469     
Title: Re:文字列の\nの取り扱いについて    
皆様ありがとうございます。

DXライブラリ置き場のサンプルも参考にして
意図するとおりに動かすことが出来ました。

\nについては

mes[256] = エクセルから文章読み込み;
for(int i=0; i<256; i++){
if(mes[i]=='\r')
printfDx("確認");
}


のように記述してみたところ、確かに\rが確認できました。
そんな仕様があったのですね…。
しかしそれはそれで気になることがあります。

私はエクセルを使用して文章を読み込んでいるわけですが、
同時に色々と分別の為、数値も一緒に読み込んでいます。

すると、行の最後の数値が2だったとすると、
変数に代入されたときには「2\r」と代入されていることになります。(\nは代入されないようにしています)
\rが余分についてしまうのです。
\rの仕様を知った今であれば、対策も出来ますが、
今までもエクセルを使用した読み込み方法はやってきました。
しかし、特別今まで\rによる不具合は見られませんでした。

実際に私が最初に書きました、エクセルを使って敵の出現データを作ってみよう。
のコードを見ましても、\rは特に考えずに書かれているように見えます。

\rの代入は無視できるものなのでしょうか?


あとinputc,inputの件もありがとうございます。
つまり、FileRead_getcの戻り値はint型である。
それを直接inputc[64]のchar配列に入れると、EOFの判定が出来なくなることがある。
それを回避するためにint型のinput[64]に代入して判定をさせている。という解釈で大丈夫ですか?

ちなみに
inputc[i]=input[i]=FileRead_getc(fp);
の表記は
input[i]=FileRead_getc(fp);
inputc[i]=input[i];
と書いているのと同じになるのかそれとも…
input[i]=FileRead_getc(fp);
inputc[i]=FileRead_getc(fp);
と書いているのと同じになるのかどちらでしょうか?


299ポイント を手に入れた。

Name: Libra  ..中級者(10,066ポイント)   Date: 2009/11/06(金) 08:48   No:41504     
Title: Re:文字列の\nの取り扱いについて    
> ちなみに
> inputc[i]=input[i]=FileRead_getc(fp);
> の表記は
> input[i]=FileRead_getc(fp);
> inputc[i]=input[i];
> と書いているのと同じになるのかそれとも…
> input[i]=FileRead_getc(fp);
> inputc[i]=FileRead_getc(fp);
> と書いているのと同じになるのかどちらでしょうか?

後者↓だと、FileRead_getc関数を2回呼び出していることになるので、
input[i] = FileRead_getc(fp);
inputc[i] = FileRead_getc(fp);

結果が違う様になってしまいます。
前者が意図した処理内容となります。


51ポイント を落としてしまった。

Name: AS  ..初心者(8,031ポイント)   Date: 2009/11/07(土) 12:04   No:41553     
Title: Re:文字列の\nの取り扱いについて    
Libraさん>
あ、確かに
input[i] = FileRead_getc(fp);
inputc[i] = FileRead_getc(fp);
だと結果が異なってしまいますね(汗)
ということはchar型(inputc)にint型(input)を代入しているということですか?


60ポイント を落としてしまった。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +