C言語何でも質問掲示板



アンケートにご協力下さい → >> アンケートフォーム <<   エラーで投稿できない方は → こちら


規約と使い方

 
   Flying Fly   
     ・[20683] 管理人 
     ・[20772] バグ 
     ・[20773] バグ 
     ・[20776] 管理人 
   argument って?   
     ・[20663] たかぎ 
     ・[20771] argument 
   charに文字列を   
     ・[20754] 管理人 
     ・[20755] 管理人 
     ・[20756] array 
     ・[20757] 管理人 
     ・[20758] array 
   自機ショットに角度を ....   
     ・[20615] dpbut 
     ・[20627] lbfuvab 
     ・[20629] <kor 
     ・[20632] lbfuvab 
     ・[20639] <kor 
     ・[20649] lbfuvab 
     ・[20660] <kor 
     ・[20666] lbfuvab 
     ・[20670] L 
     ・[20699] 管理人 
     ・[20703] 管理人 
     ・[20707] L 
     ・[20710] 管理人 
     ・[20713] L 
     ・[20720] 管理人 
     ・[20721] L 
     ・[20740] <kor 
     ・[20752] 管理人 
   背景画像について   
     ・[20591] 管理人 
     ・[20593] 管理人 
     ・[20602] AS 
     ・[20616] 管理人 
     ・[20636] AS 
     ・[20638] 管理人 
     ・[20677] AS 
     ・[20689] 管理人 
     ・[20736] AS 
   問題を解くために作っ ....   
     ・[20708] 管理人 
     ・[20709] box 
     ・[20711] こめかみ 
     ・[20712] こめかみ 
     ・[20714] box 
     ・[20715] こめかみ 
     ・[20716] Hermit 
     ・[20717] こめかみ 
   自機ショットのことで   
     ・[20685] array 
     ・[20693] pooka0904 
     ・[20695] 管理人 
     ・[20700] pooka 
   n = n++ + 1 と a = n ....   
     ・[20667] tkmakwins15 
     ・[20668] YuO 
     ・[20669] たかぎ 
     ・[20672] tkmakwins15 
     ・[20673] box 
     ・[20674] たかぎ 
     ・[20675] 組木紙織 
     ・[20676] たかぎ 
     ・[20697] なおなお 
   ビルド時のワーニング ....   
     ・[20690] 管理人 
     ・[20694] 326 
   スタート画面を作る場 ....   
     ・[20681] 管理人 
     ・[20692] L 
   シューティングゲーム ....   
     ・[20610] 日向小次郎 
     ・[20623] . 
     ・[20635] 560 
     ・[20644] J 
     ・[20646] ようすけ 
     ・[20647] J 
     ・[20648] ようすけ 
     ・[20653] 560 
     ・[20654] 組木紙織 
     ・[20661] ようすけ 
     ・[20664] バグ 
     ・[20686] 管理人 
   ScreenFlip()の処理   
     ・[20631] lbfuvab 
     ・[20671] t_white 
   ノードの親子関係につ ....   
     ・[20536] 御津凪 
     ・[20540] いけやん 
     ・[20541] いけやん 
     ・[20542] 御津凪 
     ・[20545] いけやん 
     ・[20549] いけやん 
     ・[20550] いけやん 
     ・[20551] 御津凪 
     ・[20552] いけやん 
     ・[20553] 御津凪 
     ・[20554] いけやん 
     ・[20555] 御津凪 
     ・[20556] いけやん 
     ・[20560] 御津凪 
     ・[20579] いけやん 
     ・[20581] 御津凪 
     ・[20601] いけやん 
     ・[20604] 御津凪 
     ・[20607] いけやん 
     ・[20609] 御津凪 
     ・[20611] いけやん 
     ・[20612] 御津凪 
     ・[20614] いけやん 
     ・[20640] いけやん 
     ・[20643] 御津凪 
     ・[20650] 御津凪 
     ・[20651] いけやん 
     ・[20652] 御津凪 
     ・[20657] いけやん 
     ・[20658] 御津凪 
     ・[20659] いけやん 
   コンパイル中のファイ ....   
     ・[20570] たかぎ 
     ・[20574] toyo 
     ・[20619] ルファー 
     ・[20620] たかぎ 
     ・[20621] 翡翠 
     ・[20625] たかぎ 
     ・[20642] 翡翠 
     ・[20656] たかぎ 
   テキストファイルの比 ....   
     ・[20562] 御津凪 
     ・[20563] Mist 
     ・[20565] box 
     ・[20573] ちょっぱー 
     ・[20575] non 
     ・[20576] non 
     ・[20582] 通りすがりの者 
     ・[20592] ちょっぱー 
     ・[20595] 御津凪 
     ・[20596] Mist 
     ・[20605] box 
     ・[20634] ちょっぱー 
     ・[20637] 御津凪 
     ・[20641] ちょっぱー 
     ・[20645] 御津凪 
     ・[20655] ちょっぱー 
   描画   
     ・[20618] 御津凪 
     ・[20624] dpbut 
     ・[20633] 御津凪 
   一歩目…   
     ・[20598] Mist 
     ・[20599] バグ 
     ・[20600] バグ 
     ・[20608] 白宮 
   メモリリークが発生し ....   
     ・[20564] jyun 
     ・[20606] jyun 
   株の売買シミュレーシ ....   
     ・[20508] バグ 
     ・[20509] 初心者 
     ・[20510] 木霊 
     ・[20603] てきとう 
   二点間の角度   
     ・[20585] toyo 
     ・[20586] 御津凪 
     ・[20587] box 
     ・[20588] toyo 
     ・[20589] toyo 
     ・[20594] 西村 
   リバーシゲームを作っ ....   
     ・[20387] 管理人 
     ・[20389] tkmakwins15 
     ・[20390] 管理人 
     ・[20391] tkmakwins15 
     ・[20392] array 
     ・[20393] tkmakwins15 
     ・[20394] 管理人 
     ・[20395] KEV 
     ・[20396] tkmakwins15 
     ・[20397] tkmakwins15 
     ・[20398] KEV 
     ・[20399] tkmakwins15 
     ・[20403] toyo 
     ・[20406] nayo 
     ・[20407] Hermit 
     ・[20409] tkmakwins15 
     ・[20410] Hermit 
     ・[20434] tkmakwins15 
     ・[20440] lbfuvab 
     ・[20441] kusites 
     ・[20445] tkmakwins15 
     ・[20451] lbfuvab 
     ・[20457] tkmakwins15 
     ・[20528] 組木紙織 
     ・[20529] array 
     ・[20530] 組木紙織 
     ・[20532] tkmakwins15 
     ・[20537] たかぎ 
     ・[20538] GPGA 
     ・[20557] バグ 
     ・[20558] バグ 
     ・[20567] Hermit 
     ・[20571] tkmakwins15 
     ・[20572] たかぎ 
     ・[20577] バグ 
     ・[20578] tkmakwins15 
     ・[20583] たかぎ 
   教えてください!!   
     ・[20474] ようすけ 
     ・[20477] J 
     ・[20479] ランド 
     ・[20489] 管理人 
     ・[20504] J 
     ・[20505] tkmakwins15 
     ・[20543] ようすけ 
     ・[20544] array 
     ・[20546] ようすけ 
     ・[20547] 御津凪 
     ・[20568] 管理人 
   i++ 及び ++i について ....   
     ・[20436] GPGA 
     ・[20437] たかぎ 
     ・[20438] 御津凪 
     ・[20439] KEV 
     ・[20444] たかぎ 
     ・[20446] 御津凪 
     ・[20448] たかぎ 
     ・[20459] Hermit 
     ・[20465] J 
     ・[20471] たかぎ 
     ・[20476] J 
     ・[20511] tkmakwins15 
     ・[20514] 御津凪 
     ・[20519] たかぎ 
     ・[20566] Hermit 
   受信データを決められ ....   
     ・[20548] ダウト 
   ファイルの読み書きに ....   
     ・[20531] toyo 
     ・[20533] J 
     ・[20534] 御津凪 
     ・[20535] J 
   ラジアンから8方向の何 ....   
     ・[20483] t_white 
     ・[20484] t_white 
     ・[20485] array 
     ・[20486] array 
     ・[20487] Justy 
     ・[20488] Justy 
     ・[20490] フリオ 
     ・[20494] フリオ 
     ・[20495] 木霊 
     ・[20496] Justy 
     ・[20497] フリオ 
     ・[20498] フリオ 
     ・[20499] t_white 
     ・[20512] フリオ 
     ・[20513] t_white 
     ・[20527] 木霊 
   無題   
     ・[20517] 御津凪 
     ・[20520] 厨房 
     ・[20521] たかぎ 
     ・[20523] 厨房 
     ・[20524] 厨房 
     ・[20526] box 
   龍神録の館 20章の背 ....   
     ・[20522] 管理人 
   質問が適切でないかも ....   
     ・[20503] 管理人 
     ・[20506] カカシ 
   DXライブラリについて   
     ・[20481] ランド 
     ・[20482] PIRO 
     ・[20491] 管理人 
     ・[20502] PIRO 

Name: lbfuvab  ..入門者(4,145ポイント)   Date: 2008/08/29(金) 09:47   No:20630       
Title: Flying Fly    
Bugさんのつくっていた「Flying Fly」と言うゲームを
友人に見せようと思ったのですがどこにおいてあるのでしょうか?
「その他のソフト紹介」の中にも見当たりません。<!--23-->


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


Name: 管理人 [URL]  ..伝説のハッカー(701,991ポイント)   Date: 2008/08/30(土) 17:52   No:20683     
Title: Re:Flying Fly    
バグさんに、ここで紹介してもいいか聞いてみます。
もし許可が出たらダウンロードページに追加しようと思います。


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

Name: バグ  ..ハッカー(104,733ポイント)   Date: 2008/09/01(月) 11:53   No:20772     
Title: Re:Flying Fly    
管理人さんへ返信しておきました。
プロジェクトも付けておきましたんで、悪用しなければ(どうやって?(笑))好きに使ってくださって結構ですよ(^-^)


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

Name: バグ  ..ハッカー(104,813ポイント)   Date: 2008/09/01(月) 12:58   No:20773     
Title: Re:Flying Fly    
待ちきれない場合は、下記から落とせます。
ここで発表した最新版に少し手を入れています。

http://www7.uploader.jp/dl/123456/123456_uljp00001.zip.html


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

Name: 管理人 [URL]  ..伝説のハッカー(705,423ポイント)   Date: 2008/09/01(月) 13:52   No:20776     
Title: Re:Flying Fly    
バグさん、ありがとうございます^^

その他のソフト紹介欄にFlyingFly追加させてもらいましたm(_ _)m


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



Name: argument  ..ぴよぴよ(100ポイント)   Date: 2008/08/29(金) 19:23   No:20662       
Title: argument って?    

始めまして

最近どうしても気になる事があります。

それは、なぜC関数の引数の事をargumentと呼ばれているの? 
ということです。

パラメータのほうは自然に思いますが。

どうでしょう。





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


Name: たかぎ [URL]  ..熟練のプログラマー(56,255ポイント)   Date: 2008/08/29(金) 19:35   No:20663     
Title: Re:argument って?    
argumentは実引数、parameterは仮引数です。
int func(int a)

{
return a + 1;
}

int main(void)
{
func(123);
return 0;
}

といったfuncの呼び出しでは、123が実引数(argument)でaが仮引数(parameter)になります。


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

Name: argument  ..ぴよぴよ(129ポイント)   Date: 2008/09/01(月) 11:47   No:20771     
Title: Re:argument って?(お礼)    
たかぎ さま

ありがとうございます。

> argumentは実引数、parameterは仮引数です。

すごい勉強になりました。


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



Name: array  ..上級者(21,983ポイント)   Date: 2008/08/31(日) 20:03   No:20753       
Title: charに文字列を    
charに数字の0〜100を入れたいのですがうまくいかないのでアドバイスをもらいたいです。


#include <stdio.h>

int main(){
char *str[100];
int i;
for(i=0; i<100; i++)
str[i] = "i";

for(i=0; i<100; i++)
printf("%s",str[i]);
}

イメージとしては、iの値を文字列としてfor文を使い代入していきたいと思ってるのですが。

他にもiをchar型で対応させたり、やったのですがコンパイルが通ってもエラーでプログラムが終了してしまったり、一応まともに動作したプログラムがこれで、アドバイスをもらえたら嬉しいです。

一応
str[i] = "i";
これでiを文字列として代入して、既知外なことをしている事は理解しています・・・。
今はアスキーコードで代入していけばいいのかと思い試行錯誤してるところです><


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


Name: 管理人 [URL]  ..伝説のハッカー(704,339ポイント)   Date: 2008/08/31(日) 20:18   No:20754     
Title: Re:charに文字列を    

こういうことでしょうか?

#include <stdio.h>

int main(){
int i;
char str[10][3];
for(i=0;i<10;i++){
sprintf(str[i],"%d",i);//数値のiをstrに文字列として格納
}
for(i=0;i<10;i++){
printf("%s\n",str[i]);//表示
}
}

実行結果

0
1
2
3
4
5
6
7
8
9

 


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

Name: 管理人 [URL]  ..伝説のハッカー(704,411ポイント)   Date: 2008/08/31(日) 20:21   No:20755     
Title: Re:charに文字列を    
sprintfを使えばint型、doouble型、char型などいろんな型のデータをprintfで表示するような使い方で
指定した配列に代入する事が出来ます。

なので、こんな複雑な代入も簡単に出来ます。


#include <stdio.h>

int main(){
int a=2,b=3;
char s[32]="なんですよねぇ。";
char str[128];
sprintf(str,"%d/%d=%.3f%s",a,b,(double)a/(double)b,s);
printf("%s\n",str);//表示
}

実行結果

2/3=0.667なんですよねぇ。

 

詳しい関数の仕様はググって確認して見て下さい。
http://www.google.co.jp/search?hl=ja&q=sprintf&lr=&aq=f&oq=

一方逆に、
文字列をint型にするときはatoi関数、
文字列をdouble型にするときはatof関数を使うと変換出来ます。


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

Name: array  ..上級者(22,032ポイント)   Date: 2008/08/31(日) 20:29   No:20756 解決!     
Title: Re:charに文字列を    
(。 ̄□ ̄)オぉ〜 期待以上の短さで期待通りの実行結果が得られました。

strcpy()を使ったり領域確保できてるのかなと思いつつもポインタ使ったり・・・。

sprintf()という便利なやつがあるんですね。ありがとうございます(^▽^)。♪


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

Name: 管理人 [URL]  ..伝説のハッカー(704,537ポイント)   Date: 2008/08/31(日) 20:34   No:20757     
Title: Re:charに文字列を    
先ほど↑3番目の記事にサンプルを追加しておきましたm(_ _)m

後、こんなサイトをお気に入りに入れておくと何かと参考になるかもしれません。

http://always-pg.com/c/runtime_rd/

昔よく重宝しました。
「こんな関数無いかな〜」と思った時大抵ここで解決してました。


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

Name: array  ..上級者(22,142ポイント)   Date: 2008/08/31(日) 20:42   No:20758     
Title: Re:charに文字列を    
書いてる途中にsprintf()を調べてました(^^ゞ

応用例まで書いてもらって有難うございます

atoiなどは一応エクセル読み込みなどで使ってるので大丈夫だと思います♪


あまり内容見てませんが、サイトお気に入り追加させてもらいました。私は関数探す時でも入門サイトをまわっていたので助かります^^


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



Name: <kor  ..入門者(2,519ポイント)   Date: 2008/08/28(木) 17:45   No:20613       
Title: 自機ショットに角度をつけたいのですが    
龍神録の館で紹介されいてる自機が発射するショットは真っ直ぐ進んでますよね。
あれを、シューティンゲームの館のショットみたいに斜めに発射できるようにしたいのですが、どこを変更すればいいのでしょうか?


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


Name: dpbut  ..ぴよぴよ(31ポイント)   Date: 2008/08/28(木) 18:01   No:20615     
Title: Re:自機ショットに角度をつけたいのですが    
間違えました^^;

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

Name: lbfuvab  ..入門者(4,061ポイント)   Date: 2008/08/29(金) 03:10   No:20627     
Title: Re:自機ショットに角度をつけたいのですが    
X方向のスピードを付けてはいかがでしょうか。
扱いはXもYも同じですので。


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

Name: <kor  ..入門者(2,583ポイント)   Date: 2008/08/29(金) 09:06   No:20629     
Title: Re:自機ショットに角度をつけたいのですが    
x方向のスピードってどう変えるんですか?

cshot[k].spd=20;

のところがスピードというのはわかったんですけど、これを、

1と、3のショットならx-10
2と、4のショットならx+10

とするにはどうすればよいのでしょうか?


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

Name: lbfuvab  ..入門者(4,228ポイント)   Date: 2008/08/29(金) 10:07   No:20632     
Title: Re:自機ショットに角度をつけたいのですが    
>1と、3のショットならx-10
>2と、4のショットならx+10
言われている事が良く分かりませんが
私の考えでは、弾の登録時に
cshot[k].angle=-PI/2;
としている箇所を適当に直してやればいいと思います。




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

Name: <kor  ..入門者(2,767ポイント)   Date: 2008/08/29(金) 11:27   No:20639     
Title: Re:自機ショットに角度をつけたいのですが    
すいません。
>1と、3のショットならx-10
>2と、4のショットならx+10
というのは、添付した画像(1)のことです。

cshot[k].angle=-PI/2;
の部分は直し方がわからないので、とりあえず斜めに発射するということで4way弾の角度をそのまま入れたら、斜めにはいくんですけど90°曲がってしまいます。(添付した画像(2))
どうすれば前に飛んで行くようになりますか?


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

Name: lbfuvab  ..入門者(4,282ポイント)   Date: 2008/08/29(金) 13:12   No:20649     
Title: Re:自機ショットに角度をつけたいのですが    
そういう事ですか。
・・・なら
@の角度は(PI*4)/3
Aは(PI*5)/3
B、Cは-PI/2でいいと思います。


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

Name: <kor  ..入門者(2,770ポイント)   Date: 2008/08/29(金) 19:08   No:20660     
Title: Re:自機ショットに角度をつけたいのですが    
毎回毎回すいません。
cshot[k].angle=-PI/2;
の、-PI/2の部分をそのまま、
(PI*4)/3(PI*5)/3-PI/2
にすると、エラーが出てしまうんですが・・・。

@の角度=、Aの角度=・・・というように、別々に指定することはできませんか?


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

Name: lbfuvab  ..入門者(4,338ポイント)   Date: 2008/08/30(土) 00:30   No:20666     
Title: Re:自機ショットに角度をつけたいのですが    
さすがに列挙しても無理です。

(17章目の)ch0_shot_patternやch1_shot_patternといった関数内では@、A、B、Cをiの値で割り振ってます。
つまり、iの値に応じてcshot[k].angleを調整すると良いでしょう。



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

Name: L  ..入門者(4,318ポイント)   Date: 2008/08/30(土) 01:24   No:20670     
Title: Re:自機ショットに角度をつけたいのですが    
横レス失礼します角度をつける際にこのような方法では駄目なのでしょうか?

// ビームの表示 ----------------------------------------------------------------
for ( i=0;i<BEAM_MAX;i++ )
{
if (gBeam[i].flg==ON)
{
if(gBeam[i].type==TYPE1) // 真ん中
DDRectBltSprite( DDSCREEN, (int)gBeam[i].x, (int)gBeam[i].y,
BEAM_XSIZE, BEAM_YSIZE,
sBeam, 0, BEAM_YSIZE*2,
BEAM_XSIZE, BEAM_YSIZE );
else if(gBeam[i].type==TYPE2) // 右上1
DDRectBltSprite( DDSCREEN, (int)gBeam[i].x, (int)gBeam[i].y,
BEAM_XSIZE, BEAM_YSIZE,
sBeam, 0, BEAM_YSIZE*3,
BEAM_XSIZE, BEAM_YSIZE );
else if(gBeam[i].type==TYPE3) // 右下1
DDRectBltSprite( DDSCREEN, (int)gBeam[i].x, (int)gBeam[i].y,
BEAM_XSIZE, BEAM_YSIZE,
sBeam, 0, BEAM_YSIZE,
BEAM_XSIZE, BEAM_YSIZE );
else if(gBeam[i].type==TYPE4) // 右上2
DDRectBltSprite( DDSCREEN, (int)gBeam[i].x, (int)gBeam[i].y,
BEAM_XSIZE, BEAM_YSIZE,
sBeam, 0, BEAM_YSIZE*4,
BEAM_XSIZE, BEAM_YSIZE );
else if(gBeam[i].type==TYPE5) // 右下2
DDRectBltSprite( DDSCREEN, (int)gBeam[i].x, (int)gBeam[i].y,
BEAM_XSIZE, BEAM_YSIZE,
sBeam, 0, 0,
BEAM_XSIZE, BEAM_YSIZE );
}
}


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

Name: 管理人 [URL]  ..伝説のハッカー(703,273ポイント)   Date: 2008/08/30(土) 18:36   No:20699     
Title: Re:自機ショットに角度をつけたいのですが    

恐らくラジアンと角度についての対応を詳しくご存じないのだと思います。

円周率をご存知ですよね。あの3.141592....という奴です。
あれをπをPIとしてdefineで予め定義してありますね。
これは180°を示します。一周360°は2*PIですね。
ここで、-90°と270°は同じ方向であることと、
xは増えると右へ
yは増えると下へ向くことを考えると、-90°か270°は真上になります。
つまり-PI/2か1.5*PIですね。
サンプルではこの前者が使われています。
だから、真上より10°位ずらしたければ

-PI/2 ± PI/10

ということになります。これで角度がかえられます。
スピードは.spdの値を変更することでかえられます。
これらは

void calc_cshot()

で計算されています。

//ショットの移動計算
void calc_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==1){
int dranx=(int)(cshot[i].spd+11/2),drany=(int)(cshot[i].spd+55/2);
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
cshot[i].cnt++;
if(cshot[i].x<-dranx || cshot[i].x>FMX+dranx ||
cshot[i].y<-drany || cshot[i].y>FMY+drany)//画面から外れたら
cshot[i].flag=0;
}
}
}

この部分をしっかり理解されると疑問も晴れると思います。
コサインとサインを利用して角度からx成分、y成分にわけ、スピードをかけています。
もし何かここでわからなければまたご質問下さい。



 


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

Name: 管理人 [URL]  ..伝説のハッカー(703,289ポイント)   Date: 2008/08/30(土) 19:30   No:20703     
Title: Re:自機ショットに角度をつけたいのですが    
>Lさん

その関数はどんな仕様なのでしょうか?


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

Name:  ..ぴよぴよ(89ポイント)   Date: 2008/08/30(土) 20:00   No:20707     
Title: Re:自機ショットに角度をつけたいのですが    
関数自体はかれこれ数年前に使ったものでソースを見ても分からないですがまぁDirectX の2D汎用関数ではあるのですがどう答えたらいいですかね??例えばDirectDraw を利用したゲームアプリケーションをサポートするヘルパー関数を使ってますとかなら答えられるんですが・・・

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

Name: 管理人 [URL]  ..伝説のハッカー(703,889ポイント)   Date: 2008/08/30(土) 20:10   No:20710     
Title: Re:自機ショットに角度をつけたいのですが    
関数の仕様はまぁ定義されていると思われる文字列を見たら大体想像出来ますが、
例えばこんな風に
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R3N10
何の値を引数にしているのか説明してもらえると助かります。


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

Name:  ..ぴよぴよ(412ポイント)   Date: 2008/08/30(土) 20:21   No:20713     
Title: Re:自機ショットに角度をつけたいのですが    
以下のような事でいいんですかね?

// ■スプライト処理つきサーフェス間の画像の転送
// スプライト処理つきサーフェス間の画像の転送を行う.
// サイズが違う場合には,拡大/縮小が行われる.
//
// 宣 言) void DDRectBltSprite(
// LPDIRECTDRAWSURFACE7 pDestSurface,
// int dx, int dy, int dw, int dh,
// LPDIRECTDRAWSURFACE7 pSrcSurface,
// int sx, int sy, int sw, int sh );
//
// 引 数) pDestSurface : 転送先サーフェス
// dx, dy : 転送先左上座標 (x,y)
// dw, dh : 転送先領域(幅と高さ)
// pSrcSurface : 転送元サーフェス
// sx, sy : 転送元左上座標 (x,y)
// sw, sh : 転送元領域(幅と高さ)
//
// 戻り値) なし


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

Name: 管理人 [URL]  ..伝説のハッカー(703,985ポイント)   Date: 2008/08/30(土) 21:17   No:20720     
Title: Re:自機ショットに角度をつけたいのですが    
上のコードと弾に角度を付けて発射することとどのように関係するのかよくわからないですが、
コードはかなり綺麗に書いていらっしゃいますし、試してみて思い通りにいけば、
それでいいのではないかと思いますよ。


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

Name:  ..ぴよぴよ(818ポイント)   Date: 2008/08/30(土) 21:25   No:20721     
Title: Re:自機ショットに角度をつけたいのですが    
まぁそうなんですがね

ちなみに関連するコードは全て横シューティング用のコードだったりします。

ライブラリー関連は全て学校の担任が独自に製作したものを使用させていただいて卒業向けに作った物でした。

結局ゲーム学科を卒業した物のネットワークエンジニアに転向してしまったため分からない事が多いんですよね。

また不明な点を調べた結果と併せていくつか質問するかもしれませんがよろしくお願いいたします。


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

Name: <kor  ..入門者(2,849ポイント)   Date: 2008/08/31(日) 15:48   No:20740     
Title: Re:自機ショットに角度をつけたいのですが    
龍神録の自機ショットのプログラムををシューティングゲームの館のショットのプログラムに置き換える時に
GV.cppやdefine.cppとかに追加しなきゃいけないものってありますか?


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

Name: 管理人 [URL]  ..伝説のハッカー(704,172ポイント)   Date: 2008/08/31(日) 18:41   No:20752     
Title: Re:自機ショットに角度をつけたいのですが    
変数名も関数名も違うので、GV.hなどに変数名を追加しただけでは機能を移植できないと思います。
自機ショットに関係するものはch_tに含まれる構造体の内容と画像用変数、そしてcshot.cppに書かれている内容が主だと思いますから、
そこを確認すれば良いと思います。
関数を移植する時は、内容をしっかり理解して移植する必要がありそうです。


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



Name: AS  ..ぴよぴよ(212ポイント)   Date: 2008/08/28(木) 10:26   No:20580       
Title: 背景画像について    
最近このホームページで色々勉強させてもらっています。
とても素晴らしい内容で本当に感謝です。

今回龍神録の背景画像について気になることがありましたので質問させていただきます。
あの背景画像を見ると、他の弾幕や敵キャラと違い、明らかに普通のペイントツールでは再現できないですよね?
あれはどのようなツールを使って描き、どのようにプログラムしてやれば、あのような素晴らしい背景が出来るのでしょうか?
私もあのような背景を作りたいと思っていますので、是非お教えいただきたいです。
よろしくお願いします。


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


Name: 管理人  ..伝説のハッカー(700,702ポイント)   Date: 2008/08/28(木) 11:43   No:20591     
Title: Re:背景画像について    
今帰省中で、携帯からしか投稿できず、サンプルをお見せすることが出来ないので、
具体的な回答がなかなか難しいのですが、
お絵かきソフトで絵を描いて、スクロールさせるのが一般的だと思います。

私はフォトショップ、GIMPなどの画像編集ソフトで絵をかいてます。
本来写真を加工するためのものなのでしょうけどね。
色々絵のかけるソフトで自分のあったものを探してみてはいかがでしょうか。

龍神録プログラミングの館にキャプチャした画像なら同梱されています。
キラキラさせるのは少し難しいのではいっていませんが、
もしご希望なら龍神録で使っている画像お渡ししますよ。

どうすれば綺麗にキラキラするか、別に方程式があるわけじゃないんで、色んな画像作って、色んな描画の仕方で表現してみて、何度も試行錯誤でよあ背景を見つけていくことになると思います。

ただミクシィのフォトショップのコミュであったり、画像ソフトの使い方応用がかかれているサイトなんかでより深いソフトの使い方を学んでおくとよいと思います。

まずは、何事も真似から。ということで、自分の気に入った背景に似せて何か作ってみてはいかがでしょうか。
今ペイントしかお絵かきソフトをご存知なければソフトを探すことから始めてみてください。

GIMPはフリーでかなりの高機能です。もし機能が高すぎてわかりにくいならpictbearとかどうでしょう。
予算があるならフォトショップとか。
ペインターとかよくききますね。イラストだけに限定するならもっといいソフトがあるかもしれません。


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

Name: 管理人  ..伝説のハッカー(700,772ポイント)   Date: 2008/08/28(木) 11:48   No:20593     
Title: Re:背景画像について    
もしかして川をキラキラさせたり、立体的に見せたりする方法の質問だったでしょうか?

具体的に質問してもらえたら具体的に回答が出来るかもしれません。


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

Name: AS  ..ぴよぴよ(516ポイント)   Date: 2008/08/28(木) 12:48   No:20602     
Title: Re:背景画像について    
とても早いお返事ありがとうございます。

どちらかと言うと立体的に見せるのはどのようにしているのだろう?
と言った内容の質問でした。
あの東方シリーズも背景は3Dに見えますよね?
もし出来るのなら、あのような背景を作ってみたいのです。
ニコニコ動画に投稿されている、「また東方風[無料STG]作ってみた」(08/07/04,00:59投稿)の最初に出てくる桜の木の背景もそんな雰囲気ですね。

管理人様のブログも少し見せてもらったのですが、3Dの話題がありましたし、あのような絵を使ってプログラムしていくのかな…?などと色々思っているのですが…。

ということであのような背景はどのように作るのか…?という質問です。最初の質問はわかりにくくて申し訳なかったです…。


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

Name: 管理人  ..伝説のハッカー(701,165ポイント)   Date: 2008/08/28(木) 18:08   No:20616     
Title: Re:背景画像について    
家に着く前にこちらからもう少し質問を。

龍神録の通常面及びEXで表現している立体に見せる方法と、ファンタズムステージで立体に見せる方法は全く違い、ファンタズムで使っている桜の表現はかなり難しく感じるかもしれません。

一方通常面などで使っている方法はかなり簡単です。
高速道路を走っている車から横向きに外を見ている様子を想像してみてください。

近くにあるものは速く、遠くにあるものはゆっくり流れますね。
これを利用してみます。
遠くの画像、
中間の画像、
近くの画像、
と3種類くらい適当に用意し、上の理論でスクロールさせてみてください。
うまく作れば立体的に見えると思います。
よく作り方がわからなければ、
上の理論を理解した上でもう一度龍神録を見てみてください。意味がわかるかもしれません。
これは画像の拡大率を変えずにただスクロールすればいいだけだから簡単です。

しかし、先ほどいった、桜は、近くなるにしたがって大きくしなくてはならず、
その計算式も一次関数のようにはいきません。
そこで、ライブラリの関数を使うわけですが、これが結構ややこしいので、もし、こちらの方法が知りたければ、また回答します。

最近の東方はほとんど、ライブラリを使った3D表現ですが、以前は結構スクロールも使われていたようです。
今は最初に言った背景のうちどちらの方法が知りたいでしょうか?


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

Name: AS  ..ぴよぴよ(645ポイント)   Date: 2008/08/29(金) 11:08   No:20636     
Title: Re:背景画像について    
本当に丁寧に回答をいただきありがとうございます。

私が気になっているのは管理人様が難しいとおっしゃっている方です。
難しいと言うことで、現在の私に出来るかどうかはわかりませんが、
昔からずっと気になっていたことでしたので、
もしよろしければ回答をいただけたらなと思います。

ちなみに遠くの画像と近くの画像を分ける手法は理解できました。
こちらの方は今の自分でも何とかできるのではないかと思います(まだ実際にやってみてはいないですが…)


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

Name: 管理人 [URL]  ..伝説のハッカー(701,580ポイント)   Date: 2008/08/29(金) 11:23   No:20638     
Title: Re:背景画像について    
また外出しないといけないので、少しだけ・・。

3Dにおいて、x-y平面に、Z軸が加わるのはOKでしょうか?
そのような3D空間の座標が扱える関数がDXライブラリには唯一1つ(公開されているなかでは)存在します。

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R3N22

まずは、この使い方を覚えてみてください。
サンプルをあれこれいじったり、自分の思う形になるように変形して本当に自分の思った形になったか
確認したりしてみてください。
画像を横に回転しながら近づけたり、前向きに回転しながら斜め移動したりするだけでも案外難しいと思います。

この関数で、普通の描画に「距離」が指定出来るようになりました。
ファンタズムステージでいえば、プラス距離指定ありで桜をかくことができます。
だからZを遠くにしておいて、普通にX-Y平面に描画することを、Zを近づけながら何度も行うことで
だんだん近づいているように見えます。
ただここで注意が必要で、遠くにあるものからかかないといけません。
さもないと、近い桜の上に遠くの桜をかいてしまっては変になってしまいます。
なので、つねにオブジェクトをZの数値でソートしてやらないといけません。

また、「床」はX-Y平面において、Xは通常通り、Yは全て同じにしてやれば、ぺったんこになりますね?
そしてその2点のZ値をずらしてやれば、上から見たら床に見えます。

桜と、床、これを同時にスクロールしていけば、ファンタズムのような背景になります。

まずは、先ほど示した関数を使い慣れてみてください。


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

Name: AS  ..ぴよぴよ(918ポイント)   Date: 2008/08/30(土) 13:05   No:20677 解決!     
Title: Re:背景画像について    
お忙しい中お返事ありがとうございます。

Z軸が加わるのはOKです。ですが、ただ知っているだけというレベルですが…
なるほど。その関数を用いて、あの背景を再現していたのですか。
後半の説明はまだ3Dに触れていない私にとって理解できない部分が多いですが、
まずは使ってみて慣れようかと思います。

という訳でまずはリンク先のソースをコピペで使ってみて、どのような効果があるのかは認識しました。
にしてもこれまた難しそうな内容ですね…
現段階では色々な数値等の意味は全くわかりません(汗)
使いこなせるかどうかは不安になりましたが、まずは色々試してみようかと思います。

今回はお忙しい中、私の質問に答えていただき本当にありがとうございました。
またどうしてもわからないことがありましたら、ここの掲示板を訪ねてみたいと思います。


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

Name: 管理人 [URL]  ..伝説のハッカー(702,516ポイント)   Date: 2008/08/30(土) 18:15   No:20689     
Title: Re:背景画像について    
3Dの背景を作る章を龍神録プログラミングの館に作って欲しいという要望があったので、
時間が出来次第作ってみようと思います。
ただこれは前提知識が結構いるので、一体どこから解説すればいいか迷ってしまい、
少し解説ページを作ってはみたものの、わかりやすくどう書き換えればいいかわからず、中断中です;

もしそちらに追加されたらよければそちらもご覧になると何か参考になるかもしれませんm(_ _)m
もし何かわからないことがあればまた気軽にご質問下さい☆


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

Name: AS  ..ぴよぴよ(979ポイント)   Date: 2008/08/31(日) 09:48   No:20736 解決!     
Title: Re:背景画像について    
作成中だったのですか。それは完成したら是非見てみたいですね。
しかし、おっしゃっているように難易度が気になるところではありますが…
ただ、わからないなりにも解説を見れば何らかのヒントにはなると思うので楽しみにしております(^^)


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



Name: こめかみ  ..上級者(15,470ポイント)   Date: 2008/08/30(土) 19:57   No:20706       
Title: 問題を解くために作ったプログラムの添削をお願いします。    
環境はcygwinとVusualC++ 2008ExpressEdtionです。
cygwinで一応結果は得られたのですが、動作が少し変です。
VusualC++ではそもそもビルドできずに、

1>d:\ゲームプログラミングの館\試験\試験\main.cpp(13) : error C3861: 'F': 識別子が見つかりませんでした

というエラーが出て来てしまいます。
アドバイスよろしくお願いします。


/*
非負の整数nに対して次のとおりに定義された関数F(n),G(n)がある。F(5)の値は幾らか。
F(n):if n≦1 then return 1 else return n ×G(n-1)
G(n):if n=0 then return 0 else return n +F(n-1)
*/
#include<stdio.h>

int G(int n)
{
if(n==0){
return 1;
}else{
return n+ F(n-1);
}
}

int F(int n)
{
if(n<=1){
return 1;
}else{
return n* G(n-1);
}
}

int main(void)
{
int m, n;

printf("5を入力してエンター.:");//cygwinだと何故か、5を入力してエンター後、↑キーを押してエンターで表示される。
scanf("%d\n", &n);

m=F(n);

printf("%d\n", m);

return 0;
}



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


Name: 管理人 [URL]  ..伝説のハッカー(703,792ポイント)   Date: 2008/08/30(土) 20:05   No:20708     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    

上から下を、下から上を呼んでるからじゃないですか?
基本的に上で宣言したものを下で使う事は出来ますが、下で宣言した物を上で使う事は出来ません。

プロトタイプ宣言をすると、上から下にある関数を呼べるようになるので、
もし無理やり上のコードを解決するならば

#include<stdio.h>

int F(int n);

int G(int n)
{


 
を挿入すればいいかと。


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

Name: box  ..ハッカー(124,914ポイント)   Date: 2008/08/30(土) 20:10   No:20709     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    

G()でF()を呼び出す前に、F()の定義またはプロトタイプ宣言がないためです。
だからといって、F()とG()の定義順を入れ替えただけでは、今度は

'G':識別子が見つかりませんでした

というエラーが出てしまうと思います。
解決策は、F()とG()のプロトタイプ宣言を明記することです。

ところで、

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

scanf()の書式に \n を含めているのはなぜですか?



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

Name: こめかみ  ..上級者(15,709ポイント)   Date: 2008/08/30(土) 20:18   No:20711     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    
ありがとうございます。
関数原型宣言でヴィジュアルスタジオでも出来ました。

するとシグウィンは下で宣言したものを上で使える処理系なんですね。

それともう一つ問題があるのですが、

5を入力してエンター.

の後にすぐ下の

printf("%d\n", m);

を動かしたいのですが何故このコードで出来ないのでしょうか。


>scanf()の書式に \n を含めているのはなぜですか?

あ、いらないんでしたっけ、すいません。ソラで書いたので結構いい加減でした。



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

Name: こめかみ  ..上級者(15,748ポイント)   Date: 2008/08/30(土) 20:21   No:20712 解決!     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    
>scanf()の書式に \n を含めているのはなぜですか?

これが原因でした直したらうまくいきました。

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


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

Name: box  ..ハッカー(125,154ポイント)   Date: 2008/08/30(土) 20:23   No:20714     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    

G()の実体とコメントが食い違っています。

> G(n):if n=0 then return 0 else return n +F(n-1)

> if(n==0){
> return 1;

また、

>F(5)の値は幾らか。

と問われているのですから、mやnの定義は必須ではなく、単に

> printf("%d\n", F(5));

とだけ書けばいいのではないでしょうか。



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

Name: こめかみ  ..上級者(15,824ポイント)   Date: 2008/08/30(土) 20:31   No:20715     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    
>G()の実体とコメントが食い違っています。

ご指摘ありがとうございます。気づかなかったです。

>> printf("%d\n", F(5));
>とだけ書けばいいのではないでしょうか。

おおこれでいいのですね。
授業で習った感覚しか持ってないのでこういうご指摘はありがたいです。


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

Name: Hermit  ..上級者(22,030ポイント)   Date: 2008/08/30(土) 20:34   No:20716     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    
>するとシグウィンは下で宣言したものを上で使える処理系なんですね。

sygwin でエラーが出なかったのは、C としてコンパイルしたからではないでしょうか。
VusualC++ 2008ExpressEdtion でエラーが出たのは、C++ としてコンパイルしたからではないでしょうか。


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

Name: こめかみ  ..上級者(15,689ポイント)   Date: 2008/08/30(土) 20:40   No:20717     
Title: Re:問題を解くために作ったプログラムの添削をお願いします。    
>sygwin でエラーが出なかったのは、C としてコンパイルしたからではないでしょうか。
>VusualC++ 2008ExpressEdtion でエラーが出たのは、C++ としてコンパイルしたからではないでしょうか。

そのとおりでした。cppファイルでやったらcygwinでもエラーがでました。


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



Name: pooka  ..ぴよぴよ(83ポイント)   Date: 2008/08/30(土) 16:35   No:20679       
Title: 自機ショットのことで    
はじめまして。いつも「なるほど」と思いながら見せていただいてます。
早速なのですが、龍神録プログラミングの館の17章をみて自機にショットを撃たせることは出来ました。
そこで、ショットキーを1回押すと弾を数発撃つようにしたいと思い色々考えたのですがどうしてもうまくいきません。
ショット登録部の部分をfor文を使って、撃たせたい弾の数だけループさせればいいのかなと思ったのですが・・・もしかすると見当違いかもしれません。
どうすればいいのか教えていただけないでしょうか?
c言語は大学で習ったり独学で勉強したのでちょっと使える程度です。
環境はvistaでVisual Studio 2008を使ってます。


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


Name: array  ..上級者(20,867ポイント)   Date: 2008/08/30(土) 18:00   No:20685     
Title: Re:自機ショットのことで    
確かすでに、4発同時発射になっているので、
四聖龍神録と同じように一度ショットキーを押したらしばらく自動でショットを打ち続ける様な動作にしたいという事ですかね。

enter_shot()

で自機ショットの登録をしており、if(CheckStatePad(configpad.shot)>0)が押された時に登録されていますよね。

このif文に追加してやれば良いです。

//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot)>0 || (ch.shot_cnt != 0 && ch.shot_cnt < 18)){
ch.shot_cnt++;
if(ch.shot_cnt%3==0){//3カウントに1回
if(CheckStatePad(configpad.slow)>0)//低速移動中なら
ch1_shot_pattern();
else
ch0_shot_pattern();
}
if(ch.shot_cnt == 18)
ch.shot_cnt = 0;

}
}
 
こんな感じでいけると思います。

ショットが一度押されたら、18カウントは登録し続けます。



ちなみにfor文では、弾は1つしか描画されてないように見えますが、for文で繰り返した回数分、重なって描画されてしまうので、当り判定などで思わぬ不具合につながる可能性が出てくると思います。


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

Name: pooka0904  ..ぴよぴよ(46ポイント)   Date: 2008/08/30(土) 18:24   No:20693 解決!     
Title: Re:自機ショットのことで    
早速の回答ありがとうございます。今実行してみたらうまくいきました。
ずっと悩んでいたので助かりました(>_<)
for文での動作も書いていただき、より理解が深まりました。
また質問するかもしれませんが、その時はよろしくお願いします。m(_ _)m


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

Name: 管理人 [URL]  ..伝説のハッカー(702,627ポイント)   Date: 2008/08/30(土) 18:26   No:20695     
Title: Re:自機ショットのことで    
arrayさんが既に完璧なお答えをされているので、全く私が言うことはありませんm(_ _;)m

そういえばch.shot_cntの説明をどこにも書いてなかったような気がしますが、
どこかにこの変数がこれの為に用意されていること、書いてありました?

すっかり館のコードを使いこなしてくださっているようで光栄です^^;


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

Name: pooka  ..ぴよぴよ(139ポイント)   Date: 2008/08/30(土) 18:39   No:20700     
Title: Re:自機ショットのことで    
>pooka0904
すいません。名前間違ってしまいました。(^^ゞ

>管理人さん
はじめまして。いつもこのサイトを見て勉強させてもらってます。m(_ _)m
私はch.shot_cntの使い方をよく理解していなかったですね(汗)


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



Name: なおなお  ..ぴよぴよ(51ポイント)   Date: 2008/08/30(土) 00:28   No:20665       
Title: n = n++ + 1 と a = n++ + 1の違い    
初歩的な質問なのですが、以下のプログラムを実行した際に
printf()で出力している変数aとnの値が、それぞれ6と7となります。

どちらもn=5としたときに n++ + 1を求めているのですが
なぜ結果が異なるのでしょうか?
a=6, n=6 になると思ったのですが…

---------------------------------------
int n = 5; // n = 5で初期化
int a = 0;

a = n++ + 1;
printf("a = %d\n", a); // a = 6

n = 5; // 再度,n = 5で初期化
n = n++ + 1;
printf("n = %d\n", n); // n = 7
---------------------------------------


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


Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,771ポイント)   Date: 2008/08/30(土) 00:33   No:20667     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
n=n++ +1
は確か正しくないプログラムです。未定義か不定かは分からないですが…


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

Name: YuO  ..上級者(23,452ポイント)   Date: 2008/08/30(土) 00:50   No:20668     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
n = n++ + 1;
は副作用完了点の間にnに対する複数の副作用が存在するため,「未定義」です。
つまり,「不正な」プログラム,ということです。
# ISO/IEC 9899:1999 6.5 Expressions / Paragraph. 2

n = 6であろうがn = 7であろうが,それどころかプログラムがクラッシュしようが鼻から悪魔が出てこようが,
それはコンパイラが間違った解釈をしたわけではなく,
「やってはいけないこと」をやったプログラマが悪い,ということです。
# 鼻から悪魔を出す実装があるなら,それはそれで動かしてみたいですが。


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,277ポイント)   Date: 2008/08/30(土) 01:04   No:20669     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
n = n++ + 1; は(規格上は)未定義の動作ですが、処理系が特定の振る舞いを規定しているのであれば、そのように動きます。
今回の質問では処理系不明なので、一般論としては何が起きるか分かりません。

# コンパイラによって鼻から悪魔が出るような健康被害を受けた場合は、当然クレーム物ですね。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,813ポイント)   Date: 2008/08/30(土) 01:51   No:20672     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
未定義なんですね、でも未定義の場合は、Cの規格上、どのような実装でも許されるのですよね?ということはコンパイルエラーにしてもいいということですね。

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

Name: box  ..ハッカー(124,766ポイント)   Date: 2008/08/30(土) 07:40   No:20673     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
文法上はどこにも間違いがないので、コンパイルエラーにするのはまずいと思います。
実行ファイル作成までは正しく行なえて、実行結果がどうなるかはわからない、
というのがホントのところなのでありましょう。


ここで個人的な疑問。

n = 5;
n = n++ + 1;
printf("n = %d\n", n);

のコードにおいて、nに対して何をしているかというと
1)5に初期化
2)インクリメント
3)1を加える
4)値を出力

の4つですよね(2と3の順序は逆かもしれない)。
ということは、7と出力することしかあり得ないのではないかと
思ってしまったりするのですが、この考えはやっぱりおかしいですか?


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,471ポイント)   Date: 2008/08/30(土) 12:02   No:20674     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
> 文法上はどこにも間違いがないので、コンパイルエラーにするのはまずいと思います。

コンパイルエラーでも構いません。
JIS X3010:2003の3.4.3 未定義の動作(undefined behavior)によると、

参考 未定義の動作に対して, その状況を無視して予測不可能な結果を返してもよい。翻訳時又はプログラム実行時に, 文書化された, 環境に特有な方法で処理してもよい(診断メッセージの発行を伴っても伴わなくてもよい。)。さらに(診断メッセージを出力し)翻訳又は実行を中断してもよい。

とあります。


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

Name: 組木紙織  ..熟練のプログラマー(59,939ポイント)   Date: 2008/08/30(土) 12:13   No:20675     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
ふむ、それでは
[鼻から悪魔をだす可能性があるので、コンパイルを中断します。]
というエラーメッセージや警告を出すコンパイラがあってもいいわけですね。

そんなコンパイラ使ってみたい。


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,543ポイント)   Date: 2008/08/30(土) 12:18   No:20676     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
> ということは、7と出力することしかあり得ないのではないかと
> 思ってしまったりするのですが、この考えはやっぱりおかしいですか?

状況を無視して、例えばnをトラップ表現に設定する可能性があるとかは別として...

1)5に初期化
2)n++ + 1を評価
  a) n++の結果として5を得る
  b) 1を評価して1を得る
3)5 + 1を評価して6を得る
4)結果を格納する
  a) n ← 6 (=の副作用)
  b) n ← 6 (++の副作用)

というのもありえます。



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

Name: なおなお  ..ぴよぴよ(167ポイント)   Date: 2008/08/30(土) 18:31   No:20697 解決!     
Title: Re:n = n++ + 1 と a = n++ + 1の違い    
みなさん、たくさんの回答ありがとうございいます。

「未定義」だったのですね。勉強になりました。

確かにコード自体は意味のないものなので未定義でも問題ないですね。
ただ、「未定義ですよ〜」とコンパイラが教えてくれてもいいような…

甘えすぎですかね。





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



Name: 326  ..ぴよぴよ(126ポイント)   Date: 2008/08/30(土) 16:35   No:20680       
Title: ビルド時のワーニングメッセージ    
C++で龍神録をビルドをすると以下のようなワーニングが出るのですが解決法がわかりません。
ご教授願います。


ADVAAPI32.dllへのすべての参照は /OPT:REF によって廃棄されます。

COMCTL32.dllへのすべての参照は /OPT:REF によって廃棄されます。
defaultlib 'LIBCMT' は別のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。


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


Name: 管理人 [URL]  ..伝説のハッカー(702,614ポイント)   Date: 2008/08/30(土) 18:19   No:20690     
Title: Re:ビルド時のワーニングメッセージ    
DXライブラリのこういう関係の質問はDXライブラリの質問掲示板の過去ログに沢山ありますので、
探してみると解ったりします。

http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=475


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

Name: 326  ..ぴよぴよ(126ポイント)   Date: 2008/08/30(土) 18:24   No:20694     
Title: Re:ビルド時のワーニングメッセージ    
助かりました。

参考になります。




Name: L  ..入門者(3,889ポイント)   Date: 2008/08/28(木) 23:29   No:20622       
Title: スタート画面を作る場合    
ここで紹介されているようなシューティングゲームにスタート画面を作る場合はどのような処理で作るのがよいのでしょうか?
以下のような方法で作成してみようと思っていますがどうでしょう?

// ------------------------------------------------------------
// - ゲームループ処理 -
// - 毎ループごとにシステムから呼ばれる -
// ------------------------------------------------------------
void GameLoop(void)
{
DDClear(DDSCREEN, RGB(0,0,0)); // クリア
BackDraw();

switch ( gGameMode )
{
case MODE_LOAD1: // ロード1
DDDrawText(430,430,RGB(255,255,255),"NOW LOADING");
gGameMode = MODE_LOAD2;
break;
case MODE_LOAD2: // ロード2
GameLoad();
gGameMode = MODE_TITLE;
TitleInit(); // タイトル初期化
break;
case MODE_TITLE: // タイトル
TitleMain(); // タイトル処理
TitleDraw(); // タイトル表示
break;
case MODE_SCORE: // スコア画面
ScoreMain(); // スコア処理
ScoreDraw();
break;
case MODE_GAME: // ゲーム本体
GameMain(); // ゲーム本体処理
GameDraw(); // ゲーム本体表示
break;
case MODE_OVER: // ゲームオーバー
OverMain(); // ゲームオーバー処理
OverDraw(); // ゲームオーバー表示
break;
case MODE_CLEAR: // ゲームクリア
ClearMain(); // ゲームクリア本体処理
ClearDraw(); // ゲームクリア表示
break;
}

// デモ表示
if ( gDemoMode==ON && gDemoCnt%60>=30 )
{
DDRectBltSprite( DDSCREEN, 220,210, sDemo );
}
gDemoCnt++;
// プライマリィサーフェイス(表画面)と
// バックバッファ(裏画面)の反転
DDFlip();
}

// ************************************************************
// * *
// * タイトル *
// * *
// ************************************************************

// ------------------------------------------------
// タイトル メイン
// ------------------------------------------------
void TitleMain(void)
{
if(DDGetKeyInfo(VK_UP) == DDGETKEYINFO_DOWN )
{
DAPlaySE( sndSE6, false );
if(gTitleCnt==0)gTitleCnt=2;
else gTitleCnt--;
}
if(DDGetKeyInfo(VK_DOWN) == DDGETKEYINFO_DOWN )
{
DAPlaySE( sndSE6, false );
if(gTitleCnt==2)gTitleCnt=0;
else gTitleCnt++;
}
// エンターが押されたらば
if (gTitleCnt==0 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_GAME; // モードをゲーム中へ
PlayInit(); // 1ゲーム初期化
}

// エンターが押されたらば
if (gTitleCnt==1 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_SCORE; // モードをスコア画面へ
}
if (gTitleCnt==2 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DDQUIT_APPLICATION();
}

// 1200カウントでデモスタート
if (gDemoCnt >= 1200)
{
gGameMode = MODE_GAME; // モードをゲーム中へ
PlayInit(); // 1ゲーム初期化
gDemoMode = ON;
gDemoCnt = 0;
gShip.dir = 3;
}
}


// ------------------------------------------------
// タイトル 表示
// ------------------------------------------------
void TitleDraw(void)
{
int sy;

// タイトルの表示
// カウンタにより縮小表示
sy = gDemoCnt/1.5+1;
if ( sy > TITLE1_YSIZE ) sy=TITLE1_YSIZE;
DDRectBltSprite( DDSCREEN, 70, 50, TITLE1_XSIZE, sy,
sTitle1, 0, 0, TITLE1_XSIZE, TITLE1_YSIZE );

DDRectBltAlpha( DDSCREEN, 200, 250+gTitleCnt*38, sTitle4,0,0,200,25,(double)(gDemoCnt%99)/100);
// タイトル2の表示
DDRectBltSprite( DDSCREEN, 250, 250, sTitle2 );
DDRectBltSprite( DDSCREEN, 10, 370, sTitle3 );
}

// ------------------------------------------------
// スコア メイン
// ------------------------------------------------
void ScoreMain(void)
{
// キャンセルが押されたらば
if ( DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('X') == DDGETKEYINFO_DOWN )
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_TITLE; // モードをタイトルへ
TitleInit();
}
}

// ------------------------------------------------
// スコア 表示
// ------------------------------------------------
void ScoreDraw(void)
{
int i;
char no[5];
char time[6];
char score[10];

DDRectBltSprite( DDSCREEN, 70, -20, sTitle1 );
DDRectBltSprite( DDSCREEN, 10, 370, sTitle3 );
DDRectBltSprite( DDSCREEN, 150, 90, sScore );
for(i=0;i<9;i++)
{
sprintf(no,"%01d", i+1);
sprintf(time,"%04d", gScore[i].time);
sprintf(score,"%08d", gScore[i].score);
NumDraw(no,160,120+i*(NUM_YSIZE+10));
NumDraw(time,285,120+i*(NUM_YSIZE+10));
NumDraw(score,375,120+i*(NUM_YSIZE+10));
}
}

// ------------------------------------------------
// タイトル 初期化
// ------------------------------------------------
void TitleInit(void)
{
gTitleCnt=0;
gDemoMode=OFF;
gDemoCnt=0;
DAPlayBGM( sndTIT, false, 150);
}


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


Name: 管理人 [URL]  ..伝説のハッカー(701,862ポイント)   Date: 2008/08/30(土) 17:49   No:20681     
Title: Re:スタート画面を作る場合    
しばらく家を空けていたので遅くなりましたm(_ _)m

サッとみただけですし、よくわからない関数の仕様は勝手に想像で補完しましたが、
いいと思いますよ。
私は私なりの方法しか知らないのでこれが大規模なゲームになった時ふさわしいかどうかはわかりませんが、
とりあえず私も似たような書き方で作っています。

少しだけ気になったのはgGameModeへの値代入がメインループのスイッチ文内で行われていたり、
呼んだ先の関数内で行われていたりしているので、
その辺統一したほうがいいかもしれませんね。

メインループのスイッチ文には関数を呼ぶ記述しかしないと統一するのなら
DDDrawText関数もそれように作った関数で呼んであげるほうがいいかもしれませんが、
まぁたいしたことじゃないと思います。


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

Name:  ..ぴよぴよ(11ポイント)   Date: 2008/08/30(土) 18:23   No:20692 解決!     
Title: Re:スタート画面を作る場合    
ありがとうございました。

参考にしてみます。


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



Name: ようすけ  ..ぴよぴよ(981ポイント)   Date: 2008/08/28(木) 11:33   No:20590       
Title: シューティングゲームつくりました    
バグの多いゲームですが、

遊んでやってください(*^_^*)

http://www6.ocn.ne.jp/~omotya/

トップページ中ほどにダウンロードあります。

実行ファイルはdat.qwwフォルダの中にあります。


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


Name: 日向小次郎  ..ぴよぴよ(59ポイント)   Date: 2008/08/28(木) 14:51   No:20610     
Title: Re:シューティングゲームつくりました    
プレイしました。

何だかなつかしい感じがするゲームですね。
昔ゲーセンにあった19○○を思い出しました。
これからもがんばってください


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

Name: .  ..ぴよぴよ(238ポイント)   Date: 2008/08/29(金) 00:13   No:20623     
Title: Re:シューティングゲームつくりました    
販売している商品にはさんでダウンロードスペースをもうけるのはやらしくみえるのと
特定商取引に関する法律に違反する販売になってるので改めた方がいいかと。


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

Name: 560  ..かけだし(1,371ポイント)   Date: 2008/08/29(金) 10:58   No:20635     
Title: Re:シューティングゲームつくりました    
そもそも販売法に問題があるのと
特定商取引法に基づく表記ということで

以下のような表記も販売の上では必要のはずです。
販売業者 ○○○会社
運営統括責任者名 山本太郎
郵便番号 XXXXXXX
住所 ○○県○○市○○区○○1-2-3
商品代金以外の料金の説明 決済:振込の手数料はお客様でご負担いただきます。また代金引換の場合はご注文時に別途料金がかかります。
送料:一律200円かかります。
申込有効期限 ご注文受付後5日間
不良品 破損・汚損・商品違い等ございましたら、商品到着後10日以内に○○までご連絡ください。
ケース破損の場合は代替のCDケースを無料でお送りします。
CDの再生不良の場合は代替のCDを無料でお送りします(ただし在庫がない場合は代金を返却します)。CDは再生環境により代替品をお送りしても再生できない可能性があります。ご連絡の際は「どのCDのどのトラックがどのように再生できないか」をご記入ください。
販売数量 1商品の注文数は最大5個まで。ただし、商品ごとに異なる場合やご注文時点での在庫数によって異なる場合がありますので、あらかじめご了承ください。5個以上の大量注文につきましては別途お問い合わせください。
引渡し時期 入金確認後、通常3営業日以内に発送いたします。一部予約商品に関しては別途ご連絡させていただきます。また、繁忙期には7営業日以内に発送いたします。営業日とは特殊閉店期間以外で土日祝日以外の平日を指します。
お支払い方法 代金のお支払方法は、
・ペイジェント
・代金引換
からお選びいただけます。ペイジェントを選択した場合はご入金を確認後発送いたします。
代金引換は商品と引き換えで現金でのお支払いとなります(郵便局のサービスのため、クレジットカード・デビットカードはご利用いただけません)。
お支払い期限 代金前払い(ご入金確認後に商品を発送。ただし商品代引の場合はご注文後すぐに発送し、代金と引き換えに商品を受け取ることが出来ます)。振込の場合はご注文後5日を過ぎても振込が確認できない場合はご注文をキャンセルさせていただくことがあります。その際は再度ご注文しなおしてくださるようお願いします。
返品期限 お客様のご都合による返品・交換につきましては、商品到着後10日以内、未開封の場合に限らせていただきます。窓口までメールでご連絡後、商品をご返送ください。
※返品をお受けできない場合
@商品到着後10日以上経過した商品
A一度使用した商品
Bお客様のもとでキズや汚れが生じた商品
C商品パッケージ(袋・ケースなど)を紛失したり、破損してしまった商品
返品送料 恐れ入りますが、不良品以外での返品送料はお客様負担とさせていただきます。
CDのケース割れについてはメールでご連絡いただければ、代替のCDケースを無料でお送りします。
屋号またはサービス名 XXXXXXXXXX
電話番号 XXXXXXXXX(お問い合わせはメールでお願いします。受付間違い防止のため電話では受け付けておりません)
公開メールアドレス XXXXXXXXX
ホームページアドレスXXXXXXXXX

お支払い方法
商品代引
商品代引はご注文から商品到着まで一番早いためオススメです。
また、商品が実際に到着してからのお支払いですので、初めて○○SHOPをご利用になる場合でも安心です。
代引手数料の一部をお客様にご負担いただきます。決済料金にかかわらず一律300円です。
配達ではなく郵便局の窓口での受け取りを希望される場合は、備考欄に「局留希望 ○○郵便局+郵便局の住所」をご記入ください。
ペイジェント
コンビニ/ペイジーマーク付のATM/ネットバンキング
でのお支払いが可能な決済代行サービスを使用しての
ご入金となります。

※ご注文が完了し、受注番号が表示された画面を閉じずに
 「ペイジェントお支払手続へ」へと手続を進めてください。
 (画面を閉じてしまうと手続が未完了となってしまいますので
  ご注意ください)

※決済手数料はお客様負担となります。
配送方法・送料について
郵便(ゆうメール)
全国どこでも、購入数量、購入額にかかわらず一律1注文200円です。

代金引換をご利用の場合
配達日指定はできません。
実質的に時間帯指定も可能です(配達時に不在の場合は通知票が投函されますので、再配達時間を指定できます)。

郵便局留めをご希望の場合は、受け取りを希望する郵便局の住所・郵便局名を住所にご記入ください。局留めでの荷物受け取りについては○○会社では責任がもてませんのでご了承ください。


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

Name: J  ..初心者(7,026ポイント)   Date: 2008/08/29(金) 12:22   No:20644     
Title: Re:シューティングゲームつくりました    
ホームページのタイトル背景がなんかVistaの壁紙であったような気がします・・・
いまダウンロードしています。112MBですか・・回線が遅い私には(泣


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

Name: ようすけ  ..かけだし(1,193ポイント)   Date: 2008/08/29(金) 12:26   No:20646     
Title: Re:シューティングゲームつくりました    
まったくの素人な私が作ったHPなので、

560さんが言ってるような専門的?な事はまったく知りませんでした(汗

でも別に販売目的でHPのアドレスを載せたわけではなく、

純粋に無料のゲームが出来たので、それだったらついでに自分のHPに載せるかみたいな、

ただ単にそれだけですから〜

その辺はご理解ください((+_+))



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

Name: J  ..初心者(7,201ポイント)   Date: 2008/08/29(金) 12:33   No:20647     
Title: Re:シューティングゲームつくりました    
ダウンロードしました。やってみました。

フォルダの中がぐちゃぐちゃでexeファイルを探すのに苦労しました。
少しフォルダ分けをするなど整理した方がいいと思います。
例:
exeファイル
|
ーimg(画像)
|
ーsnd(音楽)

といった感じに。

ゲームはボムの使いどころがよく分かりませんでしたね。。
飛行機にボムを撃っても当たりませんでした。。どういったところで使うのでしょうか?


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

Name: ようすけ  ..かけだし(1,313ポイント)   Date: 2008/08/29(金) 12:48   No:20648     
Title: Re:シューティングゲームつくりました    
jさん、感想どうもです。

フォルダ分けは事情があり、今はできないのです。

ボムについては、readme.txtにも書いてあるように、

弾を消すだけで、敵にダメージを与えることはできません。

緊急回避に使うといったかんじです(*^_^*)


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

Name: 560  ..ぴよぴよ(56ポイント)   Date: 2008/08/29(金) 16:04   No:20653     
Title: Re:シューティングゲームつくりました    
素人だからとかHPが初めてだから販売目的で載せたアドレスじゃないと言っていますが結果としてWEB上に開設されたページに違法性が認められれば良い訳は問答無用な訳でしてあの営業形態で販売し続ける事は当然違法で見過ごして許される問題ではありません。仮に告発される自体にでもなれば・・・

販売を行う上でまず最低限の知識は必要だと思います。一度HPを閉鎖した後に販売方法を十分に理解したうえで改めて立ち上げるのが最良かと思います。現状では法律違反で逮捕されます。
またネット販売をする前に同人系のイベントで頒布して知名度を徐々に上げてから通販を行うのがいいと思います。同時に商品が爆発的に売れたとして申告もしなければなりません。

そもそも上記の話はまず改善しなければ行けない事項だと思いますが

本題として今回のゲームをHP上で公開するのであれば別に特設ページなどを作り開設すべきです。もしくは特化したサイトを立ち上げましょう。通常あのような形で公開するのは好ましくありません。


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

Name: 組木紙織  ..熟練のプログラマー(59,889ポイント)   Date: 2008/08/29(金) 16:23   No:20654     
Title: Re:シューティングゲームつくりました    
ゲームやってみました。

気になったことをいくつか。
.libのファイルってゲームを実行するのに必要なんですか?
削除してやっても動いたのできになりました。

画像データが多すぎる。
ゲーム自体の内容と比べて画像ファイルのデータが多すぎます。ファイル形式を
変えるとか、ゲーム内で画像を合成するとかして、データ量を減らすべきです。

データ読み込み時のエラー処理をしていない。
画像データが存在しなかったときの処理をしていないので、中途半端に動きます。
エラー処理はきちんとしておくべきです。






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

Name: ようすけ  ..かけだし(1,492ポイント)   Date: 2008/08/29(金) 19:22   No:20661     
Title: Re:シューティングゲームつくりました    
>ゲーム自体の内容と比べて画像ファイルのデータが多すぎます。ファイル形式を
変えるとか

APIはBMPだけしかサポートしてないので、他の形式は無理かと・・・

>ゲーム内で画像を合成するとかして、データ量を減らすべきです。
>データ読み込み時のエラー処理をしていない。

まだゲーム作って一か月ちょいぐらいなんで、どういう事か意味がわかりません。


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

Name: バグ  ..ハッカー(104,557ポイント)   Date: 2008/08/29(金) 23:04   No:20664     
Title: Re:シューティングゲームつくりました    
たしか、Bitblt関数の引数を利用すれば、画像の部分表示ができたと思います。
ですので、例えば1キャラが32×32のサイズで16枚のパターンを用意したいのならば、128×128のサイズで縦横各4マスで収めて、必要な部分だけを切り出して描画してやれば、1キャラの画像が1つのファイルに出来てスッキリしますよ(^-^)


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

Name: 管理人 [URL]  ..伝説のハッカー(702,170ポイント)   Date: 2008/08/30(土) 18:06   No:20686     
Title: Re:シューティングゲームつくりました    
しばらく忙しかったので今やっとプレイしてみました。

結構懐かしい感じのするゲームでいいですね☆
PC初心者と仰っているからには、プログラミングも始めたばかりなのかと思いますが、
素晴らしいと思います。

ただ、いらないファイルが入っているのと、音楽がwavなので、
重くなりすぎているのが気になりました。
mp3やogg、画像はPNGなどを使うといいと思いますよ。

これとは直接関係無い話で、HPでの販売の話が出ていますが、
「法律のことはよく知らないのでその辺ご理解下さい」
という言い訳で違法な販売はしてはいけないと思います。

権利は義務を守って初めて得られるものです。
法律に従って行わなければいけない行為をするのなら、まず面倒でも法律について調べないといけません。
とりあえず、どこの誰かわからない人にお金を振り込むような状態になっているので、
最低限HP上で住所、電話番号、本名などの連絡先を書くべきかと思います。
どうしても公開がいやなら、注文と同時に振込み案内のメールにそれを添付するのもありかもしれませんが、
その辺法律上どこまで許されているのかはよく知りません。


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



Name: t_white  ..入門者(2,884ポイント)   Date: 2008/08/29(金) 06:31   No:20628       
Title: ScreenFlip()の処理    
こんにちは。
前回の"ラジアンから8方向の何処を向いているかを調べる関数"のスレでは本当にお世話になりました。
世話になりっぱなしですみませんが今度はDXライブラリのScreenFlip()についての疑問に答えていただけると助かります。

ウィンドウモードの1024×768の画面でゲームを作っていて気になったのですが

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE); //ウィンドウモード
//画面サイズ変更
if(SetGraphMode(1024,768,32)!=DX_CHANGESCREEN_OK){
MessageBox(NULL,TEXT("画面サイズの変更に失敗しました。\n1024×768の画面サイズに対応している環境か確認して下さい。\n終了します。"),TEXT("エラー"),MB_OK);
return -1;
}
if(DxLib_Init()==-1||SetDrawScreen(DX_SCREEN_BACK)!=0)return -1;

while(!ProcessMessage() && !ClearDrawScreen()){
ScreenFlip();
}

DxLib_End();
return 0;
}



上のコードではメインループでScreenFlip()以外の何の処理もしていないのにも関わらず自分の環境(Core2Duo E6600 2.40GHz)ではCPU使用率:20~23%にも達しています。
原因はScreenFlip()の”CRTの垂直同期信号待ちをする処理”がものすごく重い為だと思いました。


//ゲームプログラミングの館 s5. 処理速度を一定にする。にあったコードを使用させて頂きました。
void wait_fanc(){
static int t=0;
int term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
同上
while(!ProcessMessage() && !ClearDrawScreen()){
wait_fanc();
ScreenFlip();
}
同上
}


に書き換えてScreenFlipへの負担を減らしたところ、CPU使用率:3~19% 平均4% にまで落ちました。
更に、


//CPU使用率0
//ゲームプログラミングの館 s5. 処理速度を一定にする。にあったコードを使用させて頂きました。
void wait_fanc(){同上}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
同上
SetWaitVSyncFlag(FALSE); //ScreenFlip関数 実行時にCRTの垂直同期信号待ちをしない

while(!ProcessMessage() && !ClearDrawScreen()){
wait_fanc();
ScreenFlip();
}
同上
}


にして処理の重さの原因だと思われる"CRTの垂直同期信号待ちをする処理"自体を解除してみたらCPU使用率:0~1%とものすごく落ちました。
画像を描画させたりしてもCPU使用率0~2%程度で正常動作しています。

しかしこのように処理を解除してしまうといろいろな弊害がある可能性が高いと思うのですが、大丈夫でしょうか。
大丈夫ではない場合は処理の軽さを保ったままの解決策をご教示して頂けると助かります。
DXライブラリを実際に使用してゲームなどを作ったことがある方はこの重いScreenFlip処理をどのようにかわしているのでしょうか・・・。

モニターのリフレッシュレートは60fpsの場合のみ考慮できればいいです。


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


Name: lbfuvab  ..入門者(4,152ポイント)   Date: 2008/08/29(金) 09:54   No:20631     
Title: Re:ScreenFlip()の処理    
CRTとの同期を取らないとチカチカするかもしれません。
それならいっそwait_func書き換えて30fpsで動作する様にしたら軽くなるかも知れませんね。

void wait_fanc(){


static int t=0;

int term = GetNowCount()-t;

if(16-term>0)

Sleep(33-term); //1000/30=33.333333・・・

t=GetNowCount();

return;

}



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

Name: t_white  ..入門者(2,948ポイント)   Date: 2008/08/30(土) 01:41   No:20671 解決!     
Title: Re:ScreenFlip()の処理    
>>lbfuvab様
そうですか。
今のところ特にチカチカはしませんしこの処理の部分のCPU使用率も60fpsの状態で平均0%を保っているので
このままのコードを使ってみようと思います。
返信ありがとうございました<(_ _)>


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



Name: いけやん  ..入門者(3,518ポイント)   Date: 2008/08/25(月) 13:57   No:20518       
Title: ノードの親子関係について    
以前にもお世話になったいけやんです。
また、質問さして頂きます。

環境はWinXp
VC6.0 MFC

CTreeCtrlで文字等を親子関係にする処理で悩んでいます。

前までは、
 m_HndTree[0] = m_tree.InsertItem(あああ,TVI_ROOT);
 m_HndTree[1] = m_tree.InsertItem(いいい,m_HndTree[0]);
 m_HndTree[2] = m_tree.InsertItem(ううう,m_HndTree[1]);
 m_HndTree[3] = m_tree.InsertItem(えええ,m_HndTree[1]);

実行結果
--あああ
U-いいい
U-ううう
U-えええ

上記の様な処理でベタ書きで親子にしていたのですが
それをテキストに格納して
テキストから、読み込み表示し親子関係にする処理を考えているのですが
以前質問さして頂いた時に表示までは、うまくいきました。
そこからの、親子関係にするアイデアが中々浮びません。

どなたか、いいアイデアをお持ちではないでしょうか?
どうぞよろしく、お願い致します。

今現在のソースです。

for(
){
 m_HndTree[0] = m_tree.InsertItem(String,TVI_ROOT);//あああ
 m_HndTree[1] = m_tree.InsertItem(String,m_HndTree[0]);//あああ
 m_HndTree[2] = m_tree.InsertItem(String,m_HndTree[1]);//あああ
 m_HndTree[3] = m_tree.InsertItem(String,m_HndTree[1]);//あああ
}

テキストの中
あああ
いいい
ううう
えええ


現在の実行結果
+あああ
U+あああ
+あああ
+あああ


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


Name: 御津凪  ..入門者(4,353ポイント)   Date: 2008/08/26(火) 13:09   No:20536     
Title: Re:ノードの親子関係について    
方法として挙げるならば、再帰関数を使うと楽かもしれません。
それと、読み込むテキストに親子関係を示さないと、
プログラムの方でどう処理すればいいか分からなくなります。

一応、処理は while 文でも可能だと思います。
コードが複雑になりますが、バグ等でスタックオーバーフローを起こすより安全です。


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

Name: いけやん  ..入門者(4,098ポイント)   Date: 2008/08/26(火) 16:39   No:20540     
Title: Re:ノードの親子関係について    
御津凪さん、
すいません、まず再帰関数から調べてました。
再帰関数または、再帰処理を呼ぶらしいです。
自分自身の関数をその内部で呼び出す事みたいですね。

回答の質問は、あまりよくない事は解っているのですが
質問さして頂きます。

その再帰処理をする事によって意味(効果?)みたいな事があるのですか?
調べ不足ならすいません。

>それと、読み込むテキストに親子関係を示さないと、
>プログラムの方でどう処理すればいいか分からなくなります。
上記はどういう事でしょうか?
もう少し崩して貰っていいですか?

すいません。お手数ですがよろしくお願いします。


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

Name: いけやん  ..入門者(3,894ポイント)   Date: 2008/08/26(火) 17:22   No:20541     
Title: Re:ノードの親子関係について    
>その再帰処理をする事によって意味(効果?)みたいな事があるのですか?
間違っていたら、すいません。

メリット的な物で調べていたら、
「前の繰り返し結果を使用して同じ演算を
複数回数繰り返すアルゴリズムによって
問題を解決できる場合に便利です。」
上記の様な事が書いてありました。
その他を見ても同じ様な事が書いてありました。

だとすると、小さい親子関係だと再帰処理も必要ないのかもしれませんが
同じ処理の繰り返しで、親と子をひたすら割り当てる処理の時は有効という解釈で合っていますか?


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

Name: 御津凪  ..入門者(3,452ポイント)   Date: 2008/08/26(火) 17:52   No:20542     
Title: Re:ノードの親子関係について    
> >それと、読み込むテキストに親子関係を示さないと、
> >プログラムの方でどう処理すればいいか分からなくなります。
> 上記はどういう事でしょうか?
> もう少し崩して貰っていいですか?
たとえば、読み込むテキストが、

あああ
いいい
ううう
えええ

だと、どれが親でどれが子なのか分かりません。

あああ
いいい
ううう
えええ

とすると、「あああ」が「いいい」・「ううう」・「えええ」の親だと字下げで表現できますよね。

つまり、テキストデータに親子関係の情報を含めないと、
いざ読み込もうとしても、どれがどの親か判別できません。
(一番最初の行がルートとすることはできますが。)

次に再帰処理の方ですが、

> だとすると、小さい親子関係だと再帰処理も必要ないのかもしれませんが
> 同じ処理の繰り返しで、親と子をひたすら割り当てる処理の時は有効という解釈で合っていますか?

それであっていると思います。

再帰処理はアルゴリズムで使用することが多いので、
普段は使うことが少ないかもしれません。
たとえば、2の乗数を計算する時、 while 文を使用すると、

int pow2( int a ){
int n;
if(a <= 0) rerurn 0;
n = 1;
while(a > 0){
n*=2;
--a;
}
return n;
}

のようになりますが、再帰処理を行うようにすると、

int pow2( int a ){
if(a <= 0) rerurn 0;
else if(a == 1) rerurn 2;
else return pow2(a-1)*2;
}

このように短く済みます。
(正しく動くかは未確認です)
一番の利点は、作業用に利用する一時変数が減るのと、
プログラムの行数が減り、実行ファイルのサイズが小さくなる点が挙げられます。

欠点としては、使い方を間違えると簡単に無限ループに陥ってスタックオーバーフローを起こすことや、
ぱっと見何をしているのか分からない、等があります。

今回の親子関係の問題では、

あああ
 いいい
  ううう
   えええ
    おおお
     …

のような場合、追加するための親への変数を保持するのが非常に面倒です。
(スタックを使えば可能ではありますが)

そこで再帰処理を使用します。
関数の引数を使用すれば、いくら深い子があっても、

1. 親に子を追加
2. 1.で追加した子にさらに子(孫)が存在する場合は再帰で関数を呼ぶ(子を親として、孫を子として渡す)
3. 親に追加する子が他にあれば1.へ
4. なければ終了

の処理をする関数を用意するだけで事足ります。
実際はもっと複雑になると思いますが…。

最後に、ずいぶんと長くなってしまいましたが、理解できましたでしょうか?


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

Name: いけやん  ..入門者(4,212ポイント)   Date: 2008/08/26(火) 18:39   No:20545     
Title: Re:ノードの親子関係について    
御津凪さん、ありがとうございます。

>つまり、テキストデータに親子関係の情報を含めないと
--------+------------------------------------
02-00-00|《あああ》 ROOTになる物 親
02-01-00| いいい[い] FIRST 子
02-01-01| ううう LAST 孫
02-01-01| ええええ LAST 孫
02-01-01| おお/お LAST   孫
02-02-00| かかか FIRST 子
02-02-01| きき LAST 孫
02-02-01| くくくくく LAST 孫
02-02-01| けけけ LAST    孫
--------+------------------------------------
こういう感じですかね・・・(自信なし)

>最後に、ずいぶんと長くなってしまいましたが、理解できましたでしょうか?
御津凪さんの説明上では、何となくですが解りました。

ですが、不安要素がいくつかあり、
@再帰処理をやった事がない。
A02-01-01といった形で親子関係にするのか
CString等で02-01-01を丸ごと、とって来て
char等で、1個ずつ格納していき
最初が0、次が2,'-'飛ばして、又0,次が1なら子供にする
みたいな処理にするのか?

こんな感じで、ちょっと混乱していますね。
とりあえず、処理を書いてから返信したいと思います。


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

Name: いけやん  ..入門者(4,592ポイント)   Date: 2008/08/27(水) 13:37   No:20549     
Title: Re:ノードの親子関係について    
返信遅くなりました。
まず下記の処理をしようとし最初から躓きました。
>1. 親に子を追加

コンパイルエラーはないのですがツリーに何も表示されないので
×ボタンを押して終わろうとすると「中止」「再試行」「無視」等のウィンドウが出てきます。
ソースの方に致命的なバグがあると思うのですが、自分では見つけられないので
お力添えをお願いします。

下記の処理を加えるまでは、動いていたのでここだと思います。

num = str.Mid(4,6);
if(num == "00"){m_HndTree[n] = m_tree.InsertItem(String,TVI_ROOT);++n;}//親か
else if(num == "01"){m_HndTree[--n] = m_tree.InsertItem(String,m_HndTree[0],TVI_FIRST);++n;}//子か
else{m_HndTree[n] = m_tree.InsertItem(String,m_HndTree[--n],TVI_LAST);}//孫

テキストの中身
-----+------------------------------------
02-00|《垂木エディタ》
02-01| 垂木台[群]
02-02| 部材集計表
02-02| 平面割付図
02-02| 単品制作図
02-01| 野地下地
02-02| 部材集計表
02-02| 平面割付図
02-02| 単品制作図
-----+------------------------------------


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

Name: いけやん  ..入門者(4,775ポイント)   Date: 2008/08/27(水) 13:59   No:20550     
Title: Re:ノードの親子関係について    
すいません。先ほどの件なのですが
表示されないのは、解決しました。
>num = str.Mid(4,6);
上記でとってくる位置が違っていました。
デバックで走らすとnumの中が"00|<<垂木"まで入っていました。

なのでnum = str.Mid(3,2);しました。
numの中も"00"なっていました。

ですが、下記はまだ直っていません。
>×ボタンを押して終わろうとすると「中止」「再試行」「無視」等のウィンドウが出てきます。
>ソースの方に致命的なバグ
よろしくお願いします。


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

Name: 御津凪 [URL]  ..入門者(3,665ポイント)   Date: 2008/08/27(水) 14:20   No:20551     
Title: Re:ノードの親子関係について    
> ×ボタンを押して終わろうとすると「中止」「再試行」「無視」等のウィンドウが出てきます。
多分そのウインドウはランタイムエラーのダイアログで、
上記のプログラムから察するに、 m_HndTree の許容配列を超えて処理してしまっているのではないでしょうか。


まず、上記のコードを1命令1行に直し、デバッグモードのステップ実行で、
n の値を確認してみるといいと思います。

私の予想では、親を追加する時は0番に格納されるのであっていると思いますが、
次の子の追加で、先に --n が評価されるので、0番に格納されてしまうと思います。


…まさか、

-----+------------------------------------

はテキストに入っていませんよね?
入っているとしたら読み飛ばしていますか?
読み飛ばさないとこの行が孫として処理されてしまいます。
(--n で n が負数になる)


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

Name: いけやん  ..初心者(5,181ポイント)   Date: 2008/08/27(水) 14:41   No:20552     
Title: Re:ノードの親子関係について    
御津凪さん。ありがとうございます。

>-----+------------------------------------
>入っているとしたら読み飛ばしていますか?
これは、読み飛ばしていました。

言うとおりnの中を一つ一つ確認した所始めは0でうまくいくのですが
--した後に++しているので、0に格納されていました。
-1に直しました。

if(num == "00"){m_HndTree[n] = m_tree.InsertItem(String,TVI_ROOT);++n;}
else if(num == "01"){m_HndTree[n-1] = m_tree.InsertItem(String,m_HndTree[0],TVI_FIRST);++n;}
else{m_HndTree[n] = m_tree.InsertItem(String,m_HndTree[n-1],TVI_LAST);}

結果>ランタイムエラーのダイアログ
も出なくなりました。

余談ですが、前に御津凪さんが立てたスレをこっそり見ていまして、
i++より++iの方がいいという事を知ってそれから
++i --i 前置を使う様になりました。


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

Name: 御津凪 [URL]  ..入門者(3,700ポイント)   Date: 2008/08/27(水) 14:48   No:20553     
Title: Re:ノードの親子関係について    
> 結果>ランタイムエラーのダイアログ
> も出なくなりました。

と言うことはちゃんと表示されたのですか?

> 余談ですが、前に御津凪さんが立てたスレをこっそり見ていまして、
> i++より++iの方がいいという事を知ってそれから
> ++i --i 前置を使う様になりました。

読んで頂いてありがとうございます。

今回の問題で使い方の勉強にもなったのだろうと思います。


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

Name: いけやん  ..初心者(5,626ポイント)   Date: 2008/08/27(水) 15:09   No:20554     
Title: Re:ノードの親子関係について    
>読んで頂いてありがとうございます。
いえいえ、こちらこそありがとうございます。勉強になります。

>今回の問題で使い方の勉強にもなったのだろうと思います。
そうですね、こういう事は自分で一回失敗した方が身しみていいですね。

>と言うことはちゃんと表示されたのですか?
う〜ん答えはNoですね

《垂木エディタ》親
垂木台[群] 子
部材集計表 孫
平面割付図 孫
単品制作図 孫
野地下地 子
部材集計表 孫
平面割付図 孫
単品制作図  孫
にしたいのですが、現在の実行結果は
《垂木エディタ》親
垂木台[群] 子
野地下地 孫
部材集計表 親
平面割付図 親
単品制作図  親

表示位置がずれていて、さらに親子関係もおかしいので
ソースをデバックで確認してみます。


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

Name: 御津凪 [URL]  ..入門者(3,944ポイント)   Date: 2008/08/27(水) 15:36   No:20555     
Title: Re:ノードの親子関係について    
「野地下地」が孫なのは前の子の追加の時、親が格納されていた0番に子が入っているためだと思います。

最初の三つの孫がないのは、格納されていない(何も入っていない)番号を親としているからでしょう。

順を追うと、

親を n(0) 番に追加し、 ++n(1) 。
子を 0 番を親として n-1(0) 番に追加し、 ++n(2)。
孫を n-1(1) 番を親として n(2) 番に追加。



となっているはずです。
※カッコ内は n の計算結果

子を入れるときの処理の ++n をなくし、
孫の親を n にし、 孫の入れる場所を n+1 にすると
うまくいくのではないでしょうか?

ふと、思ったのですが、
親、子、孫の三つだけであれば、
3つの配列を用意して、
0番 : 親
1番 : 子
2番 : 孫
のように決めて入れる様にする方が早いかもしれません。
(実際、両方とも同じ感じに格納されていくので)


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

Name: いけやん  ..初心者(5,745ポイント)   Date: 2008/08/27(水) 18:14   No:20556     
Title: Re:ノードの親子関係について    
遅くなりました。
かなり混乱しました(今も)

>孫の親を n にし、 孫の入れる場所を n+1 にすると
上記の処理にすると表示結果は、

《垂木エディタ》親
垂木台[群] 子
部材集計表 子
平面割付図 子
単品制作図 子
野地下地 子
部材集計表 子
平面割付図 子
単品制作図  子
になりました。

>孫の入れる場所を n+1 にすると
この処理は正しいみたいです。

>孫の親を n にし
これは、前の処理で加算されたnがそのまま入るので
実行結果
《垂木エディタ》親
垂木台[群] 子
部材集計表 孫
平面割付図 曾孫
単品制作図 玄孫(やしゃご)
野地下地 玄姪孫(げんてっそん)
部材集計表 来孫(らいそん)
平面割付図 昆孫(こんそん)
単品制作図  仍孫(じょうそん)

なので、下記の処理でうまくいきました。

num = str.Mid(3,2);
if(num == "00"){m_HndTree[n] = m_tree.InsertItem(String,TVI_ROOT);n+1;}
else if(num == "01"){m_HndTree[n-1] = m_tree.InsertItem(String,m_HndTree[0]);n+1;}
else{ m_HndTree[n+1] = m_tree.InsertItem(String,m_HndTree[n-1]);n+1;}

実行結果
《垂木エディタ》親
垂木台[群] 子
部材集計表 孫
平面割付図 孫
単品制作図 孫
野地下地 子
部材集計表 孫
平面割付図 孫
単品制作図  孫


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

Name: 御津凪 [URL]  ..入門者(4,089ポイント)   Date: 2008/08/27(水) 18:33   No:20560     
Title: Re:ノードの親子関係について    
何か良くわからない書き方だったのですいませんでした。(汗
うまく行ったのは良かったですね。

しかし、上記のコードで、
n+1;
は、無意味なコードです。
(式を受け取る変数がない)

このコードだと、 n が 0 のままなので、

m_HndTree[-1] : 親のデータ
m_HndTree[ 0] : 子のデータ
m_HndTree[ 1] : 孫のデータ

となっているかと思います。

P.S
そこまで子の呼び方があるんですか!?
知りませんでした…。


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

Name: いけやん  ..初心者(5,894ポイント)   Date: 2008/08/28(木) 09:56   No:20579     
Title: Re:ノードの親子関係について    
おはようございます。

>しかし、上記のコードで、n+1;は、無意味なコードです。
確かにそうですね。
実際の所nは値的にいえばずっと0ですもんね。

という事は、カウントアップ用(インクリメント、デクイメント)専用の

変数を用意した方がいいですかね?

後ですね。ちょっと聞きたいのですが。
>ふと、思ったのですが、
>親、子、孫の三つだけであれば、
>3つの配列を用意して、
省略

確かに親子関係でいえば
親、子、孫までの3つの関係しか今のところありません。

上記の事は、どういう事でしょうか?

テキストの中を
"00"→"0"親
"01"→"1"子
"02"→"2"孫
に変えるとかでしょうか?

理解力がなくてすいません(涙
よろしく、お願いします。





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

Name: 御津凪 [URL]  ..入門者(4,725ポイント)   Date: 2008/08/28(木) 10:28   No:20581     
Title: Re:ノードの親子関係について    
おはようございます。

> 3つの配列を用意して、
の部分は、正確に言うと、親子関係を設定するための変数(m_HndTree)の配列を3として、

m_HndTree[0] = 親
m_HndTree[1] = 子
m_HndTree[2] = 孫

を、それぞれ格納する様に処理を行うということです。

int i = atol(num); // 文字列から数字へ
m_HndTree[i] = m_tree.InsertItem(String,(i == 0)?TVI_ROOT:m_HndTree[i-1]);


コードはこんな感じになります。
このコードは処理可能な親子のレベルが配列と比例します。
ある程度深さが分かっていればそれに合わせて配列を用意すれば済みますが、
深さが不明な場合、配列の長さをいくら大きくしてもエラーが発生する恐れがあります。

エラーを発生させないようにするには、再帰処理が楽です。

つまり、親子関係の深さが分かっていれば、再帰処理なんて面倒なことはせずに
済むということです。

(そういえば、コードからインクリメントやデクリメントが無くなってた)


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

Name: いけやん  ..初心者(6,313ポイント)   Date: 2008/08/28(木) 12:37   No:20601     
Title: Re:ノードの親子関係について    
御津凪さん。サンプルありがとうございます。

子、孫の処理は下記の様な感じですかね?

num = str.Mid(3,2);//切り出し
n = atol(num);//文字列から数字へ変換
m_HndTree[n] = m_tree.InsertItem(String,(n == 0)?TVI_ROOT:m_HndTree[n-1]);++n;
m_HndTree[n] = m_tree.InsertItem(String,(n == 1)?m_HndTree[n-1]);++n;//エラー
m_HndTree[n] = m_tree.InsertItem(String,(n == 2)?m_HndTree[n-1]);++n;//エラー
御津凪さんが書いてくれた所は通るのですが
子と孫の処理は下記の様なエラーが出ます。

',' が ')' の前に必要です。
なので ,や :を付けてもその部分がエラーで怒られます。
どう解決したらいいのでしょか?
すいませんが、お願いします。


>m_HndTree[i] = m_tree.InsertItem(String,(i == 0)?TVI_ROOT:m_HndTree[i-1]);

>(i == 0)?部分
こんな書き方できるんですか、知りませんでした。
自分なりの解釈では、if(i==0)と一緒かな?
と思っています。


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

Name: 御津凪 [URL]  ..初心者(5,431ポイント)   Date: 2008/08/28(木) 13:01   No:20604     
Title: Re:ノードの親子関係について    
m_HndTree[i] = m_tree.InsertItem(String,(i == 0)?TVI_ROOT:m_HndTree[i-1]);

は、

if(i == 0){
m_HndTree[i] = m_tree.InsertItem(String,TVI_ROOT);
}else{
m_HndTree[i] = m_tree.InsertItem(String,m_HndTree[i-1]);
}


と、同等です。
上記の記法は「三項演算子」といって、

式 ? 式が真の場合に評価する部分 : 式が偽の場合に評価する部分

となっています。

エラーになっているのは、":"と片方の式がなく、構文として合っていないためです。
それを直せば(消すと)エラーはなくなりますが、このコードだと、
同じ文字列を親、子、孫にそれぞれ追加してしまいます。

なので、

num = str.Mid(3,2);//切り出し
int n = atol(num); // 文字列から数字へ
m_HndTree[n] = m_tree.InsertItem(String,(n == 0)?TVI_ROOT:m_HndTree[n-1]);
// ↑指定された番号に追加

だけで、いいはずです。
切り出した文字列(数字)はそのまま親子関係の深さになるので、
インクリメントやデクリメントは一切不要になります。

一応、上記の処理している意味は理解しているでしょうか?

三項演算子は処理の優先度の関係のせいで、意図しない結果になったりします。
もし使うとしたら、
m_HndTree[n] = m_tree.InsertItem(String,((n == 0)?TVI_ROOT:m_HndTree[n-1]));

と、括弧で囲む癖をつけると良いと思います。


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

Name: いけやん  ..初心者(6,635ポイント)   Date: 2008/08/28(木) 14:23   No:20607     
Title: Re:ノードの親子関係について    
>上記の記法は「三項演算子」といって
勉強になります。

>一応、上記の処理している意味は理解しているでしょうか?
う〜んと、ですね。
大体は理解したのですが・・・
どうしても下記の部分が自分的には、納得?(理解?)していません。

>切り出した文字列(数字)はそのまま親子関係の深さになるので、
>インクリメントやデクリメントは一切不要になります。

m_HndTree[n] = m_tree.InsertItem(String,((n == 0)?TVI_ROOT:m_HndTree[n-1]));
この処理でいえば

m_HndTree[n]の部分が
例えば70まであったとすれば,
自分的には、
[0] [n]//1
[1] [n]//2
[2]→[n]//3



[70]→[n]//70
振り当てていくから、++nカウントアップ(インクリメント)の処理は必要ではないんでしょうか?
頭が固くて、すいません。
お願いします。


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

Name: 御津凪 [URL]  ..初心者(5,712ポイント)   Date: 2008/08/28(木) 14:49   No:20609     
Title: Re:ノードの親子関係について    
確か、 m_HndTree は InsertItem 関数で親を指定するためだけの変数のはずなので、
n を数値に置き換えた時、

親("00")の場合、
m_HndTree[0] = m_tree.InsertItem(String,((0 == 0)?TVI_ROOT:m_HndTree[0-1]));

m_HndTree[0] = m_tree.InsertItem(String,TVI_ROOT);
で、0番に親が格納されます。

子("01")の場合、
m_HndTree[1] = m_tree.InsertItem(String,((1 == 0)?TVI_ROOT:m_HndTree[1-1]));

m_HndTree[1] = m_tree.InsertItem(String,m_HndTree[0]);
で、0番を親として1番に子が格納されます。

孫("02")の場合、
m_HndTree[2] = m_tree.InsertItem(String,((2 == 0)?TVI_ROOT:m_HndTree[2-1]));

m_HndTree[2] = m_tree.InsertItem(String,m_HndTree[1]);
で、1番を親(親の子)として2番に孫が格納されます。


…と、続いていきます。

単純に親子関係を構築する場合は、 m_HndTree の配列を項目の数だけ用意するといったことは不要です。




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

Name: いけやん  ..初心者(6,898ポイント)   Date: 2008/08/28(木) 15:49   No:20611     
Title: Re:ノードの親子関係について    
すいません。何か勘違いをしていたみたいです。

解っているかどうかの自分なりの説明書いてみます。
まず、
>m_HndTree[n] = m_tree.InsertItem(String,((n == 0)?TVI_ROOT:m_HndTree[n-1]));
>この処理でいえば
>m_HndTree[n]の部分が
この部分は,atol関数で数字に変換しているから
0,1,2が順番に入っていくんですね。
n = atol(num);//nに0,1,2が代入される
m_HndTree[n]//0
m_HndTree[n]//1
m_HndTree[n]//2
で、私の言っていた
>[0] [n]//1
>[1] [n]//2
>[2]→[n]//3
>:
>:
>:
>[70]→[n]//70
>単純に親子関係を構築する場合は、 m_HndTree の配列を項目の数だけ用意するといったことは不要です。
これは、親、子、孫までの関係しかないので
例え100,200,300,・・・になっても
0〜100を割り当てるのではなく、
親、子、孫の関係の0,1,2を振り分けて
その100個分を0,1,2で管理(親子関係)にするという事合っていますか?

すいません。馬鹿(自分なり)の説明なので解りにくいと思います。



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

Name: 御津凪 [URL]  ..初心者(5,776ポイント)   Date: 2008/08/28(木) 16:01   No:20612     
Title: Re:ノードの親子関係について    
> これは、親、子、孫までの関係しかないので
> 例え100,200,300,・・・になっても
> 0〜100を割り当てるのではなく、
> 親、子、孫の関係の0,1,2を振り分けて
> その100個分を0,1,2で管理(親子関係)にするという事合っていますか?

その通りです。
もちろん、ひ孫までの関係を作るなら0(親)、1(子)、2(孫)、3(ひ孫)の、
4つの配列で管理することになりますね。

> すいません。馬鹿(自分なり)の説明なので解りにくいと思います。

そんなことはありませんよ。




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

Name: いけやん  ..初心者(6,997ポイント)   Date: 2008/08/28(木) 17:58   No:20614     
Title: Re:ノードの親子関係について    
すいません。返信遅くなりました。

御津凪さん。表示はうまくいきました。
ありがとうございます・

ですが、今まで動いていた機能が正しく動作しなくなったので
今から自分なり考えて
また明日、返信したいと思います。


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

Name: いけやん  ..初心者(7,447ポイント)   Date: 2008/08/29(金) 11:37   No:20640     
Title: Re:ノードの親子関係について    
こんにちは。
自分なりに考えたのですが、解らないので質問します。

>今まで動いていた機能が正しく動作しなくなったので
上記の件なのですが、
今までボタンを何個は貼り付けていたのですが、
いくつかは動くのですが、数個は正しく機能しなくなりました。

そのボタンの処理の内容は

//全ノード展開
//全ての折りたたまれているノードを展開する
void CVctreeDlg::OnButton2()
{
for(int k = 0 ; k < 3 ; ++k){
m_tree.Expand(m_HndTree[k],TVE_EXPAND);
}
}


//全ノード圧縮
//全てのノードを折りたたむ
void CVctreeDlg::OnButton3()
{
for(int k = 0 ; k < 3 ; ++k){
m_tree.Expand(m_HndTree[k],TVE_COLLAPSE);
}
}


//全選択ボタン
//全てのノードにチェックを付ける
void CVctreeDlg::OnButton4()
{
for(int k = 0 ; k < 3 ; ++k){
m_tree.SetCheck(m_HndTree[k],TRUE);
}
}


//全チェック解除
//全てのノードのチェックをはずす
void CVctreeDlg::OnButton5()
{
for(int k = 0 ; k < 3 ; ++k){
m_tree.SetCheck(m_HndTree[k],FALSE);
}
}


前までは下記の様に、ベタ書きで入れていたので
m_HndTree[0〜70]=m_tree.InsertItem(String,m_HndTree[4]);

#define LOOPMAX 70
for(int k = 0 ; k < LOOPMAX ; ++k){
m_tree.Expand(m_HndTree[k],TVE_EXPAND);
}
でうまくいっていたのですが
テキストから読み込みができる様になってから正しく動作しません。

自分的には、0,1,2で親子付けしているので、0〜2まで
for()で回せばいけると思ったのですが、違うみたいです。

お手数ですが、よろしくお願いします。



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

Name: 御津凪 [URL]  ..初心者(6,289ポイント)   Date: 2008/08/29(金) 12:10   No:20643     
Title: Re:ノードの親子関係について    
m_HndTree は、あの処理では親子関係を示すために使用したため、
これでは最後に格納された親・子・孫しか操作できません。

全ての項目に対して行う場合、全ての項目を読み込み時に確保する方法と、
再帰処理を書く方法があります。
前者だと沢山項目があるとその分メモリを消費してしまうので、
後者の再帰処理を書いておきます。

void handle_children( CTreeCtrl* tree, HTREEITEM item ){
HTREEITEM child;
if(tree->ItemHasChildren(item)){ // 子があるかどうか
child = tree->GetChildItem(item); // 最初の子を取得
while(child != NULL){ // 全ての子に対して処理する
/* ココで child に対して処理 */
paycode(tree,child); // 再帰処理
child = tree->GetNextItem(child,TVGN_NEXT); // 次の子を取得
}
}
}

私はMFCを使ったことがないので、MSDNを見ながら書きました。
ミスがあるかも知れませんが、このような処理で大丈夫のはずです。


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

Name: 御津凪 [URL]  ..初心者(6,511ポイント)   Date: 2008/08/29(金) 14:16   No:20650     
Title: Re:ノードの親子関係について    
間違ってました。

paycode(tree,child); // 再帰処理

ではなく、

handle_children(tree,child); // 再帰処理

でした。


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

Name: いけやん  ..初心者(7,730ポイント)   Date: 2008/08/29(金) 15:43   No:20651     
Title: Re:ノードの親子関係について    
御津凪さん。何度もすいません。

'handle_children' : ローカル関数の定義が正しくありません。
というエラーが回避できません。

ソースです。

//全ノード展開
void CVctreeDlg::OnButton2()
{
//再帰処理(再帰関数)
    void handle_children(CTreeCtrl* tree, HTREEITEM item){

HTREEITEM child;

if(tree->ItemHasChildren(item)){//子があるかどうか

child = tree->GetChildItem(item)//最初の子を取得

while(child != NULL){//全ての子に対して処理する

/*ココでchildに対して処理*/
m_tree.Expand(m_HndTree[n],TVEEXPAND);
handle_children(tree,child);//再帰処理
child = tree->GetNextItem(child,TVGN_NEXT);//次の子を取得

}
}
   }

}

自分では、void CVctreeDlg::OnButton2()に
入れる事が間違っているのかと思ったり
void handle_childrenを外に出したりしたのですが
違うみたいです。
素人な質問ですいませんが、お願いします。


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

Name: 御津凪 [URL]  ..初心者(6,714ポイント)   Date: 2008/08/29(金) 16:04   No:20652     
Title: Re:ノードの親子関係について    
> 自分では、void CVctreeDlg::OnButton2()に
> 入れる事が間違っているのかと思ったり

関数の中に関数は書けません。

再帰処理を行う関数は他と全く同じ関数なので、特別扱いというものはありません。

それと、変数 child は、再帰処理により全ての項目をたどるので、
コメント通り、 child に対して展開などの処理を行います。
よって、
m_tree.Expand(m_HndTree[n],TVEEXPAND);
は、
m_tree.Expand(child,TVEEXPAND);
となります。

> void handle_childrenを外に出したりしたのですが

CVctreeDlg クラスの定義にこの関数を宣言して、
CVctreeDlg::handle_children として関数を定義してみてください。
(関数名は自由につけられますので、他の関数名にあった名前をつけてください)

一応、クラスメンバの書き方は理解していますでしょうか?

グローバル関数として定義してもいいのですが、クラスメンバとしておいたほうが
効率が良いです。


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

Name: いけやん  ..初心者(8,024ポイント)   Date: 2008/08/29(金) 18:05   No:20657     
Title: Re:ノードの親子関係について    
御津凪さん。返信遅くなりました。
え〜とですね。

正直にいいますと。
関数の使い方、作り方など、怪しい部分あります。
(大体の感じ等は解っているのですが)
自分で関数等を作った事がなく改めて解ってない事が解りました。

当然、再帰処理の所が解らなくなって来たので
このまま質問を続けても
御津凪さんに迷惑を掛けるので、

明日、「関数の作り方」「再帰処理」「VC++」
この辺りの参考書を買って勉強して出直してきます。

自分的に調べもせず質問をするのはよくないと思うので、
素人、初心者、質問者でも最低限(解らないなら解らないなりに)
調べてから質問すべきなので。

>一応、クラスメンバの書き方は理解していますでしょうか?
これもあまり解らないですね。
違うならすいません。
ヘッダ、もしくは#includeの下の辺り(グローバル)
とこら辺に
void handle_children(CTreeCtrl* tree,HTREEITEM item);
宣言してhandle_childrenという関数
を使いますよー。
という宣言の事ではないですよね?


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

Name: 御津凪 [URL]  ..初心者(6,501ポイント)   Date: 2008/08/29(金) 18:22   No:20658     
Title: Re:ノードの親子関係について    
> ヘッダ、もしくは#includeの下の辺り(グローバル)
> とこら辺に
> void handle_children(CTreeCtrl* tree,HTREEITEM item);
> 宣言してhandle_childrenという関数
> を使いますよー。
> という宣言の事ではないですよね?

これは関数宣言ですね。
CやC++では、これをしないとエラーが出ることがあります。

> 明日、「関数の作り方」「再帰処理」「VC++」
> この辺りの参考書を買って勉強して出直してきます。
>
> 自分的に調べもせず質問をするのはよくないと思うので、
> 素人、初心者、質問者でも最低限(解らないなら解らないなりに)
> 調べてから質問すべきなので。

確かにそのほうがいいでしょう。
ただし、分厚い入門書や参考書は余りお勧めできませんね。
途中で投げ出してしまう可能性が高いので。

こちらのログを参考にするといいと思いますよ。

http://www.play21.jp/board/formz.cgi?action=res&resno=19760&page=&lognum=62&id=dixq&rln=19877
Title:オススメの本は?

あと、このスレを一旦止める場合は(解決していなくても)解決マークをつけておいて、
新しく立て直したほうがいいでしょう。
(なぜか二人しか書いていないスレなので)


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

Name: いけやん  ..初心者(8,278ポイント)   Date: 2008/08/29(金) 18:48   No:20659 解決!     
Title: Re:ノードの親子関係について    
御津凪さん。
本のアドバイスありがとうございます。

>あと、このスレを一旦止める場合は(解決していなくても)解決マークをつけておいて、
>新しく立て直したほうがいいでしょう。
了解です。

>(なぜか二人しか書いていないスレなので)
そういえば、そういですね・・・なぜだ???
御津凪さんにしかお世話(もしくわ迷惑?)になってないですね(汗

御津凪さん、ありがとうございました。

後ですね。図々しいのですが、
また月曜にでも新しいスレを立てると思うので
時間があればで、いいので、
御津凪さんにも答えて頂ければうれしいです。
説明が解り易いので。


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



Name: ルファー [URL]  ..入門者(4,294ポイント)   Date: 2008/08/27(水) 23:52   No:20569       
Title: コンパイル中のファイル名による分岐    
ヘッダーファイルに
"現在コンパイル中のファイルが「main.c」でなければ、グローバル変数の宣言に「extern」修飾子をつける"
っていうことはできますか?

[余談:VC++2005のプリコンパイル済みヘッダーとかいうやつの有無で何が違うの]


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


Name: たかぎ [URL]  ..熟練のプログラマー(55,896ポイント)   Date: 2008/08/28(木) 00:38   No:20570     
Title: Re:コンパイル中のファイル名による分岐    
C言語の仕様の範囲では無理です。
どうしてもやりたければ、ツールを自作してコンパイル前に通すか、m4のようなマクロプロセッサで代用するなどしてください。


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

Name: toyo  ..上級者(16,320ポイント)   Date: 2008/08/28(木) 08:18   No:20574     
Title: Re:コンパイル中のファイル名による分岐    
プリコンパイル済みヘッダーを使うとコンパイル時間が短縮されます。
それだけです。


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

Name: ルファー [URL]  ..入門者(4,324ポイント)   Date: 2008/08/28(木) 21:47   No:20619 解決!     
Title: Re:コンパイル中のファイル名による分岐    
やっぱりファイル名で分岐は無理なんですね。
ありがとうございます。

[そうかコンパイル時間が短くなるのか]


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,099ポイント)   Date: 2008/08/28(木) 21:54   No:20620     
Title: Re:コンパイル中のファイル名による分岐    
> やっぱりファイル名で分岐は無理なんですね。

はい。
C言語の仕様の範囲では無理です。
今回やろうとしていることは大体想像が付きますが、その程度であれば、ファイル名で分岐させる必要はないでしょう。
ただ、もっと有意義な目的で必要になった場合には、C言語の仕様外の方法で実現することはできるということです。



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

Name: 翡翠  ..入門者(3,755ポイント)   Date: 2008/08/28(木) 23:10   No:20621     
Title: Re:コンパイル中のファイル名による分岐    
え〜と、ここの龍神録プログラミングの館の5章、「宣言の仕方を工夫しよう」に、その方法が書いてあります

私もあの方法を使わせて頂いてます

C++ならできるのですが、たかぎさんの仰るように、C言語では使えないのかもしれません
Cで試していないのですみませんが、私にはこれ以上わかりません

参考になれば


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,266ポイント)   Date: 2008/08/29(金) 02:25   No:20625     
Title: Re:コンパイル中のファイル名による分岐    
> C++ならできるのですが、

C++でもできません。

現在コンパイル中のファイルがmain.cであるかどうかは、__FILE__マクロを調べるしかありません。
しかし、__FILE__マクロは文字列リテラルですので、#ifで判別することはできません。

C++の場合でも、文字列リテラルの内容をテンプレート引数に与えることは出来ませんので、静的な判別は不可能です。
また、仮に出来たとしても、externの有無を切り替える方法はありません(もし、#ifで判別できるのであれば可能)。

コンパイルの前にm4に通せば、__file__マクロをifの中で比較できますので、望みのことができます。
Makefileのルールを少し変えてやるだけで済むので、割と簡単です。


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

Name: 翡翠  ..入門者(4,052ポイント)   Date: 2008/08/29(金) 12:10   No:20642     
Title: Re:コンパイル中のファイル名による分岐    
すみません、ちょっと説明が少なすぎたようです

龍神録プログラミングのやり方では、ファイル名で分岐をしているのではありません
第五章の転載ですが、


#ifdef _GLOBAL_INSTANCE_

#define GLOBAL

#else

#define GLOBAL extern

#endif

GLOBAL int img;


と書かれていますが、これは
「_GLOBAL_INSTANCE_が定義されていればGLOBALという文字は空白に置き換えられる」
「_GLOBAL_INSTANCE_が定義されていなければGLOBALという文字はexternに置き換えられる」
という意味です

そして、


#define _GLOBAL_INSTANCE_


をメインファイルに書き足せば、メインファイルから呼ばれた時は変数の宣言となり、他のファイルから呼ばれた時は extern が付くことになります
より詳しい説明は実際に五章をご覧になって下さい

ええと、質問がファイル名で判別できるか、という問いに対する答えとしては間違っていると思いますが、やりたい事は上記の答えで解決できる……はずです

>たかぎさん
質問が、ファイル名を判別するにはどうすればいいか、ということでしたね
これについては、私の説明不足・認識違いでした
どうもすみませんでした


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

Name: たかぎ [URL]  ..熟練のプログラマー(56,358ポイント)   Date: 2008/08/29(金) 17:50   No:20656     
Title: Re:コンパイル中のファイル名による分岐    
第五章のGLOBALマクロについては分かっています。

この手の方法は、実際にはあまりお勧めではありません。
グローバル変数は、絶対使うなとまではいいませんが、使うかどうかは慎重に検討する必要があります。
そのためには、あえて記述を面倒にしておいた方が得策だったりします。


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



Name: ちょっぱー  ..ぴよぴよ(256ポイント)   Date: 2008/08/27(水) 18:24   No:20559       
Title: テキストファイルの比較    
はじめまして!
C言語を始めて一か月なのですが、今、2つのテキストファイルを読み込んで、内容を比較し、一致しているようならsuccess, 間違っているなら間違っている箇所を出力するプログラムを作成しています。
ソースコードは以下の通りです。


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

FILE *f_in, *f_out ;

int main(void){
char str_in[10];
char str_out[10];
int i, cmp ;

f_in = fopen ("file1.txt", "r");
f_out = fopen ("file2.txt", "r");

if ( f_in == NULL || f_out == NULL){
printf( "Can't open file.\n" );
return 0 ;
}

while ( (fgets( str_in, 10, f_in )) != NULL && (fgets( str_out, 10, f_out )) != NULL)) {
str_in[strlen(str_in) - 1] = 0 ;
str_out[strlen(str_out) - 1] = 0 ;
for (i=0; i < strlen(str_in) && i < strlen(str_out) ; i++) {
cmp = strcmp(str_in, str_out) ;
if (cmp == 0) {
printf ( "success.\n" ) ;
return 0 ;
}
else {
printf ( "fail.\n" ) ;
printf ( "%s and %s are mismatched.\n", str_in, str_out ) ;
return 0 ;
}
fclose( f_in );
fclose( f_out );
}
return 0 ;
}

仮にfile1.txtが


34
であり、file2.txtが



であったとすると、このプログラムを実行すると、テキストファイルが違うにも関わらず
success.
と表示されてしまいます。
(ほんとは
fail.
34 and 6 are mismatched.
と出力されてほしいのです。)
恐らく1行目しか評価されていないことが原因だと思うのですが、すべての行でstrcmpを行うにはどうしたらよいかわからず途方に暮れております。なにかよい知恵やソースコードを見て気づいたこと等ありましたら、ご教授ください。
よろしくお願いいたします。


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


Name: 御津凪 [URL]  ..入門者(4,432ポイント)   Date: 2008/08/27(水) 18:50   No:20562     
Title: Re:テキストファイルの比較    
(不一致=エラーと解釈してください)
エラーが発生したかどうかのフラグを用意し、

strcmp での条件のところで、
・一致していたら次の行へ
・違っていたらエラー内容を出力し、エラーフラグを立てる
とします。

そして、全ての行をチェックし終えたときに、
エラーフラグをチェックし、フラグが立っていなければ
"success."を出力すればいいと思います。

エラーフラグをエラー回数に直せば、エラーが発生した数が分かりますし、
行番号の変数を用意(1行目から始まるので1で初期化)し、毎ループ +1 していけば、
エラーが発生した行番号を特定できますよ。

それともう一つ。
このコードだと、一致している2つのテキストファイルの片方に行を追加した場合、
エラーが出ず、"success."が出力されてしまいます。

ファイルが双方とも終端に達しているかのチェックも入れたほうがいいと思います。


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

Name: Mist  ..上級者(20,903ポイント)   Date: 2008/08/27(水) 18:52   No:20563     
Title: Re:テキストファイルの比較    
fgetsの理解が間違っているとおもいます。
fgetsは改行(\n)に出会うと読むのをやめるので
> fgets( str_in, 10, f_in )
では一行ずつしか読めません。
なので、中のforは無意味です。

あと、whileやforを使っているけどforの中のif〜elseでどちらにいっても必ずreturnされているので、繰り返されることが無いです。
fcloseも実行されないので開きっぱなしです。

以下のようにすればよいのではないでしょうか。


ミスマッチフラグ=OFF
while(両方のファイルから1行ずつ読む) {
  文字列を比較する
  if (不一致) {
   ミスマッチと出力する
   ミスマッチフラグ=ON
   ループを抜ける(break)
  }
}
if (ミスマッチフラグ=OFF) {
 サクセスと出力
}

ファイルクローズ
</pre>





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

Name: box  ..ハッカー(124,192ポイント)   Date: 2008/08/27(水) 18:58   No:20565     
Title: Re:テキストファイルの比較    
> ソースコードは以下の通りです。

インデントにポリシーが感じられなくて見づらいです。
それから、提示のコードをそのままコンパイルするとエラーが出ます。
Borland C++ Compilerでコンパイルしたときのエラーメッセージを提示します。


エラー E2188 D:\My Programs\C\temp1\temp1.c 20: 式の構文エラー(関数 main )
エラー E2134 D:\My Programs\C\temp1\temp1.c 38: 複合文に } がない(関数 main )
警告 W8070 D:\My Programs\C\temp1\temp1.c 38: 関数は値を返すべき(関数 main )
警告 W8080 D:\My Programs\C\temp1\temp1.c 38: 宣言された 'cmp' は使われていない(関数 main )
*** コンパイル中に 2 個のエラーが発生しました ***


というわけで、実行できたときのソースコードをそのまま見せてください。


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

Name: ちょっぱー  ..ぴよぴよ(712ポイント)   Date: 2008/08/28(木) 04:21   No:20573     
Title: Re:テキストファイルの比較    
>御津凪様、Mist様

ありがとうございます.
おっしゃられた方法で少し試してみます.

>box様

申し訳ありません.コンパイル時のファイルは以下の通りです.
(ヘッダーは省略してあります.)


FILE *f_in, *f_out;

int main(void) {
char str_in[10];
char str_out[10];
int i ;/*for*/
int cmp;

f_in = fopen ( "abc.txt","r" ) ;
f_out = fopen ( "123.txt", "r" );

if (f_in == 0 || f_out == 0 ) {
printf( "Unable to open file.\n" ) ;
return 0;
}

if (f_in == 0 || f_out == 0 ) {
printf( "Unable to open file.\n" ) ;
return 0;
}

while ((fgets( str_in, 10, f_in )) != NULL && (fgets( str_out, 10, f_out )) != NULL) {
str_in[strlen(str_in) - 1] = 0 ;
str_out[strlen(str_out) - 1] = 0 ;

for (i=0; i < strlen(str_in) && i < strlen(str_out) ; i++) {
cmp = strcmp(str_in, str_out) ;
if (cmp == 0) {
printf ( "success.\n" ) ;
return 0 ;
}
else {
printf ( "fail.\n" ) ;
printf ( "%s and %s are mismatched.\n", str_in, str_out ) ;
return 0 ;
}
}
}
fclose( f_in );
fclose( f_out );
return 0 ;
}


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

Name: non  ..ぴよぴよ(995ポイント)   Date: 2008/08/28(木) 08:55   No:20575     
Title: Re:テキストファイルの比較    
str_in[strlen(str_in) - 1] = 0 ;
str_out[strlen(str_out) - 1] = 0 ;

fgetsは自動的に'\0'を最後につけてくれますが、そのためのものでしょうか?
でも、strlen(str_in) - 1 なのはなぜ?




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

Name: non  ..ぴよぴよ(910ポイント)   Date: 2008/08/28(木) 08:59   No:20576     
Title: Re:テキストファイルの比較    
strlen(str_in) - 1 なのはなぜ?
fgets って、改行文字が最後に付くのですね。わかりました。
改行文字まで、比較してもかまわないから、やっぱり、この2行はいらないのでは?


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

Name: 通りすがりの者  ..ぴよぴよ(498ポイント)   Date: 2008/08/28(木) 10:35   No:20582     
Title: Re:テキストファイルの比較    
 

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

Name: ちょっぱー  ..かけだし(1,314ポイント)   Date: 2008/08/28(木) 11:43   No:20592     
Title: Re:テキストファイルの比較    
数々のアドバイスまことにありがとうございます。
皆様のご意見を参考にしまして、以下のソースコードに変更しました。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN (10)

FILE *f_in, *f_out ;

int main(void) {
char str_in[LEN], str_out[LEN] , *p, *q ;
int i, cmp, num , err_flag;
num = 1 ;

f_in = fopen ( "abc.txt", "r" ) ;
f_out = fopen ( "123.txt", "r" );

if (f_in == NULL || f_out == NULL ) {
printf( "Unable to open file.\n" ) ;
exit(2) ;
}

err_flag = 0 ;

while ( (p = fgets(str_in, LEN, f_in)) != NULL && (q = fgets(str_out, LEN, f_out)) != NULL) {
       ++num ;
    str_in[strlen(str_in) - 1] = 0 ;
       str_out[strlen(str_out) - 1] = 0 ;
       cmp = strcmp(str_in, str_out) ;

if ( cmp != 0) {
printf ( "failed:%s and %s in line%d are mismatched.\n", str_in , str_out , num ) ;
err_flag = 1;
}
}

if ( err_flag == 0) {
if ( p == NULL && q == NULL ) {
printf ("success.\n") ;
}
else{
printf ( "number of lines is different.\n" ) ;
}
}
fclose( f_in );
fclose( f_out );
return 0 ;
}

abc.txtを
FB5502
555500
555500
555500
55D500
とし、123.txtを
FB5502
555500
555500
555500
55D500
と同じファイルの状態にしてコンパイルしたところ、

failed:55D500 and 55D50 in line6 are mismatched.

と出力されてしまいました...
現状の私の知識ではソースコードによるものなのか、他の要因によるものなのかわからず、苦戦しております。
原因のわかる方いらっしゃいましたら、ヒントなどいただけないでしょうか?
よろしくお願いします。


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

Name: 御津凪 [URL]  ..初心者(5,065ポイント)   Date: 2008/08/28(木) 11:57   No:20595     
Title: Re:テキストファイルの比較    
片方のファイルの終端に改行がないことが原因ではないでしょうか?
改行で終わらないファイルの場合、最後に改行がつかないため、
改行を削除する処理の部分で最後の文字を消してしまいます。

削除する文字が本当に改行文字なのかを確認してから削除するといいと思います。


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

Name: Mist  ..上級者(21,134ポイント)   Date: 2008/08/28(木) 12:08   No:20596     
Title: Re:テキストファイルの比較    
提示してもらったソースコードを私の環境(BCC)でコンパイルして実行してみましたが、
number of lines is different.
と表示されました。
最後の行で失敗しているようなので、予想になりますが片方は

55D500(改行)
[EOF]

で、もう一方は

55D500[EOF]

となっていませんか?
この場合

str_in[strlen(str_in) - 1] = 0 ;
str_out[strlen(str_out) - 1] = 0 ;

この部分が影響して不一致になります。

あと、今の現象には関係ないですがnumを1で初期化するのは間違いです。
whileに入った直後に++numとしているので、1行目が不一致でも2と表示されます。


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

Name: box  ..ハッカー(124,529ポイント)   Date: 2008/08/28(木) 13:17   No:20605     
Title: Re:テキストファイルの比較    

仮に、2つの入力ファイルの内容が最後の改行も含めて全く同一であるとします。
このとき、

> while ( (p = fgets(str_in, LEN, f_in)) != NULL && (q = fgets(str_out, LEN, f_out)) != NULL) {

ここを最後に実行すると、p が NULL になった時点で
(q = fgets(str_out, LEN, f_out)) != NULL
を実行・評価しません。&& 条件とは、そういうものです。
つまり、p は NULL ですが、q は NULL ではない状態です。
したがって、

> if ( err_flag == 0) {
> if ( p == NULL && q == NULL ) {

この条件を満たしませんので、

> printf ( "number of lines is different.\n" ) ;

こちらを出力します。

いいところまで進んでいますが、あと一工夫必要です。



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

Name: ちょっぱー  ..かけだし(1,582ポイント)   Date: 2008/08/29(金) 10:47   No:20634     
Title: Re:テキストファイルの比較    
皆様、ご意見ありがとうございます.
ご指摘の通り、EOFの場所の違いだったようです.
また、&&の順序については恥ずかしながらはじめて知りました.
勉強になります.
しかし、そうしますとこれでは常に行数が違うと表示されてしまいますね…

勉強不足で大変申し訳ないのですが、p=NULLとなったときの処理についてはfeof()を用いて、abc.txtと123.txtの読み込みが完了したフラグを認識してから

if ( err_flag == 0) {
if ( p == NULL && q == NULL ) {
printf ("success.\n") ;
}
else{
printf ( "number of lines is different.\n" ) ;
}
}

の部分を評価すればよいと今考えているのですが、どうもうまくいきません.
この考え方は間違っていますでしょうか?
もし間違っているようなら、何か解決策のヒントをいただけると幸いです.
よろしくお願いいたします.







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

Name: 御津凪 [URL]  ..初心者(5,851ポイント)   Date: 2008/08/29(金) 11:11   No:20637     
Title: Re:テキストファイルの比較    
box さんのおっしゃった、 && の問題があるので、

> while ( (p = fgets(str_in, LEN, f_in)) != NULL && (q = fgets(str_out, LEN, f_out)) != NULL){

上記の部分の条件文を、

p = fgets(str_in, LEN, f_in);
q = fgets(str_out, LEN, f_out);
while ( p != NULL && q != NULL ){

として、両方のファイルを必ず読み込むようにしていますか?
両方とも読み込んでから評価しないと、 && の性質で最初の方(str_in)しか読み出しません。


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

Name: ちょっぱー  ..かけだし(1,928ポイント)   Date: 2008/08/29(金) 12:03   No:20641     
Title: Re:テキストファイルの比較    
>御津凪様

上記のソースファイルにおいて、while文周辺のみを

p = fgets(str_in, LEN, f_in) ;
   q = fgets(str_out, LEN, f_out) ;
str_in[strlen(str_in) - 1] = 0 ;
str_out[strlen(str_out) - 1] = 0 ;

err_flag = 0 ;

while ( p != NULL && q != NULL) {
++num ;
cmp = strcmp(str_in, str_out) ;
if ( cmp != 0) {
printf ( "failed : %s and %s in line%d are mismatched.\n", str_in , str_out , num ) ;
err_flag = 1;
}
break ;
}

のように書き換えて、コンパイルしたのですが、結果が何も変わらなかったため、方針を変えた次第です.
このソースコードは正しいでしょうか…?


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

Name: 御津凪 [URL]  ..初心者(6,455ポイント)   Date: 2008/08/29(金) 12:24   No:20645     
Title: Re:テキストファイルの比較    
すいません、コード間違えていました。

p = fgets(str_in, LEN, f_in);
q = fgets(str_out, LEN, f_out);
while ( p != NULL && q != NULL ){

このままだと、読み込み処理が一回しかされません。

while((p = fgets(str_in, LEN, f_in)) != (q = fgets(str_out, LEN, f_out)))

とすればいいです。
(str_in と str_out が同じ配列でない限り、 false になるのは両方とも NULL の時だけ)
これで両方 NULL の時に "success." と出せるはずです。


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

Name: ちょっぱー  ..かけだし(2,052ポイント)   Date: 2008/08/29(金) 16:25   No:20655 解決!     
Title: Re:テキストファイルの比較    
おっしゃる通りに変更したら、うまくいきました!

皆様からのご助言・ご意見は勉強になるものばかりで、今後の励みにもなりました。
恐らく今後もいくつかの壁にあたると思うので、その際はまた勉強させてください。

どうもありがとうございましたm(_ _)m


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



Name: dpbut  ..ぴよぴよ(151ポイント)   Date: 2008/08/28(木) 18:15   No:20617       
Title: 描画    
DirectXで扇形を描画する質問です。
60度の角度で上方向に扇形を描画さしたいのですが(円弧の方が上)
開始地点は275から半径50の扇形を描画さしたいのですが
pD3Device->SetTexture(0, pTexture[0]);
pt[0].x = 250.0f;
pt[1].x = 300.0f;
pt[3].x = 275.0f;
pt[2].x = 275.0f;

pt[0].y = 225.0f;
pt[1].y = 225.0f;
pt[2].y = 275.0f;
pt[3].y = 275.0f;

pt[0].tu = pt[3].tu = 0.0f  / 1024;
pt[1].tu = pt[2].tu = 200.0f / 1024;
pt[0].tv = pt[1].tv = 0.0f  / 1024;
pt[2].tv = pt[3].tv = 200.0f / 1024;

pD3Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pt,sizeof(CUSTOMVERTEX));

このままでは、斜面が50の三角形ができただけで・・・
pt[0].xとpt[1].xは、ただ単に50とゆうだけで角度で表していないので場所は変わるかと思いますがpt[2].xとpt[3].xは275から開始でお願いします。
これを扇形にしたいのですが、どなたかご教示ください。お願いします。


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


Name: 御津凪 [URL]  ..初心者(5,919ポイント)   Date: 2008/08/28(木) 18:34   No:20618     
Title: Re:描画    
D3DPT_TRIANGLEFAN は、最初の頂点を基点にポリゴンを表示していくので、
pt[0] を275とし、それ以降の頂点を正多角形の点のように円状に配置していくと実現できます。

きれいな円弧の扇形を作るには、頂点がたくさん必要になりますので注意してください。

ちなみに上記のコードではpt[2]とpt[3]が同じ場所にあるので、二つ目のポリゴンが表示されません。


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

Name: dpbut  ..ぴよぴよ(173ポイント)   Date: 2008/08/29(金) 00:53   No:20624     
Title: Re:描画    
そうですか・・・
頂点をたくさんですか
角度計算とかで描画できそうに思えたのですが、
他の方法とかできれいな扇形で描画する方法とかないでしょうか?


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

Name: 御津凪 [URL]  ..初心者(5,738ポイント)   Date: 2008/08/29(金) 10:25   No:20633     
Title: Re:描画    
ポリゴンの当たり判定などを考慮しないのであれば、
単純に扇形で外側が透明の画像を板ポリゴンに貼り付ける方法があります。

既にテクスチャが使用されているようなので、そのテクスチャに上記の方法を適用するか、
テクスチャステージステートを使って、二つのテクスチャを使って表示するという方法があります。

一応、頂点をたくさんといっても、
半径50の扇形の場合、大きさにもよりますが、26(始点含む)個の頂点を用意すれば、大体円弧に見えます。
頂点・UVの位置を角度計算すれば、円状に配置できます。


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



Name: 白宮  ..ぴよぴよ(107ポイント)   Date: 2008/08/28(木) 12:10   No:20597       
Title: 一歩目…    
こんにちは。私はゲーム作りに興味があり、Cを勉強しようと思っている者なのですが、プログラミングにしてもCやらC♯やらCCやらVisualBasicやらなんだとかで、それぞれの違いも判らないしどれから手を付ければいいのか判りません。詳しい知人に聞くとCが一番いいらしいそうですが、一体何が違うんですか?よかったらこの凡夫に教えていただけたら幸いです。

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


Name: Mist  ..上級者(21,001ポイント)   Date: 2008/08/28(木) 12:22   No:20598     
Title: Re:一歩目…    
http://www5f.biglobe.ne.jp/~kenmo/program/gengo/gengo.html

書かれている内容は少し古いですがよくまとめられたページです。
参考にしてください。
書かれていないものとしてはC/C++&DXライブラリがありますが、それについてはこのサイトのゲームプログラミングの館等を見られるのが一番かと思います。


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

Name: バグ  ..ハッカー(104,666ポイント)   Date: 2008/08/28(木) 12:23   No:20599     
Title: Re:一歩目…    
正直、どの言語も長所もあれば、短所もあります。
ただし、C言語をある程度理解していれば、他の言語を勉強したくなったとしても理解が早いと思います。


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

Name: バグ  ..ハッカー(104,708ポイント)   Date: 2008/08/28(木) 12:25   No:20600     
Title: Re:一歩目…    
個人的にはC#の難易度は、3くらいかなぁ…とか思ったのですが…。
まぁ、その辺りは個人の嗜好にもよりますね(苦笑)


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

Name: 白宮  ..ぴよぴよ(160ポイント)   Date: 2008/08/28(木) 14:32   No:20608 解決!     
Title: Re:一歩目…    
なるほど。親切な回答有難う御座います。じゃあCからはじめてみようと思います。
また判らないことがあったら質問しますので、そのときはよろしくお願いしますね。


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



Name: jyun  ..ぴよぴよ(984ポイント)   Date: 2008/08/27(水) 18:39   No:20561       
Title: メモリリークが発生します。    
ODBCを使用して抽出系SQLを発行し、結果を返却する関数を作成したのですが、
呼び出すたびにプログラムのメモリ消費量が上がり続けてしまいます。

実際のコードは別関数にてConnectとCloseがあり、Closeでは
SQLDisconnect( hdbc );
SQLFreeHandle( SQL_HANDLE_DBC, (SQLHANDLE)hdbc );
SQLFreeHandle( SQL_HANDLE_ENV, (SQLHANDLE)henv );
とコールして、解放しています。

プログラムは常駐型ですので、メモリリークするとまともに動かなくなってしまうので、
どうしても解消したいと考えています。
よろしくお願いします。

以下、見難いですがソースです。


// ユーザ定義型
typedef map<string, string> mapstr;
typedef vector<mapstr> vmap;

/*
* 関数名 : execSelect
* 処理概要: map<string, string>のvectorの抽出結果を返す。
*/
vmap execSelect(char* chrSelect){

RETCODE rc;
mapstr mapRet;
vmap vmapRet;
vector<string> colinfo;
vector<char> buff;
SQLHSTMT hstmt;

rc = SQLAllocStmt(hdbc, &hstmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
return vmapRet;
}
SQLSMALLINT sintcols = 0;

char colname[128+1]; // カラム名
SQLSMALLINT colnamelen = 0; // カラム名の文字数
SQLSMALLINT coltype = 0; // データの型
SQLUINTEGER collen; // このカラムの領域サイズ(バイト単位)
SQLSMALLINT scale = 0; // たとえば,NUMERIC(10,3)なら, 3が入る。使われないことも多い
SQLSMALLINT nullable = 0; // NULLが可能かどうか

rc = SQLPrepare(hstmt, (SQLCHAR*)chrSelect, SQL_NTS);
rc = SQLExecute(hstmt);

SQLNumResultCols( hstmt, &sintcols);
for (int intcnt = 0; intcnt < sintcols; intcnt++) {
SQLDescribeCol(hstmt, (UWORD)(intcnt + 1), (SQLCHAR*)colname, (SWORD)sizeof(colname), &colnamelen, &coltype, &collen, &scale, &nullable);
colname[128] = '\0';
colinfo.push_back(string(colname));
}

for (rc=SQLFetch(hstmt); rc == SQL_SUCCESS; rc=SQLFetch(hstmt)) {
SQLINTEGER rbufsize = 0;
for ( int i = 0; (size_t)i < colinfo.size(); i++ ) {
buff.resize(128);
rc = SQLGetData( hstmt, i+1, SQL_C_CHAR, &buff[0], (SQLINTEGER)buff.size(), &rbufsize);
if ( rbufsize > (SQLINTEGER)buff.size() && rc == 1 ) {
buff.clear();
buff.resize(rbufsize);
rc = SQLGetData( hstmt, i+1, SQL_C_CHAR, &buff[0], (SQLINTEGER)buff.size(), &rbufsize);
}
if ( rbufsize < 0 ) {
// NULL は空文字にする
buff[0] = '\0';
rbufsize = 1;
}
mapRet[colinfo[i]] = string(buff.begin(), buff.begin() + rbufsize);
}
vmapRet.push_back(mapRet);
mapRet.clear();
}

// メモリの開放
SQLFreeStmt(hstmt, SQL_DROP);
return vmapRet;
}



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


Name: jyun  ..かけだし(1,072ポイント)   Date: 2008/08/27(水) 18:56   No:20564     
Title: Re:メモリリークが発生します。    
呼び元を書くのを忘れていました。

上記のソースはクラス化されており、
呼出元クラスのコンストラクタでnewしてデストラクタでdeleteしています。

メインは処理要求が発生するたびにスレッドを作成し、
作成されたスレッドが上述の呼出元クラスをnewし、処理が終わるとdeleteしています。

よろしくお願いします。


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

Name: jyun  ..かけだし(1,125ポイント)   Date: 2008/08/28(木) 13:38   No:20606 解決!     
Title: Re:メモリリークが発生します。    
自己解決しました。

抽出系SQLの場合でも最後にトランザクションの終了が必要みたいでした。
コミットを発行して終了するようにしたら解放されました。


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



Name: 初心者  ..初心者(7,864ポイント)   Date: 2008/08/24(日) 19:23   No:20507       
Title: 株の売買シミュレーションです。    
file3.cというファイルから、終値の移動平均(3日)を求めたいのですが、できなかったのでプログラムの作成をよろしくお願いします。

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


Name: バグ  ..ハッカー(104,456ポイント)   Date: 2008/08/24(日) 19:40   No:20508     
Title: Re:株の売買シミュレーションです。    
課題の丸投げは禁止ですよ。
あ、作成依頼という事はプロの方への仕事の依頼ですか?ここには何人かいらっしゃるので、見積りを請求されてはいかがでしょうか?


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

Name: 初心者  ..初心者(7,887ポイント)   Date: 2008/08/24(日) 19:46   No:20509     
Title: Re:株の売買シミュレーションです。    
二日考えてできませんでした。
ヒントでもいいので、よろしくお願いします。


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

Name: 木霊  ..中級者(13,883ポイント)   Date: 2008/08/24(日) 20:34   No:20510     
Title: Re:株の売買シミュレーションです。    
移動平均の計算方法は知っていますか?

3日の平均ということなので
(1日目の終値+2日目の終値+3日目の終値)÷3
だけで求まります
あとはこれを1日ずつずらしていき、求まった値をつなぐ(株価チャートに書き加える)だけです
プログラムしやすいように言い直すと、

(「基準の日」の終値+ 「基準の日+1日」の終値 +「基準の日+2日」の終値)÷日数
です
ある日の平均線を求めるにはfor文が使えそうですね
それを日数分なのでfor文を入れ子にしたら・・・
仮に1000日分のデータがあったとしたら、移動平均を求められるのは3日目〜1000日目だけです


P.S.

移動平均線は中・長期線と短期線との交差で判断するものだったと思います
中・長期線が25日、短期線が5日ぐらいですかね(デイトレードの場合)
でもデイトレードするなら他の指標の方がいいと思いますよ
あと、投資は自己の判断と責任で行ってください


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

Name: てきとう  ..ぴよぴよ(98ポイント)   Date: 2008/08/28(木) 12:54   No:20603     
Title: Re:株の売買シミュレーションです。    
nt KEND[100];//終値
int KAVR[100];//平均線

void AVR(int D){ //Dは何日平均か
int i,a;
for(i=0;i<100-D;i++){
a=KEND[i]+KEND[i+1]+KEND[i+2]; //3日分足して
KAVR[i]=a/D; //3で割る
}
}
昔、作ったことがあるが、どこかへいってしまった


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



Name: 西村  ..入門者(4,935ポイント)   Date: 2008/08/28(木) 11:02   No:20584       
Title: 二点間の角度    
 を、計算するプログラムを作る練習をしていたのですが、何故かしらコンパイラは通るのにいざ実行すると一つ目の座標のxを入力する段で『問題が発生したため終了します』とパソコンから言われて実行出来ません。これは僕のプログラムに欠陥があるからなのか、パソコンがおかしいのか、どちらなのでしょうか?とりあえず、以下がプログラムの内容です。


#include <stdio.h>
#include <math.h>

typedef struct{
double x;
double y;
}Pos;

int main(void){

Pos pos1, pos2;
double ta, rad, dir;

puts("座標を二つ入力してください");
printf("X1:"); scanf("%lf", pos1.x);
printf("Y1:"); scanf("%lf", pos1.y);
printf("X2:"); scanf("%lf", pos2.x);
printf("Y2:"); scanf("%lf", pos2.y);

ta = sqrt((pos1.y - pos2.y) * (pos1.y - pos2.y)) / sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x));
rad = atan(ta);
dir = rad / (3.14159265358979 * 180.0);

printf("二点間の角度は%fです", dir);

return(0);
}


 あと、角度の出し方自体も色々サイトを見ながら作ったのですが、不安なのでそちらのほうも出来ればお願いします。
 最近雷ばっかりでパソコンつけるの恐いです…


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


Name: toyo  ..上級者(16,366ポイント)   Date: 2008/08/28(木) 11:10   No:20585     
Title: Re:二点間の角度    
scanfの引数はポインタになります。
scanf("%lf", pos1.x);

scanf("%lf", &pos1.x);
ですね
以下同様


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

Name: 御津凪 [URL]  ..入門者(4,933ポイント)   Date: 2008/08/28(木) 11:17   No:20586     
Title: Re:二点間の角度    
角度の出し方はたしか、

rad = atan2(pos2.y - pos1.y,pos2.x - pos1.x);

でも、角度が出せたかと思います。
(こちらの方が平方根を使わないので処理は早いはず)


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

Name: box  ..ハッカー(124,346ポイント)   Date: 2008/08/28(木) 11:18   No:20587     
Title: Re:二点間の角度    

> ta = sqrt((pos1.y - pos2.y) * (pos1.y - pos2.y)) / sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x));

分子・分母とも、「2乗して平方根を計算」していますが、
意味がありますか?
単に、

ta = (pos1.y - pos2.y) / (pos1.x - pos2.x);

ではダメでしょうか?
なお、分子がゼロ(つまり、2点のx座標が同じ)の場合を
考慮する必要があります。



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

Name: toyo  ..上級者(16,464ポイント)   Date: 2008/08/28(木) 11:19   No:20588     
Title: Re:二点間の角度    
sqrt((pos1.y - pos2.y) * (pos1.y - pos2.y))

(pos1.y - pos2.y)
と同じ値になります。
dir = rad / (3.14159265358979 * 180.0);

dir = rad * 180.0 / 3.14159265358979;
です


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

Name: toyo  ..上級者(16,519ポイント)   Date: 2008/08/28(木) 11:21   No:20589     
Title: Re:二点間の角度    
>sqrt((pos1.y - pos2.y) * (pos1.y - pos2.y))
>は
>(pos1.y - pos2.y)
>と同じ値になります。

同じじゃないですね
絶対値になります。


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

Name: 西村  ..入門者(4,954ポイント)   Date: 2008/08/28(木) 11:53   No:20594 解決!     
Title: Re:二点間の角度    
 皆様素早い返答ありがとうございます。

> rad = atan2(pos2.y - pos1.y,pos2.x - pos1.x);

 知りませんでした…早速導入させていただきました。

> ta = (pos1.y - pos2.y) / (pos1.x - pos2.x);
> ではダメでしょうか?

 長さなので負にならないように…と考えたのですが、よくよく考えれば無意味ですね…

何にしろ、無事に出せるようになりました。ありがとうございました!


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



Name: tkmakwins15 [URL]  ..比類無きプログラマー(85,201ポイント)   Date: 2008/08/21(木) 14:17   No:20385       
Title: リバーシゲームを作ってみました。    
暇だったんで作ってみました。

https://www.webfile.jp/dl.php?i=388372&s=5c5761d0fec348a882d8

からダウンロードできます。


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


Name: 管理人 [URL]  ..伝説のハッカー(698,530ポイント)   Date: 2008/08/21(木) 15:20   No:20387     
Title: Re:リバーシゲームを作ってみました。    
おぉ、素晴らしい。
この敵のアルゴリズムはどうやって計算されてるんですか?


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(85,758ポイント)   Date: 2008/08/21(木) 15:31   No:20389     
Title: Re:リバーシゲームを作ってみました。    
単純にその場で一番多く取れる場所を選択しているだけです。
もっと強くしようと思ったら、これをいくらか繰り返して、先読みするという方法が考えられるのですが、複雑すぎると大変だなぁと思って、一番楽なアルゴリズムを実装しました。

描画にはDxライブラリを使っています。

ソースコードをアップします。(まぁしかしこんな汚いコードをよく公開する気になるな。っ手ほど汚いですが…)


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

Name: 管理人 [URL]  ..伝説のハッカー(698,641ポイント)   Date: 2008/08/21(木) 15:53   No:20390     
Title: Re:リバーシゲームを作ってみました。    
なるほど、ぷよぷよ作ったときもそんな風にシミュレートしました。
やっぱ適切な方法をとるにはGAみたいなアルゴリズムを組まないといけないんですかねぇ。
連鎖のプログラムはついに解らずに断念しましたし、
AIプログラムってホント難しいですよね。
将棋は未だに勝てないらしいですし、ゲームで一番難しいAIは将棋のAIなのかな?


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(85,884ポイント)   Date: 2008/08/21(木) 16:18   No:20391     
Title: Re:リバーシゲームを作ってみました。    
早速バグ発見です。

https://www.webfile.jp/dl.php?i=388372&s=5c5761d0fec348a882d8

から、修正版をダウンロード出来ます。

ちなみに、ソースコードのうち、「Debugs.cpp」と「Debugs.h」はWindowsプログラムでバグ修正を効率よくやろうと作ったものです。
ご自由に使ってもらっていいですよ。


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

Name: array  ..上級者(19,516ポイント)   Date: 2008/08/21(木) 16:25   No:20392     
Title: Re:リバーシゲームを作ってみました。    
遊ぼうとしたらクリックが反応しませんでした><; 操作手順はクリックで良いんですよね。

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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(85,996ポイント)   Date: 2008/08/21(木) 16:34   No:20393     
Title: Re:リバーシゲームを作ってみました。    
>arrayさん

はい、駒をおきたいところにクリックするだけです。忘れてた、パスは右クリックです。

>管理人さん

Wikipedia コンピュータ将棋

どうなんでしょうか、確実に進化はしているようです。


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

Name: 管理人 [URL]  ..伝説のハッカー(698,566ポイント)   Date: 2008/08/21(木) 16:45   No:20394     
Title: Re:リバーシゲームを作ってみました。    
あぁそれ見ましたよw

>2008年現在ではコンピュータ将棋は、プロの底辺レベルに達したとみなされているものの、プロのトップレベルの実力には依然達していない。

って書いてありますし、プロのトップに勝つにはまだ難しそうですね。


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

Name: KEV  ..入門者(4,142ポイント)   Date: 2008/08/21(木) 17:07   No:20395     
Title: Re:リバーシゲームを作ってみました。    
遊ばせてもらいましたー。
参考になります。
俺オセロよぇぇ…

COMの計算速度が一定なのを見る限り
毎回全部のセルで判定してるのかな。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(86,129ポイント)   Date: 2008/08/21(木) 17:09   No:20396     
Title: Re:リバーシゲームを作ってみました。    
将棋は指せるのは指せるのですが…滅茶苦茶弱いですよ。

しかし弱いなぁ(自分で作っといて!?)…、普通にこんな状態になります。

ちなみに、「オセロ」は商標なんですよね。それで一応避けています。
Wikipedia オセロ
によると、最高性能のオセロAIはすでに正解チャンピオンですらかないません。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(86,178ポイント)   Date: 2008/08/21(木) 17:11   No:20397     
Title: Re:リバーシゲームを作ってみました。    
>KEVさん

COMはわざとウェイトかけてます。こうすれば少し雰囲気出るかな?と思って…
実際に全セル計算してはいますが、それでも全く速度は気になりません。(処理落ちはあまり重視してません。)


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

Name: KEV  ..入門者(4,222ポイント)   Date: 2008/08/21(木) 17:16   No:20398     
Title: Re:リバーシゲームを作ってみました。    
あぁそうだったんですね。
確かにゲームには雰囲気は大事ですよね。

同時に5個以上取られる場合はウェイトを長くするとかにすると
やらしさがアップしそうです(ぇ。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(86,278ポイント)   Date: 2008/08/21(木) 17:23   No:20399     
Title: Re:リバーシゲームを作ってみました。    
ウェイトかけてるのは、もうひとつ理由があって、このウェイトを外すと、プレイヤーがパスした時に、連続パスになってしまうので、ここで調整できるようにしてあります。

ちなみに、角を取る事を意識すれば、だいぶ違いますよ。COMは取れる数の事しか考えません(角を取りにいかない。)から…


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

Name: toyo  ..上級者(16,153ポイント)   Date: 2008/08/21(木) 18:39   No:20403     
Title: Re:リバーシゲームを作ってみました。    
昔ASCIIという雑誌でコンピュータオセロの対決をしてたのを思い出しました
当事から森田さんの作ったプログラムがかなり強かったですね
その後も森田オセロはいろいろなハードで出ましたし
当事はPC88やPC98の時代でしたが今のCPUなら終盤の局面ではかなり手前から総当りの最良手順が計算できるのではないでしょうか
将棋やチェス、オセロのようなゲームを「二人・零和・有限・確定・完全情報・ゲーム」というらしいですがこういうゲームのアルゴリズムにはα-β法というのが有効なようです。


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

Name: nayo  ..入門者(3,126ポイント)   Date: 2008/08/21(木) 19:40   No:20406     
Title: Re:リバーシゲームを作ってみました。    
オセロはコンソール画面でできる簡単なゲームはないかと考えて作りましたね
端から内側へ2番目、四隅の隣の位置におかないように意識するだけで結構勝てるかと思います
ただ序盤は負けてるように見えますけど

しかし敵のアルゴリズムを考えるのは難しいですね


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

Name: Hermit  ..上級者(21,597ポイント)   Date: 2008/08/21(木) 20:00   No:20407     
Title: Re:リバーシゲームを作ってみました。    
DXライブラリを入れていないからでしょうかね?
駒が表示されないんだけど・・・実行方法が変でしょうか?
(デスクトップにおいています)

あと、全部一色になったとき(途中で置く場所がなくなったとき)
勝ち負けの判定は必要だと思います。
まともに勝負しようとすると、必ず全部自分の色になって次が置けなくなるので。

まあ、ゲームと思わず、ソースを見るだけのものであればそれはそれで有りかとも思いますが(^^;

そういえば・・・リバーシとは駒の置き方ちがいません?
(金田はじめちゃん・・・だったっけ? の事件簿では・・・)


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(87,027ポイント)   Date: 2008/08/21(木) 21:01   No:20409     
Title: Re:リバーシゲームを作ってみました。    
>リバーシとは駒の置き方ちがいません?

リバーシは「オセロ」を含むゲームの総称としても使われています。その意味で使っています。

Wikipedia オセロ#オセロとリバーシ

>駒が表示されないんだけど・・・実行方法が変でしょうか?

付属の、「Piece」というフォルダがあるはずですが、それは同じ場所においているでしょうか?
また、Dxライブラリはスタティックリンクなライブラリなので、特にランタイムが必要でもないはずです。(DirectX7が必要ではあります。)

>あと、全部一色になったとき(途中で置く場所がなくなったとき)
>勝ち負けの判定は必要だと思います。
>まともに勝負しようとすると、必ず全部自分の色になって次が置けなくなるので。

パスすると、COMもパスをするはずなので、それで勝負が決まるはずです。

>まあ、ゲームと思わず、ソースを見るだけのものであればそれはそれで有りかとも思いますが(^^;

…?? どういうことでしょうか?


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

Name: Hermit  ..上級者(21,806ポイント)   Date: 2008/08/21(木) 21:28   No:20410     
Title: Re:リバーシゲームを作ってみました。    
パスが必要だったんですね。失礼しました。

で、フォルダーの状態ですが、

ls した状態ですと、

C:\Users\usr.usr-PC.000\Desktop\Reversi>ls -R
.:
Log.txt Piece Readme.txt Reversi.exe

./Piece:
Brack.bmp Thumbs.db White.bmp

の様になります。
OS は Windows Vista Home Premium

>…?? どういうことでしょうか?
バグ出しの為のアップかなと思ったということです。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(87,232ポイント)   Date: 2008/08/22(金) 10:08   No:20434     
Title: Re:リバーシゲームを作ってみました。    
>バグ出しの為のアップかなと思ったということです。

まぁこのゲーム自体は本格的な開発ではありませんし、話のネタにでもなるかな〜、と思って作ったものですから…

>OS は Windows Vista Home Premium

VistaではDxライブラリは最新版である必要があるみたいです。出来ればデスクトップ以外のところに置いたほうがいいとは思うのですが…

https://www.webfile.jp/dl.php?i=388372&s=5c5761d0fec348a882d8

とりあえず、最新版のダウンロードをしてみてください。


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

Name: lbfuvab  ..入門者(3,984ポイント)   Date: 2008/08/22(金) 16:12   No:20440     
Title: Re:リバーシゲームを作ってみました。    
う〜ん、リバーシのAIは見た事ないですが
チェスならオープンソースなのがいくつかありますね。
ex) GNU chess , Crafty


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

Name: kusites  ..ぴよぴよ(2ポイント)   Date: 2008/08/22(金) 16:57   No:20441     
Title: Re:リバーシゲームを作ってみました。    
kusites

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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(87,238ポイント)   Date: 2008/08/22(金) 17:19   No:20445     
Title: Re:リバーシゲームを作ってみました。    
>リバーシのAIは見た事ないですが
>チェスならオープンソースなのがいくつかありますね。

ゲーム自体はオセロに準じています、商標の問題でリバーシという名称を使用しています。
しかし、僕のはたぶん最弱のAIでしょう。だって取れる駒の数しか考えないんですから…(なぜ角を取らない!?)

ただ…、この最弱のAIに駒の全取りを一度もしたことがないんですよ、どんだけ弱いんだろう…


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

Name: lbfuvab  ..入門者(4,040ポイント)   Date: 2008/08/22(金) 21:26   No:20451     
Title: Re:リバーシゲームを作ってみました。    
AI作成の助けになるようなサイトを発見しました。
http://hitsujiai.blog48.fc2.com/blog-entry-26.html
なかなか斬新です。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(87,336ポイント)   Date: 2008/08/23(土) 01:27   No:20457     
Title: Re:リバーシゲームを作ってみました。    
確かに、僕のは評価関数なる手法をとってませんからねぇ、弱いのも当然です。

逆に、このAIに対してどこまで滅多打ちできるかというのが僕としては気になります。(こんな弱小オセロマシンにパーフェクトで勝ってみたい。)


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

Name: 組木紙織  ..熟練のプログラマー(59,701ポイント)   Date: 2008/08/25(月) 21:46   No:20528     
Title: Re:リバーシゲームを作ってみました。    
以前私が作ったリバーシです。
AIの判定は確か順番に取れるかどうか確認をして行って一番最初に取れるところに置いています。
うまくやればパーフェクトで勝てます。

C++ Windows SDKで作っています。






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

Name: array  ..上級者(20,119ポイント)   Date: 2008/08/25(月) 22:29   No:20529     
Title: Re:リバーシゲームを作ってみました。    
>組木紙織さん

遊ばせてもらいました。

なんか凄い致命的そうなバグが・・・・(多分

取れる位置なら相手の駒の上にも置けちゃうのですが(笑

途中で全部黒にしてやりました^^


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

Name: 組木紙織  ..熟練のプログラマー(59,710ポイント)   Date: 2008/08/26(火) 07:07   No:20530     
Title: Re:リバーシゲームを作ってみました。    
それ多分仕様です。(笑)
気になるのなら、
ソースコードもあったと思うので、自由に改造してくれて構いません。
なんならAIを強くしてもらっても。

何せ一年以上前のことなので、どんな設計にしたかとか、どこまで完成させたとか一切忘れています。




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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,501ポイント)   Date: 2008/08/26(火) 11:02   No:20532     
Title: Re:リバーシゲームを作ってみました。    
遊ばせてもらいました。

一応勝てるんですけど、全くパーフェクトなんて程遠い状態です。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,835ポイント)   Date: 2008/08/26(火) 13:52   No:20537     
Title: Re:リバーシゲームを作ってみました。    
さっきやってみたらパーフェクトでした。


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

Name: GPGA  ..熟練のプログラマー(49,666ポイント)   Date: 2008/08/26(火) 15:31   No:20538     
Title: Re:リバーシゲームを作ってみました。    
同じくパーフェクトいただきました。
ところで、相手の駒を全部埋めた時点をパーエフェクトと言っていいんですかね?

マスをすべて埋めると同時に相手の駒をすべて埋めるのをパーフェクトと呼ばれると
かなり難しいですね。


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

Name: バグ  ..ハッカー(104,477ポイント)   Date: 2008/08/27(水) 18:18   No:20557     
Title: Re:リバーシゲームを作ってみました。    
DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)

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

Name: バグ  ..ハッカー(104,498ポイント)   Date: 2008/08/27(水) 18:19   No:20558     
Title: Re:リバーシゲームを作ってみました。    
それから、コンソール版とかも(笑)

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

Name: Hermit  ..上級者(21,912ポイント)   Date: 2008/08/27(水) 20:28   No:20567     
Title: Re:リバーシゲームを作ってみました。    
最新版、Vista のデスクトップに置いても、表示は良いようです。

報告遅れてすいません。
ちょっと、ジュニアオリンピックの役員研修で大阪に出かけていたもので。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,635ポイント)   Date: 2008/08/28(木) 00:47   No:20571     
Title: Re:リバーシゲームを作ってみました。    
>最新版、Vista のデスクトップに置いても、表示は良いようです。

報告ありがとうございます。とりあえずバグはなし、ということでよさそうですね。

>DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)
>それから、コンソール版とかも(笑)

なるほど、なら.NETでも…、といいたいところですが、.NET言語の中でポピュラーなC#とVB…、どっちも書けないんですよ…
でも、さまざまなバージョンができると、この先オセロ/リバーシゲームに関する質問が減りそうです。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,926ポイント)   Date: 2008/08/28(木) 01:47   No:20572     
Title: Re:リバーシゲームを作ってみました。    
> DXライブラリ版とSDK版が発表されてるので、MFC版でも作ってみようかな…(笑)
> それから、コンソール版とかも(笑)
> なるほど、なら.NETでも…

だったらCGI版でも作りましょうか...

> といいたいところですが、.NET言語の中でポピュラーなC#とVB…、どっちも書けないんですよ…

GUIだけC#やC++/CLIで作って、内部処理はC/C++で作るのがよいでしょうね。


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

Name: バグ  ..ハッカー(104,611ポイント)   Date: 2008/08/28(木) 09:42   No:20577     
Title: Re:リバーシゲームを作ってみました。    
>>tkmakwins15さん
質問自体の数は変わらないんじゃないでしょうか?
実際、リバーシのコアの部分はそんなに難易度の高いものではないですし…
こういったプログラムの場合は、むしろCPUのアルゴリズムの方が本体っぽいですよね(苦笑)


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,741ポイント)   Date: 2008/08/28(木) 09:54   No:20578     
Title: Re:リバーシゲームを作ってみました。    
>こういったプログラムの場合は、むしろCPUのアルゴリズムの方が本体っぽいですよね(苦笑)

確かに、AIづくりが一番大変なところですね。

>GUIだけC#やC++/CLIで作って、内部処理はC/C++で作るのがよいでしょうね。

うーん、それはC#の場合は、C#でGUIを作って、内部処理に関してはDLLImportで呼び出すということでしょうか?


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,949ポイント)   Date: 2008/08/28(木) 10:52   No:20583     
Title: Re:リバーシゲームを作ってみました。    
> うーん、それはC#の場合は、C#でGUIを作って、内部処理に関してはDLLImportで呼び出すということでしょうか?

あるいは、インタフェース部分だけC++/CLIにするかです(その程度なら簡単です)。


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



Name: ようすけ  ..ぴよぴよ(564ポイント)   Date: 2008/08/23(土) 19:05   No:20473       
Title: 教えてください!!    
こんばんは

自分で作ったゲームを自分のホームページに載せたい

んですが、

こちらをクリック

ではダメでしょうか?

また、実行ファイル以外にもBMPや音楽ファイルなど
すべてあわせると250メガバイトぐらいになるので、
圧縮して

こちらをクリック

と、した方がいいのでしょうか?

とにかくさっぱりわかりません。

何かいいやりかたをご存じの方は教えてください(__)


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


Name: ようすけ  ..ぴよぴよ(545ポイント)   Date: 2008/08/23(土) 19:17   No:20474     
Title: Re:教えてください!!    
<a href="game.exe">こちらをクリック</a>でした

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

Name: J  ..初心者(6,513ポイント)   Date: 2008/08/23(土) 20:38   No:20477     
Title: Re:教えてください!!    
ゲームを公開するならば、通常はzipやlzh等に圧縮してアップロードすべきなので後者がよろしいでしょう。
あとは簡単な説明書と著作権表示などを記したファイルをいっしょに入れて公開したほうがよいでしょう。

ゲームの配布に関しては・・・そうですね、折角この掲示板の管理人が龍神録というゲームを配布しているのですから、それを実際に落として中身を確かめてみたり、龍神録のホームページを見て配布のしかたを学ばれるとよいのではないのでしょうか?


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

Name: ランド  ..入門者(3,768ポイント)   Date: 2008/08/23(土) 21:04   No:20479     
Title: Re:教えてください!!    
参考になりそうなログがあったのでこちらもどうぞ。
http://www.play21.jp/board/formz.cgi?action=res&resno=19765&page=&lognum=62&id=dixq&rln=19830

//話題とちょっと違いますが、サイズの大きなbmp画像はpngに変換するなどすればサイズが小さくなるかもしれません。
//小さくする必要が無い・何か支障が出るなら大きなお世話かもしれませんが・・・


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

Name: 管理人 [URL]  ..伝説のハッカー(699,526ポイント)   Date: 2008/08/24(日) 01:22   No:20489     
Title: Re:教えてください!!    
game.exeというのはインストール用実行ファイルですか?
それとも単なるゲームの実行ファイルですか?
もし前者ならそれで配布していいです。
後者なら画像ファイルや音楽ファイルも同梱しないといけませんから
圧縮ファイルにするか,インストーラを同梱すべきです。

また,リンクをはるとき,相対パスでかくと,その記述があったファイルのサーバーのフォルダにある内容をさします。
今回の場合この掲示板があるうちのサーバー上には質問者さんのデータであるgame.exeは存在しないので
質問者さんのHPのhttpからパスを書く必要があります。


そして,容量に気を使えばよほど大規模なゲームでないかぎり250MBにはならないと思います。
DXライブラリを使う場合は
音楽ファイルはoggファイルを利用し,画像ファイルはPNGを利用しましょう。
使い込んでいるとWavやほかの形式を使う機会も出てくるかもしれませんが,
最初はまずそれで統一していいと思います。
oggは48kbpsでも196kbpsでも聞いて違いが分からないほどきれいに圧縮できますからおすすめです。

インストーラの作り方が分からない場合は,インストーラを作るソフトなどを利用するのも手だと思います。
しかしもし簡単なゲームだといちいちインストールしないといけないものは
嫌われがちなので,簡単なゲームならただの圧縮ファイルがいいかもしれません。


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

Name: J  ..初心者(6,611ポイント)   Date: 2008/08/24(日) 10:01   No:20504     
Title: Re:教えてください!!    
さ、さすが管理人さん。。
素晴らしい回答です。
質問者でもないのにお礼を言いたいです(笑

oggの手がありましたね・・・今後作るゲームの音楽はoggにしようかと思います。
あれって圧縮率の割りにはいい音質ですからね〜
う〜ん容量に対して音質の効率が悪いMP3の時代は終りですかね〜


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,369ポイント)   Date: 2008/08/24(日) 11:18   No:20505     
Title: Re:教えてください!!    
難しい問題ですね、bmpだけでも、256色や16色まで落とせば、同じ大きさでもだいぶ違います。(実際に僕が作ったリバーシでは駒はbmpです。)
それと、透過せず、ちょっとくらいの荒さが出てもいい画像については、pngよりもjpegのほうがいいと思います。
後忘れずに、この記述をlicense.txtとかいうファイルに書いといてください。
<Dxライブラリより引用>

OGGを使った場合。
ogg_static, vorbis_static, vorbisfile_static
   Copyright (C) 1994-2002 XIPHOPHORUS Company http://www.xiph.org/ .

   Please note that this is only a sample license; authoritative license terms are included with each software bundle.
      
   c year, Xiph.Org Foundation
      
   Redistribution and use in source and binary forms, with or without modification,
   are permitted provided that the following conditions are met:
      
   - Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.

   - Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

   - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used
   to endorse or promote products derived from this software without specific prior written permission.

   This software is provided by the copyright holders and contributors “as is” and
   any express or implied warranties, including, but not limited to, the implied warranties
   of merchantability and fitness for a particular purpose are disclaimed. In no event shall
   the foundation or contributors be liable for any direct, indirect, incidental, special,
   exemplary, or consequential damages (including, but not limited to, procurement of
   substitute goods or services; loss of use, data, or profits; or business interruption)
   however caused and on any theory of liability, whether in contract, strict liability,
   or tort (including negligence or otherwise) arising in any way out of the use of this
   software, even if advised of the possibility of such damage.

png画像を使った場合
libpng Copyright (c) 1998-2004 Glenn Randers-Pehrson.
   zlib Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler.


これを書いておかないと、ライセンスに抵触する恐れがあります。
引用ページ「Dxライブラリ置き場 著作権関係」


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

Name: ようすけ  ..ぴよぴよ(871ポイント)   Date: 2008/08/26(火) 18:07   No:20543     
Title: Re:教えてください!!    
みなさんの言われた通りにZIPに圧縮したんですが、問題点が・・・

gameと言う圧縮フォルダに、画像や音楽ファイルをまとめた一つのフォルダを入れて、

それとは別にゲームの実行ファイルだけを単体で入れたんですけど、

その状態で実行ファイルをダブルクリックしても画面が真っ黒なままで、

何もできませんでした。

画像や音楽ファイルをまとめたフォルダに実行ファイルも一緒に入れてあげた

状態でダブルクリックしたら普通にゲームができました。

画像や音楽ファイルは見られたくないので実行ファイルとは別々にしたいんですが、

それはできないのでしょうか?

低レベルな質問ですいませんが教えてください(泣



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

Name: array  ..上級者(20,491ポイント)   Date: 2008/08/26(火) 18:36   No:20544     
Title: Re:教えてください!!    
色々不明な点がありますが、開発にはDXライブラリを使用しているのでしょうか。

DXライブラリなら、ゲームの館『〜ミニテクニック編〜』t3でも言ってるとおり、アーカイブ機能を使えば解決できると思います。(詳しい説明は本家に書いてあります。)


−game(フォルダ)←圧縮(ZIPなど)←配布
 ├game.exe
 └音楽画像(フォルダ)←アーカイブ
 

こんな感じだと思います。アーカイブを使えば取りあえず(知らない人)には開くことはできないと思うので中身を見られることはないと思います。

ちなみに

−階層1
 ├階層2
 └階層2

 
このようにgame.exeが階層2に存在するのなら同じ階層に、音楽画像(フォルダ)が存在しないと画像や音楽を読み込む事はできません。


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

Name: ようすけ  ..ぴよぴよ(890ポイント)   Date: 2008/08/26(火) 18:49   No:20546     
Title: Re:教えてください!!    
開発はDIRECTXは使ってません。

WIN32APIです(*^_^*)


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

Name: 御津凪 [URL]  ..入門者(3,457ポイント)   Date: 2008/08/26(火) 19:03   No:20547     
Title: Re:教えてください!!    
> 開発はDIRECTXは使ってません。
>
> WIN32APIです(*^_^*)

となると、自力でアーカイブ機能を作る必要があります。
私のサイトで公開している、
Fileshelf
なら、利用できるかもしれません。
(C++で書かれています)
ただし、圧縮処理、読み出し処理は書かないといけませんが。
(Libistact をダウンロードした中身にあり、単体で使用できます)



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

Name: 管理人  ..伝説のハッカー(700,066ポイント)   Date: 2008/08/27(水) 21:19   No:20568     
Title: Re:教えてください!!    
最悪、どうしてもやり方がわからないときは、ファイルの拡張子を勝手に独自の物に変更してやるという
荒業もありかもしれません。
そのときは、画像ファイルも音声ファイルもみな、何とも関連付けされていない同じ拡張子にしてしまうのがいいでしょう。
パッとみ、どう開けばいいかわからないと思います。
拡張子を変更してもファイルの中身はかわらないので、普通に読み込めます。
また、このことは同時にプレイヤーにとってもいえることで、
拡張子を変更しても、ペイントなどに元が画像ファイルであるものをドロップすればひらけてしまうでしょうし、
セキュリティ面ではほとんど意味のないことですので、
そういうことも出来るという程度に参考にしてください。

(一回この方法でやってみたことがありますが、いちいち全部変更するのが面倒だし、
サムネイルが作られないので、後からの管理が大変でした・・)


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



Name: 御津凪  ..入門者(2,896ポイント)   Date: 2008/08/22(金) 10:38   No:20435       
Title: i++ 及び ++i について    
今まで気になっていたことを質問したいと思います。
(内容は雑談的なものなので雑談で立てさせていただきます)

よく、

for(i = 0;i < 100;i++){
// ループ処理
}

のように、入門書などでは、 i++ がほとんどですが、

for(i = 0;i < 100;++i){
// ループ処理
}

のような記述はほとんど見られません。(処理の結果は同じ)
ちなみに、

i++ → i を渡してから i に +1
++i → i を +1 してから i を渡す


という意味があります。
(これでわかるでしょうか…)

他の言語では ++i を使えないものもあるようなので、使われていないようなのですが、
皆様は ++i を使っているのでしょうか?

私は両方使っています。

あと、VC++などの新しいコンパイラでは、最適化により
i++ と ++i との速度の差はなくなるようです。
BCC は分かりませんが。

ちなみに、私は専門学校へ行かず(高校卒業まで)、独学でプログラミングを学び、
未成年でゲーム会社入りしました。
なので、専門学校などの授業を知らないので、上記のような質問をさせていただきました。


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


Name: GPGA  ..熟練のプログラマー(49,637ポイント)   Date: 2008/08/22(金) 11:21   No:20436     
Title: Re:i++ 及び ++i について    
私が専門学生時代のときはi++で教えられていました。
後置インクリメントにする理由などは、特には言っていませんでした。

今は必要がある場合以外は、すべて前置インクリメントを使用しています。
単独で使用するDATA型の場合、最適化により前置、後置の処理速度は変化しないと思いますが
イテレータやoperator++(int)などの場合、最適化が効きにくく
後置インクリメントのほうが遅くなってしまうので、前置インクリメントで統一するようにしています。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,260ポイント)   Date: 2008/08/22(金) 13:38   No:20437     
Title: Re:i++ 及び ++i について    
どちらにするか迷うのであれば、++iにしておく方が無難です。
理由は、すでに回答が出ていますが、++演算子を多重定義した場合にはi++は効率が悪く、思わぬ副作用もあるからです。
以下に具体的に示します。

例えば、次のようなクラスを考えます。
class counter

{
unsigned int value_;
public:
explicit counter(unsigned int value) : value_(value) {}
unsigned int get() const { return value_; }
counter& opertator++();
counter operator++(int);
};


二つの++演算子の実装は次のようになるはずです。
counter& counter::operator()

{
++value_;
return *this;
}

counter counter::operator++(int)
{
counter temp(*this);
++value_;
return temp;
}


これを見れば分かるように、明らかに後置型の方が効率が悪くなります。

また、上の例では問題ありませんが、コピーコンストラクタが例外を送出する可能性がある場合を考えてみてください。
後置型の++では、最大2箇所でコピーコンストラクタが呼び出されますので、その都度例外が送出される可能性があります。例外が送出されるということは、それだけ実行パスが複雑になることを意味します。
効率の観点からも、複雑さを軽減する観点からも、例外安全の観点からも、理由がなければ++iにする方がよいでしょう。

ただし、(C++ではなく)Cの場合はi++の方が多く使われているのも事実です。
ですから、オペランドが組み込み型であることがはっきりしているのであれば、i++としても特に問題はありません。


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

Name: 御津凪  ..入門者(3,111ポイント)   Date: 2008/08/22(金) 14:33   No:20438     
Title: Re:i++ 及び ++i について    
GPGAさん、たかぎさん、回答ありがとうございます。

そういえば、イテレータや演算子のオーバーライドについては質問時に考えていませんでした。
確かに、C++ではそこで処理速度に差が出ますよね。

私はC++のイテレータや演算子のオーバーライド(インクリメント・デクリメント)は余り使用していなかったので、
上記の回答は大変参考になりました。

ちなみに、この質問は疑問として思ったことなので、別に悩んでいるわけではありません。


ところで、私は両方使うと書きましたが、以下のように使っています。
(Cでの処理が思いつかなかったのでC++で適当に書きました)

class CharStack{
unsigned int _count;
char _str[256];
public:
CharStack( void ){
_count = 0;
_str[0] = '\0';
}
CharStack( const char* str ){
_count = strlen(str);
strcpy(_str,str);
}

void push( char c );
char pop( void );

const char* str( void )const{return _str;}
};
void CharStack::push( char c ){
_str[_count++] = c;
_str[_count] = '\0';
}
char CharStack::pop( void ){
char c = _str[--_count];
_str[_count] = '\0';
return c;
}

前置・後置の使い方を示したクラスなので、バッファオーバーランとかは考えてません。
初心者の方は多分混乱するような書き方だと思いますが、
このように書いている方ってどれくらいいるんでしょうか。
(リファクタリングの話になるかも)

Cではなんで i++ が多く使われているんでしょうかね?
初心者の方々にも聞いてみたいなぁと思ったり。


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

Name: KEV  ..入門者(4,415ポイント)   Date: 2008/08/22(金) 15:28   No:20439     
Title: Re:i++ 及び ++i について    
i++を常時使ってる初心者です。
多く使われている理由をちらっと考えてみたんですが、

1.入門書のほとんどがi++で書いてる
 これがまぁ一番の理由だと思います。

2.i += 1 と同義なので、見た目似てるi++のほうが覚えやすい
 これは個人的な理由です。
 i++でも++iでもどっちでもいいよ、と言われたからi++を覚えてしまった記憶が。

3.C++がCの延長上にあると思ってる
 CでいけるんだしC++で同じことしても大丈夫だろうと思っている(実は自分も思ってた)。
 皆さんのおっしゃってる実装内容みたらi++で書く気がなくなりますね…。

++iの方がいいよーと言うのは前から聞いてたのですが、
はっきりとした理由が分かってとてもいい勉強になりました。
いい機会だしこちらに乗り換えてみます。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,214ポイント)   Date: 2008/08/22(金) 17:04   No:20444     
Title: Re:i++ 及び ++i について    
> そういえば、イテレータや演算子のオーバーライドについては質問時に考えていませんでした。

× オーバーライド
○ オーバーロード

です。
紛らわしいので、私はJIS X3014の訳語を用いて「多重定義」と呼ぶことにしています。


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

Name: 御津凪  ..入門者(3,356ポイント)   Date: 2008/08/22(金) 17:46   No:20446     
Title: Re:i++ 及び ++i について    
> × オーバーライド
> ○ オーバーロード
>
> です。
> 紛らわしいので、私はJIS X3014の訳語を用いて「多重定義」と呼ぶことにしています。

たかぎさん、ご指摘ありがとうございます。
独学のため、曖昧で覚えていたようで…。
私も多重定義と呼ぶことにします。

>KEVさん

> 1.入門書のほとんどがi++で書いてる
確かに入門書は i++ がほとんどですね。
知っている限りでは ++i の方は見かけないです。
変わりに専門書では見かけますが。

> 2.i += 1 と同義なので、見た目似てるi++のほうが覚えやすい
確かに私も覚えやすいなと思います。

そういえば、 i += 1 と i++ では、 i++ の方が処理が速いらしいです。

> 3.C++がCの延長上にあると思ってる
C++ は C をオブジェクト指向に書けるようにした言語なので、
C++ は C の延長上にあると私は思っています。
オブジェクト指向を擬似的に C で表現できますし。

> ++iの方がいいよーと言うのは前から聞いてたのですが、
> はっきりとした理由が分かってとてもいい勉強になりました。
> いい機会だしこちらに乗り換えてみます。

実はそういうことを気づかせるための雑談スレだったり…(笑

i++ や ++i は一行だけに書くと処理結果はまったく同じなので、
分からないままの方がいるのだと思います。

戻り値や式の中に入れた場合に処理が変わるので。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,307ポイント)   Date: 2008/08/22(金) 19:51   No:20448     
Title: Re:i++ 及び ++i について    
> そういえば、 i += 1 と i++ では、 i++ の方が処理が速いらしいです。

全く最適化が働かず、インクリメント命令が加算命令とは別に用意されているような環境であれば、iの型次第ではそうなる可能性はあります。
ただし、それぐらい最適化がきかない環境だと、++iとi++では実行速度が変わる可能性があります。

> C++ は C をオブジェクト指向に書けるようにした言語なので、

これはちょっと事実誤認かもしれませんね。


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

Name: Hermit  ..上級者(21,965ポイント)   Date: 2008/08/23(土) 10:52   No:20459     
Title: Re:i++ 及び ++i について    
今回のような for(i = 0;i < 100;i++) だと、あまり変わらないとは思いますが、
MC68000 では、アセンブラで
(An)+ や、-(An) などのアドレスレジスタ間接モードがありましたが、
+(An) と、(An)- は無いので、
使うときは、i++ か、--i を使う癖がついてましたね。

私の場合は、それが一番大きい。(単なる癖)


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

Name: J  ..初心者(6,165ポイント)   Date: 2008/08/23(土) 15:31   No:20465     
Title: Re:i++ 及び ++i について    
こんにちは。

工業系の高校に通っていますが、
インクリメントはやっぱりi++で習いましたね。
独学時代の入門書もやっぱりi++でした。

KEVさんの2に同意です。後置の方が我々の日常感覚にあってますしね。

このスレに来て初めて前置の方が効率が良いと知りました。
どんなときでも前置の方がよろしいのでしょうか?
やっぱり、例外もあるのですか?


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,484ポイント)   Date: 2008/08/23(土) 16:59   No:20471     
Title: Re:i++ 及び ++i について    
> どんなときでも前置の方がよろしいのでしょうか?

++iとi++のどちらでもよい文脈では、++iとすべき理由はあってもi++とすべき理由はありません。
iが確実に組み込み型だと分かる状況であれば、i++でも構わないという程度です。

組み込み型であることが確実ではない状況には、組み込み型にtypedef名を付けた場合も含みます。
なぜなら、特定の型に依存しないように、抽象化する目的でtypedef名を付けたのであれば、いずれ組み込み型ではなくなる可能性があるからです。
ただし、size_tのように、規格で組み込み型のいずれかに定義されることがはっきりしているものは別です。

使い分けを確実に行うこと自信がないのであれば、例外なく++iにした方が無難です。


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

Name: J  ..初心者(6,346ポイント)   Date: 2008/08/23(土) 20:33   No:20476     
Title: Re:i++ 及び ++i について    
よく分かりました。
自信がないのでこれからは前置にすることにします。
さてさて?置換のお時間かな?i++ → ++i


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,456ポイント)   Date: 2008/08/24(日) 20:54   No:20511     
Title: Re:i++ 及び ++i について    
後置が多く使われてる理由のひとつとして、strcpyの実装としてこのような例があるからではないでしょうか?


char *strcpy(char *buf,char *str)
{
while(*buf++=*str++);
return buf;
}


後置はあまりよくないんですね…


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

Name: 御津凪  ..入門者(3,567ポイント)   Date: 2008/08/25(月) 11:28   No:20514     
Title: Re:i++ 及び ++i について    
返信等が遅れました。

>Hermitさん
やはりというか、癖も原因の一つだったりするんですね。

>tkmakwins15さん
よく考えると、後置が必要な処理はそう多くないですよね。
分かりやすく書くと、下記のように後置が必要なくなりますし。

char *strcpy(char *buf,char *str)
{
while(*buf = *str){
++buf;
++str;
}
return buf;
}


そう考えると、コードを短くまとめる時以外、後置の必要性が無くなってしまいますね…。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,670ポイント)   Date: 2008/08/25(月) 15:51   No:20519     
Title: Re:i++ 及び ++i について    
一応指摘しておくと...
char *strcpy(char *buf,char *str)

{
while(*buf++=*str++);
return buf;
}


ではダメで、
char *strcpy(char *buf,const char *str)

{
char *result = buf;
while(*buf++=*str++);
return result;
}

のようにする必要があります。

御津凪さんのコードも同じ問題があります。
ただし、効率面では御津凪さんの方がよいでしょうね。


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

Name: Hermit  ..上級者(21,839ポイント)   Date: 2008/08/27(水) 19:48   No:20566     
Title: Re:i++ 及び ++i について    
>そう考えると、コードを短くまとめる時以外、後置の必要性が無くなってしまいますね…。
char *strcpy(char *buf,char *str)

{
while(*buf++=*str++);
return buf;
}
と、
char *strcpy(char *buf,char *str)

{
while(*buf = *str){
buf++; // ++buf ++str だったけど
str++; // 一応前のと比較って事で、書き換えてます。
}
return buf;
}
では、返却されるポインタの位置が違うので注意しましょうね('\0'の位置か、その次かが違うので)








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



Name: ダウト  ..ぴよぴよ(38ポイント)   Date: 2008/08/26(火) 16:35   No:20539       
Title: 受信データを決められた形の変数に格納    
宿題が与えられたのでアドバイスをお願いしたいと思います。
OSは(Soralis8)でUNIXのviコマンドを使ってのC言語での
プログラミングです。ソケットでのデータ受信をするんですが、
決められた構造体にデータを受信するんですが、アナログ64点、デジタル256点
分が送られてきて、それぞれアナログ256byte,デジタル32byteに格納するのですが、条件があり、
アナログの場合、基本的には"1"の信号が送られてきますが、ワンショットで1以外の値を受信し続ける
プログラムにしないといけません。
C言語はまだ初心者の類ですので、アドバイスよろしくお願いします。
#include<stdio.h>
#include<stdlib.h>

struct Data{

float Adata[64];
int Ddata[256];

}


int main(void){


struct Data *tsd;




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


Name: ダウト  ..ぴよぴよ(47ポイント)   Date: 2008/08/27(水) 13:04   No:20548 解決!     
Title: Re:受信データを決められた形の変数に格納    
解決しました。

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



Name: J  ..初心者(6,758ポイント)   Date: 2008/08/25(月) 21:06   No:20525       
Title: ファイルの読み書きについて    
こんばんわ、毎度お世話になっております。
かなり初歩的な質問になると思いますが、
DXライブラリにFileRead_gets関数というのがあると思いますが、
あれは読み込んだファイルを格納するのに、char配列を使うではないですか。
読み込んだは読み込んだで良いのですが、それをint型やfloat型に変換するにはどうすればよいでしょうか。
また、二行目以降を読み込むにはどうすればよいのでしょうか?
本家の解説には載っていないもので・・・

どなたか教えてくださると嬉しいです。ご回答お願いします。


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


Name: toyo  ..上級者(16,277ポイント)   Date: 2008/08/26(火) 10:03   No:20531     
Title: Re:ファイルの読み書きについて    
テキストファイルの数字文字列を数値に変えたいということでしょうか
読み込んだ文字列をsscanf( )で変換するかatoi( )やatof( )で変換すれば出来ます。
FileRead_getsの代わりにFileRead_scanf( )で数値として読み込むことも出来ます。
二行目以降はもう一度FileRead_getsを呼び出せば自動的に次の行が読み込まれます。


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

Name: J  ..初心者(6,918ポイント)   Date: 2008/08/26(火) 11:30   No:20533     
Title: Re:ファイルの読み書きについて    
toyoさんご回答ありがとうございます。
FileRead_scanf()なんて関数があったんですか!
知らなかったです。。見てるリファレンスのバージョンが古かったみたいで載ってなかったです。
それで調べてみたんですけど、
int FileRead_scanf( int FileHandle , char *Format , ... ) ;
引数の説明が理解できなかったので、大変だとは思いますが説明がほしいです。
char *Format : 書式制御文字列とは何でしょうか?


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

Name: 御津凪  ..入門者(4,119ポイント)   Date: 2008/08/26(火) 11:49   No:20534     
Title: Re:ファイルの読み書きについて    
C 標準関数の fscanf() 関数と同じ機能なのですが、簡単に説明すると、
たとえば、

int num_i;
float num_f;
char str[256];
FileRead_scanf(handle,"%d",&num_i); // int型を読み込む
FileRead_scanf(handle,"%f",&num_f); // float型を読み込む
FileRead_scanf(handle,"%s",str); // 次の区切り文字まで読み込む

となり、 fprintf() 関数と似たような書き方をします。
大きく違う点は、Format以降に指定する引数は値を受け取るためにポインタとするところでしょうか。
詳しく書くとだらだらと長くなりそうなので、これだけ覚えておけば問題ないと思います。

ちなみに、区切り文字とは、半角の空白文字、タブ文字、改行文字です。


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

Name: J  ..初心者(6,956ポイント)   Date: 2008/08/26(火) 11:56   No:20535 解決!     
Title: Re:ファイルの読み書きについて    
御津凪さん、本当にありがとうございます。
なるほど、よくわかりました。
詳しい回答ありがとうございます。


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



Name: t_white  ..ぴよぴよ(229ポイント)   Date: 2008/08/23(土) 20:45   No:20478       
Title: ラジアンから8方向の何処を向いているかを調べる関数    
こんばんは。
引数のラジアンの値から8方向(右、右下、下、左下、左、左上、上、右上)を求めて返す関数が必要になり、8方向だから1方向は45度(PI*0.25)で右は-22.5度から22.5度の範囲でー・・・あー・・・と2時間考えていろいろ作ってみたのですが、
どうしてもまともなコードが思い浮かびません。sinとかcosとか使ったほうがいいんだろうか・・・。
どう実装したらいいか教えて頂けると助かります。

この時の引数のラジアンはPI2(3.14159265*2)よりも大きくなる場合やマイナスである場合も考慮していただけると更に助かりますです。


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


Name: t_white  ..ぴよぴよ(485ポイント)   Date: 2008/08/23(土) 22:23   No:20483     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    

#define PI 3.14159265
#define PI2 (PI*2) //360度
#define PI025 (PI*0.25) //45度
#define PI0125 (PI*0.125) //22.5度

//渡された方向から8方向を返す(0右,1右下〜6上,7右上)
int AngleToDir8(double angle){
//0〜PI2(360度)の範囲にする
while(angle<0)
angle+=PI2;
while(angle>PI2)
angle-=PI2;

if(angle>PI2-PI0125) //上の"右"の範囲(337.5〜360度)に入っていたら
return 0; //"右"を表す0を返す
return (angle+PI0125)/PI025; //0~7
}


いろいろ考えて一応上記の方法で正常に意図通りに動くようにはなったのですが、
何回見回しても、コードが、痛イです。

引き続き、まともなアルゴリズムを知っていたら教えていただけると助かります・・・。
ついでにまともな関数名も考えて頂けると(略)です。。


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

Name: t_white  ..ぴよぴよ(958ポイント)   Date: 2008/08/23(土) 22:37   No:20484     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    

#define PI 3.14159265
#define PI2 (PI*2) //360度
#define PI025 (PI*0.25) //45度
#define PI0125 (PI*0.125) //22.5度

int AngleToDir8(double angle){
while(angle<0)
angle+=PI2;
while(angle>PI2)
angle-=PI2;
switch((int)(angle/PI0125)){
case 0:
case 15:
return 0;break; //右
case 1:
case 2:
return 1;break; //右下
case 3:
case 4:
return 2;break; //下
case 5:
case 6:
return 3;break; //左下
case 7:
case 8:
return 4;break; //左
case 9:
case 10:
return 5;break; //左上
case 11:
case 12:
return 6;break; //上
case 13:
case 14:
return 7;break; //右上
}
}

上記の方法でも意図通りに動くと気づき、考え方的には一番まともなのが思い浮かんだのですが、何回書いてみてもイタいコードしか思いつきません・・・。
引き続き、まともなアルゴリズムを知っていたら教えていただけると助かりますです。


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

Name: array  ..上級者(19,537ポイント)   Date: 2008/08/24(日) 00:03   No:20485     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    

#define PI 3.14159265

int AngleToDir8(double angle){
int angle8 = PI/4; //8分の1 PI

if(angle => 0){ //プラスなら
for(int i=0; i<8; i++){
if(angle8*i > angle){
return i;
}
}
}else{ //マイナスなら
for(int i=7; i>=0; i--){
if(-angle8*i < angle){
return i;
}
}
}
return -1; //予想外のエラー
}
 


こんなのはどうでしょうか。0°〜44°の間は0が返ってくると思います。45°〜89°で1が返ってくると思います。

ちょっと思いついたから書いてみただけなので実行結果を確認していません><;
参考になれば・・・。多分マイナスで受け取った時の処理が間違ってると思います(ぇ


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

Name: array  ..上級者(19,716ポイント)   Date: 2008/08/24(日) 00:12   No:20486     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
投稿してから気づいたけど、360°以上だとエラーが返ってきますね・・・。

#define PI 3.14159265

int AngleToDir8(double angle){
int angle8 = PI/4; //8分の1 PI

if(angle => 0){ //プラスなら
while(1){
if(angle8*i > angle){
return i%8;
}
i ++;
}
}else{ //マイナスなら
while(1){
if(-angle8*i < angle){
return i%8;
}
i ++;
}
}
return -1; //予想外のエラー
}


・・・returnでこんな使い方できるのかな・・・(笑)
あとマイナスをどう考えれば良いのか分らない^^;


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

Name: Justy  ..ハッカー(218,627ポイント)   Date: 2008/08/24(日) 00:23   No:20487     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    

>コードが、痛イです

 1つ目のコードは良くできてますよ。
 動いてるならそれに超したことはないと思いますが、
どのあたり痛いと思われますか?

 あー、でも角度を正規化(0-360)するのに whileループは止めた方が
いいかもしれませんね。
 ものすごく大きな値が入力された場合、その whileループの処理が
なかなか終わらない、という現象が起こりえますので。
 昔それで痛い目を見ました・・・。

 それもふまえて、(あんまりテストはしてませんが)少し作ってみました。
int RadianTo8Direction(double angle)

{
int val;
if(angle >= 0)
val = (int)((angle + PI0125) / PI025);
else
{
val = (int)((angle - PI0125) / PI025);
val = 8 - (-val % 8);
}
return val % 8;
}

 めんどーな正規化は val % 8で済ませました(w



>ついでにまともな関数名

 いや、AngleToDir8()で十分いいと思いますけど。
 私も付けるとしたらかなり似たような名前になると思います。
 RadianTo8Direction()とか。


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

Name: Justy  ..ハッカー(218,752ポイント)   Date: 2008/08/24(日) 00:42   No:20488     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 今コードを自動テストにかけていたのですが、t_whiteさんの1つ目のコードで、
-22.5度(ラジアンで -0.392699)を指定しますと範囲外の 8が戻ってきます。

 又、2つ目のコードで 360度(ラジアンで6.283185)を指定すると、16が戻ってきます。
 多分、switch-caseに引っかからずに不定な値を戻してしまっていると思われます。

 あと-22.5度で2つ目のコードで試すと 0、私のコードだと 7になっています。
 境界線上がどっちの向きの所属になるかが重要な場合は私のコードではダメかもしれません。



# 再修正
 やっぱり元にもどしました。


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

Name: フリオ  ..プログラマー(26,191ポイント)   Date: 2008/08/24(日) 01:24   No:20490     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 
 これで、どうでしょう。

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int AngleToDir8(double r)
{
if(r >= 0) return (int)fabs(4 * r / PI + 0.5) % 8;
else return 7 - (int)fabs(4 * r / PI + 0.5) % 8;
}

int main(void)
{
double r;
char *str[] = {"R", "RU", "U", "LU", "L", "LD", "D", "RD"};

scanf("%lf", &r);
printf("%s\n", str[AngleToDir8(r)]);
return 0;
}

 


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

Name: フリオ  ..プログラマー(26,234ポイント)   Date: 2008/08/24(日) 02:03   No:20494     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 
 ごめんなさい。
間違ってました。これだと、角度が負のときおかしくなります。
 


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

Name: 木霊  ..中級者(13,075ポイント)   Date: 2008/08/24(日) 02:08   No:20495     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    

自分もちょっと作ってみました・・・最初にラジアンを度に変換してたり、直接値を使ったりしてます

static const double PI = 3.14159265358979323846;// グローバル変数
・・・
int Rounding_In_8Directions ( double Temp_Angle )// 8方向への丸め
{
Temp_Angle *= 180.0 /PI;
while ( Temp_Angle > 360.0 ) { Temp_Angle -= 360.0; }
while ( Temp_Angle < 0.0 ) { Temp_Angle += 360.0; }
Temp_Angle += 22.5;
if ( Temp_Angle > 360.0 ) { Temp_Angle -= 360.0; }
return ( int )( Temp_Angle /45.0 );
}


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

Name: Justy  ..ハッカー(218,814ポイント)   Date: 2008/08/24(日) 02:50   No:20496     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 木霊さんのコードですが、最後の if文の直前で Temp_Angleが 360.0だった場合、
if文は実行されずそのまま /45を行うので8が戻ってきそうな・・・。


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

Name: フリオ  ..プログラマー(26,333ポイント)   Date: 2008/08/24(日) 02:59   No:20497     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 
>角度が負のときおかしくなります。
 もっと根本的な間違いをしてました。
これで、改善されてるはずです。

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int AngleToDir8(double r)
{
int dir = (int)(fabs(4 * r / PI) + 0.5) % 8;

if(r >= 0) return dir;
else return (8 - dir) % 8;
}

int main(void)
{
double r;

scanf("%lf", &r);
printf("Direction : %d\n", AngleToDir8(r));
return 0;
}

 


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

Name: フリオ  ..プログラマー(26,502ポイント)   Date: 2008/08/24(日) 04:48   No:20498     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 

>int AngleToDir8(double r)
>{
> int dir = (int)(fabs(4 * r / PI) + 0.5) % 8;
>
> if(r >= 0) return dir;
> else return (8 - dir) % 8;
>}


"dir == 0"のためだけに剰余計算をするのもなんなので、

if(!dir || r >= 0) return dir;
else return 8 - dir;

に変更します。


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

Name: t_white  ..かけだし(1,610ポイント)   Date: 2008/08/24(日) 05:36   No:20499 解決!     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
皆さん本当にたくさんのレスと回答および解答をありがとうございますです!

>>array様
ありがとうございます!
プラスのときとマイナスのときの処理を分けるというのが大切だと気づき勉強になりました。
ただこのコードだと0〜44度で0、45〜89度で1、0と1ともに”右上”の判定になってしまい上や右などの上下左右をの範囲が求められていないので22.5度ずらしてみようと思いますです〜。ありがとうございました。

>>Justy様
ありがとうございます!
綺麗に纏まっていて無駄のないコードだと思いました。%の使い方が大事ですね。
360度より大きい値が来たときは計算の最後に%を使って省けばいいんですね・・・。
計算の最初にラジアンの状態のangleにangle%PI2とやって "double型には%は使えません" みたいなエラーになってウハーってなったのもいい思い出です。i|||i_| ̄|〇i|||iアホか・・・
>1つ目のコードと2つ目のコード
うお、自分でも投稿してからまずいかなーと思ってたところを気づかれた!
if(angle>PI2-PI0125)

if(angle>=PI2-PI0125)
にして、
while(angle>PI2)

while(angle>=PI2)
にすれば直るかな?いろいろと試してみますです。
実際の関数の実装にはJustyさんのコードを参考にさせて頂きたいと思います!ありがとうございました!

>>フリオ様
ありがとうございます!
これだけ短いコードに纏められていることにびっくりしました。
自分もこういうかっこいいコードが書けるようになれるように頑張りたいです。
こんなに短いコードで本当に意図通りに動くのかと実際に動かしてみましたが完璧に動作していました。
22.5度は"+ 0.5"の部分で対応しているのか・・・すごすぎる。
コードをメモ帳に永久保存してこれからのコーディングにも参考にさせて頂きますです。ありがとうございました!

>>木霊様
ありがとうございます!
やっぱりラジアンを度数表記にするとコードが見やすくなりますね。
実は最初に度数表記にしてのコードに挑んでいたのですが途中で混乱して投げ出していたので作っていただき助かりましたです〜。ありがとうございました。


本当に皆様、重ねて、ありがとうございました。<(_ _)>


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

Name: フリオ  ..プログラマー(26,618ポイント)   Date: 2008/08/25(月) 04:55   No:20512     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
 
 すでに解決してますけど一応、
最初のは、場合分けを間違ってました。

int AngleToDir8(double r)
{
if(r >= -PI / 8) return (int)fabs(4 * r / PI + 0.5) % 8;
else return 7 - (int)fabs(4 * r / PI + 0.5) % 8;
}

 


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

Name: t_white  ..かけだし(1,866ポイント)   Date: 2008/08/25(月) 06:30   No:20513 解決!     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
本当に無駄の無いコードで美しすぎる・・・。(´Д`;)

処理を分ける境界は0度ではなく-22.5度(-PI/8)だという事に今更ながら気づきました・・・。
0度で分けてたから自作のコード2でswitch使ってcase15:とかわけのわからない処理をする羽目になったんですね。_| ̄|○
マイナスのときの計算は、"ラジアン(を用いた計算結果)の絶対値"の増減による方向の変動が逆になるだけだから最大値の7から同じ計算式で引けばいいんですね。

なんかもうコードの意味を理解しようと考えてるだけで気持ちいいアドレナリン出てきまくりました。
更に重ねてありがとうございました!


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

Name: 木霊  ..中級者(14,324ポイント)   Date: 2008/08/25(月) 21:27   No:20527     
Title: Re:ラジアンから8方向の何処を向いているかを調べる関数    
すでに解決してるので迷ってたんですが、

Justyさんに指摘を受けてた部分の訂正+アルファをやってみました

static const double PI = 3.14159265358979323846;
static const double ROUND = 360.0;
int Rounding_In_Free_Directions ( double Temp_Angle, int Temp_Partitions = 8 );// 関数の事前宣言
・・・
int Rounding_In_Free_Directions ( double Temp_Angle, int Temp_Partitions )
{
if ( Temp_Partitions <= 0 ) { Temp_Partitions = 1; }
Temp_Angle *= 180.0 /PI;
while ( Temp_Angle < 0.0 ) { Temp_Angle += ROUND; }
Temp_Angle += ( ROUND /( Temp_Partitions << 1 ) );// Temp_Partitionsを2倍している
while ( Temp_Angle >= ROUND ) { Temp_Angle -= ROUND; }
return ( int )( Temp_Angle /( ROUND /Temp_Partitions ) );
}

第二引数が分割数です
1以上の任意の数に分割でき(るはず)ますが・・・必要ないですねw

>Justyさん

極端な数でのチェックしかしてませんでした
ありがとうございます(t_whiteさんの立てたトピですがw)


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



Name: 厨房  ..ぴよぴよ(530ポイント)   Date: 2008/08/25(月) 13:11   No:20516       
Title: 無題    
こんにちは。このサイトからリンクされている「C言語〜ゲームプログラミングの館〜」の質問です。
「VisualC++ 2005 Express Edition を使用した場合のDXライブラリの使い方」の中に書いてあった
「VisualC++ 2005 Express Edition のセッティング」をして、
「7.プロジェクトのビルド、実行」をしたのですが、次のようなエラー表示が出てしまいました。


------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
コンパイルしています...
DrawPixel.cpp
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(1) : fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\プロジェクト\test\Debug\BuildLog.htm" に保存されました。
test - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========


「インクルード ファイルが多すぎます」というのは、どう対処したらいいのでしょうか?
どなたかよろしければお教えいただけないでしょうか?
最後になりましたが僕は、C言語やプログラミングなどは、始めて一ヶ月ぐらいなので出来ましたら、
わかりやすい表記でお願いします。








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


Name: 御津凪  ..入門者(3,852ポイント)   Date: 2008/08/25(月) 13:41   No:20517     
Title: Re:無題    
再帰的にヘッダファイルをインクルードしているためにこのエラーは発生しています。
(同じファイルをインクルードする無限ループが発生している)

DXライブラリに変更を加えていない限り、DXライブラリに問題は発生しないはずなので、
セッティングの部分で問題が発生している恐れがあります。

環境が VC++ ということなので、
各ヘッダファイル(*.h)の先頭行に、
#pragma once

を追加しておくと、上記のようなエラーは防げます。
(一度しかインクルードしないという意味)

あと、プロジェクトの場所はマイドキュメントやデスクトップに作らないほうがいいと思います。
上記のパスでは"administrator"(管理者)ですが、場合によってはここにユーザー名が表示されてしまいます。

プロジェクトは"C:\Project"等に作成しておくと良いでしょう。


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

Name: 厨房  ..ぴよぴよ(592ポイント)   Date: 2008/08/25(月) 16:35   No:20520     
Title: Re:無題    
そうだったんですか。有難うございます。
プロジェクトの場所はマイドキュメントやデスクトップに作らないほうがよかったんですね
早速変更します。


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

Name: たかぎ [URL]  ..熟練のプログラマー(55,823ポイント)   Date: 2008/08/25(月) 18:18   No:20521     
Title: Re:無題    
> あと、プロジェクトの場所はマイドキュメントやデスクトップに作らないほうがいいと思います。

デスクトップはともかく、マイドキュメントに作るのは構わないと思いますし、本来はそうすべきなのだと思います。
実際、Visual Studio 2005では、プロジェクトを生成する際のデフォルトのパスは、My Documents\Visual Studio 2005\Projects ですよね。
複数名でPCを共有する場合には、C:\ のような場所は「公の場所」なので、(本来は)個人的なファイルを置くべきではないはずです。


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

Name: 厨房  ..ぴよぴよ(644ポイント)   Date: 2008/08/25(月) 18:56   No:20523     
Title: Re:無題    
そんな使い分け方があったんですね。
有難うございます。
今のところ使ってるパソコンは父の、お下がりで自分専用機なので、大丈夫です。
ちなみにOSはWindows2000です(泣


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

Name: 厨房  ..かけだし(1,794ポイント)   Date: 2008/08/25(月) 19:36   No:20524     
Title: 助けてください!!    
「御津凪」様の教えていただいた通りにやったら、次のようなエラーが出てしまいました。
------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
コンパイルしています...
DrawPixel.cpp
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : error C2146: 構文エラー : ';' が、識別子 'WinMain' の前に必要です。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : error C2065: 'HINSTANCE' : 定義されていない識別子です。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : error C2146: 構文エラー : ')' が、識別子 'hInstance' の前に必要です。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(6) : error C2059: 構文エラー : ')'
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(7) : error C2143: 構文エラー : ';' が '{' の前にありません。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(7) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(4) : error C2146: 構文エラー : ';' が、識別子 'WinMain' の前に必要です。
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(4) : error C2086: 'int WINAPI' : 再定義されました。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : 'WINAPI' の宣言を確認してください。
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(4) : error C2146: 構文エラー : ')' が、識別子 'hInstance' の前に必要です。
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(4) : error C2374: 'WinMain' : 再定義されています。2 回以上初期化されています。
c:\documents and settings\administrator\デスクトップ\dxlib_vc\プロジェクトに追加すべきファイル_vc用\dxlib.h(5) : 'WinMain' の宣言を確認してください。
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(5) : error C2059: 構文エラー : ')'
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(6) : error C2143: 構文エラー : ';' が '{' の前にありません。
c:\documents and settings\administrator\my documents\visual studio 2005\プロジェクト\test\drawpixel.cpp(6) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\プロジェクト\test\Debug\BuildLog.htm" に保存されました。
test - エラー 15、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

どうしたらいいでしょうか?助けていただきたいです。よろしくお願いします。
ちなみにデスクトップにあったファイルを動かしたらエラーになったので、戻しました



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

Name: box  ..ハッカー(124,000ポイント)   Date: 2008/08/25(月) 21:19   No:20526     
Title: Re:無題    
エラーが出ているソースファイルとヘッダーファイルの
先頭から10行分を見せてください。


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



Name:  ..かけだし(2,451ポイント)   Date: 2008/08/25(月) 13:03   No:20515       
Title: 龍神録の館 20章の背景を描いてみようについて    
龍神録の館 20章の背景を描いてみようの部分の
---- main.cpp のmain関数の以下を変更 ----

case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
cshot_main();//自機ショットメイン
enemy_main();//敵処理メイン
shot_main(); //ショットメイン
out_main(); //当たり計算
effect_main();//エフェクトメイン ←ここが赤く書かれている。
graph_main();//描画メイン
stage_count++;
break;
と、説明にはありますが、これは19章の敵の消滅エフェクトを作ってみようの部分とまったく同じなので、多分間違えて入っているのではないかと思い報告させてもらいます。
私の勘違いならすみませんm(_ _)m


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


Name: 管理人  ..伝説のハッカー(699,900ポイント)   Date: 2008/08/25(月) 18:43   No:20522     
Title: Re:龍神録の館 20章の背景を描いてみようについて    
ご報告ありがとうございます。
現在山奥田舎の実家に帰省中なので、帰り次第確認しますm(__)m


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



Name: カカシ  ..ぴよぴよ(82ポイント)   Date: 2008/08/24(日) 06:03   No:20500       
Title: 質問が適切でないかもしれませんが助言よろしくお願いします    
Windows XPでスイッチを入れたと同時にhal.dllが存在しないと警告が表示されOSが立ち上がりません。このような場合どのような対処をすればいいのか教えてください。ちなみにHDDのデータを消さずに解決したいと思っています。よろしくお願いします。

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


Name: 管理人 [URL]  ..伝説のハッカー(699,867ポイント)   Date: 2008/08/24(日) 09:57   No:20503     
Title: Re:質問が適切でないかもしれませんが助言よろしくお願いします    
よくわかりませんが、ググってみました?
http://www.google.co.jp/search?hl=ja&q=hal.dll&lr=


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

Name: カカシ  ..ぴよぴよ(126ポイント)   Date: 2008/08/24(日) 19:17   No:20506     
Title: Re:質問が適切でないかもしれませんが助言よろしくお願いします    
ググって色々試した結果回復コンソールを使ってboot.iniを再構築したら上手く起動できました。ありがとうございました。

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



Name: PIRO  ..かけだし(1,003ポイント)   Date: 2008/08/23(土) 21:16   No:20480       
Title: DXライブラリについて    
いきなりですみません。
本当に、初歩的なことが気になってしまったので、このサイトをまた使わせていただきます。

DXライブラリでは、C++の文法は使うことはできるのでしょうか??
たとえば、printf("■\n");といったものは、用いることができるのでしょうか??
さきほど自分で試したところどうにもprintf("■\n");が認識されませんでした・・・・・・

どうにかしたら、printf("■\n");を使うことができるのですか???

本当に初歩的なことですみません。




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


Name: ランド  ..入門者(3,822ポイント)   Date: 2008/08/23(土) 21:38   No:20481     
Title: Re:DXライブラリについて    
printf関数を使うことはできなかったと思います。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R17N20
このあたりを参考にしてください。



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

Name: PIRO  ..かけだし(1,021ポイント)   Date: 2008/08/23(土) 21:47   No:20482 解決!     
Title: Re:DXライブラリについて    
<ランドさん

早々と答えてくださり、とても助かりました。
本当にありがとうございました。
初心者なもんで、まったくDXライブラリについてのルールを知りませんでした。
助かりました。


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

Name: 管理人 [URL]  ..伝説のハッカー(699,550ポイント)   Date: 2008/08/24(日) 01:26   No:20491     
Title: Re:DXライブラリについて    
printfにあたるDXライブラリ用の関数はあります。
printfDxを使ってください。
使い方はprintfと同じですが,
もしループしている場合,すごい早さで大量に表示されるので注意してください。


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

Name: PIRO  ..かけだし(1,075ポイント)   Date: 2008/08/24(日) 09:22   No:20502 解決!     
Title: Re:DXライブラリについて    
<管理人さん

そのような関数があるんですか??
さっそく使ってみます。
ありがとうございました。
本当に助かります。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +