C言語何でも質問掲示板


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

 
   パターンマッチング   
     ・[24300] Justy 
     ・[24495] ひで 
   アルゴリズム   
     ・[24424] たいちう 
     ・[24425] non 
     ・[24427] Mist 
     ・[24428] 我九 
     ・[24433] non 
     ・[24440] non 
     ・[24463] 我九 
     ・[24464] 初級者 
     ・[24465] non 
     ・[24483] 我九 
   素材について   
     ・[24462] Dixq (管理人) 
     ・[24477] 海老天 
   C言語のプログラム   
     ・[24475] 初級者 
     ・[24476] non 
   ウインドウサイズの幅 ....   
     ・[24468] ウィン 
     ・[24469] ウィン 
     ・[24470] ウィン 
     ・[24472] Justy 
     ・[244661228364041] ウィン 
   アドバイスをお願いし ....   
     ・[24451] kazuoni 
     ・[24452] 海老天 
     ・[24453] 御津凪 
     ・[24455] 海老天 
     ・[24456] 御津凪 
     ・[24457] 海老天 
     ・[24458] Dixq (管理人) 
   リンク   
     ・[24358] Dixq (管理人) 
     ・[24454] 愚かな平民 
   円の面積について   
     ・[24414] ムンバ 
     ・[24415] box 
     ・[24416] ムンバ 
     ・[24420] GPGA 
     ・[24421] Dixq (管理人) 
     ・[24422] Dixq (管理人) 
     ・[24426] ムンバ 
     ・[24436] lbfuvab 
     ・[24437] ムンバ 
   無題   
     ・[24418] Justy 
     ・[24419] 素人 
     ・[24429] Justy 
   14章で   
     ・[24407] box 
     ・[24408] 海老天 
     ・[24409] non 
     ・[24410] box 
     ・[24411] 海老天 
   Sleepなのですが   
     ・[24391] non 
     ・[24401] 海老天 
     ・[24402] Mist 
     ・[24404] 海老天 
     ・[24405] Mist 
   RPGゲームを作ろうと思 ....   
     ・[24382] array 
     ・[24383] ルルシア 
     ・[24384] Dixq (管理人) 
     ・[24385] Dixq (管理人) 
     ・[24390] バグ 
   DirectInputのマウス関 ....   
     ・[24212] t_white 
     ・[24213] Justy 
     ・[24218] t_white 
     ・[24219] Justy 
     ・[24389] t_white 
   マウスでの回転につい ....   
     ・[24376] 紅葉 
     ・[24378] Justy 
     ・[24379] やそ 
     ・[24387] 紅葉 
   無題   
     ・[24350] non 
     ・[24351] non 
     ・[24352] non 
     ・[24374] C 
     ・[24377] non 
   switch文   
     ・[24354] 御津凪 
     ・[24356] 初心者 
   組み合わせの数   
     ・[24332] box 
     ・[24333] non 
     ・[24355] non 
   3Dでの移動計算   
     ・[23879] たいちう 
     ・[23880] 紅葉 
     ・[23881] たいちう 
     ・[23882] 紅葉 
     ・[23884] たいちう 
     ・[23887] 紅葉 
     ・[23890] たかぎ 
     ・[23891] 紅葉 
     ・[23893] たかぎ 
     ・[23895] 紅葉 
     ・[23904] Justy 
     ・[23915] 紅葉 
     ・[23916] たいちう 
     ・[23917] やそ 
     ・[23932] Justy 
     ・[23933] Justy 
     ・[23939] 紅葉 
     ・[23944] Justy 
     ・[23948] 紅葉 
     ・[23949] Justy 
     ・[23950] 紅葉 
     ・[23954] Mist 
     ・[23966] 紅葉 
     ・[23972] Mist 
     ・[23996] Justy 
     ・[24011] 紅葉 
     ・[24093] Justy 
     ・[24243] 紅葉 
     ・[24256] Justy 
     ・[24265] 紅葉 
     ・[24270] Justy 
     ・[24276] 紅葉 
     ・[24280] Justy 
     ・[24290] 紅葉 
     ・[24293] Justy 
     ・[24296] 紅葉 
     ・[24299] Justy 
     ・[24301] 紅葉 
     ・[24329] Justy 
     ・[24337] 紅葉 
     ・[24338] Justy 
     ・[24339] 紅葉 
     ・[24340] Justy 
     ・[24341] 紅葉 
     ・[24342] 紅葉 
     ・[24343] Justy 
     ・[24344] 紅葉 
     ・[24345] Justy 
     ・[24346] 紅葉 
     ・[24347] 紅葉 
     ・[24348] Justy 
   マウスカーソルが・・ ....   
     ・[24335] kazuoni 
     ・[24336] lbfuvab 
   無題   
     ・[24287] ムンバ 
     ・[24288] ムンバ 
     ・[24291] Dixq (管理人) 
     ・[24292] Dixq (管理人) 
     ・[24303] ムンバ 
     ・[24306] 初心者 
     ・[24307] Mist 
     ・[24308] non 
     ・[24309] 御津凪 
     ・[24311] Dixq (管理人) 
     ・[24312] バグ 
     ・[24313] non 
     ・[24316] バグ 
     ・[24330] 初心者 
   (DXライブラリnoFileR ....   
     ・[24320] 柏 
     ・[24323] 御津凪 
     ・[24326] non 
     ・[24328] 柏 
   図形   
     ・[24310] 御津凪 
     ・[24314] バグ 
     ・[24315] 初心者 
     ・[24317] バグ 
     ・[24318] 初心者 
     ・[24321] バグ 
     ・[24322] バグ 
     ・[24324] 初心者 
     ・[24325] GPGA 
     ・[24327] 初心者 
   Gコード   
     ・[24304] 初心者 
   ステージの開始時間   
     ・[23975] Dixq (管理人) 
     ・[23987] えっと 
     ・[24115] えっと 
     ・[24116] ibis 
     ・[24119] Dixq (管理人) 
     ・[24121] えっと 
     ・[24123] えっと 
     ・[24128] やそ 
     ・[24129] Dixq (管理人) 
     ・[24131] やそ 
     ・[24267] えっと 
     ・[24297] Dixq (管理人) 
   無題   
     ・[24279] non 
     ・[24281] box 
     ・[24284] bigin 
     ・[24286] box 
     ・[24294] Dixq (管理人) 
   GetHitKeyStateAll_2関 ....   
     ・[23204] kazuoni 
     ・[23208] 匿名 
     ・[23210] kazuoni 
     ・[23214] Dixq (管理人) 
     ・[23222] kazuoni 
     ・[23223] Dixq (管理人) 
     ・[23293] 匿名 
     ・[23305] Dixq (管理人) 
     ・[23321] 匿名 
     ・[23323] Dixq (管理人) 
     ・[23437] 匿名 
     ・[23601] 匿名 
     ・[23605] Dixq (管理人) 
     ・[23606] 御津凪 
     ・[23608] Dixq (管理人) 
     ・[23610] 御津凪 
     ・[23653] 匿名 
     ・[23723] Dixq (管理人) 
     ・[23852] 匿名 
     ・[23853] Dixq (管理人) 
     ・[24048] 匿名 
     ・[24049] Dixq (管理人) 
     ・[24230] 匿名 
     ・[24232] Dixq (管理人) 
     ・[24282] 匿名 
   無題   
     ・[24253] array 
     ・[24277] かかし 
   マルチスレッドについ ....   
     ・[24273] 御津凪 
     ・[24274] Mist 
     ・[24275] dic 
   画像の透過処理   
     ・[24242] Mist 
     ・[24249] Justy 
     ・[24250] Dixq (管理人) 
     ・[24263] えっと 
     ・[24266] 紅葉 
     ・[24269] えっと 
     ・[24271] Justy 
   じゃんけんゲーム   
     ・[24192] box 
     ・[24193] situmon 
     ・[24195] situmon 
     ・[24196] ランド 
     ・[24198] Justy 
     ・[24204] situmon 
     ・[24205] non 
     ・[24210] 木霊 
     ・[24214] situmon 
     ・[24216] box 
     ・[24220] conio 
     ・[24244] situmon 
     ・[24245] situmon 
     ・[24255] 組木紙織 
     ・[24257] kazuoni 
     ・[24264] 木霊 
   ファイル操作   
     ・[24087] しょしょしょしんしゃ 
     ・[24090] non 
     ・[24092] しょしょしょしんしゃ 
     ・[24094] Dixq (管理人) 
     ・[24095] Dixq (管理人) 
     ・[24097] 初級者 
     ・[24098] 初級者 
     ・[24100] しょしょしょしんしゃ 
     ・[24105] non 
     ・[24164] しょしょしょしんしゃ 
     ・[24167] non 
     ・[24169] しょしょしょしんしゃ 
     ・[24172] non 
     ・[24173] しょしょしょしんしゃ 
     ・[24175] non 
     ・[24177] non 
     ・[24178] たかぎ 
     ・[24179] non 
     ・[24181] しょしょしょしんしゃ 
     ・[24184] non 
     ・[24185] しょしょしょしんしゃ 
     ・[24186] non 
     ・[24188] しょしょしょしんしゃ 
     ・[24189] non 
     ・[24190] しょしょしょしんしゃ 
     ・[24194] non 
     ・[24197] しょしょしょしんしゃ 
     ・[24203] しょしょしょしんしゃ 
     ・[24211] しょしょしょしんしゃ 
     ・[24254] しょしょしょしんしゃ 
     ・[24259] 組木紙織 
     ・[24260] kazuoni 
   課題   
     ・[24154] box 
     ・[24155] Sleepy 
     ・[24161] non 
     ・[24162] non 
     ・[24224] 774 
     ・[24225] non 
     ・[24239] 774 
     ・[24240] non 
     ・[24247] 774 
     ・[24248] non 
     ・[24252] non 
     ・[24258] 774 
   C言語 文字列判別   
     ・[23970] たかぎ 
     ・[23971] 入門レベル 
     ・[23974] Mist 
     ・[23977] non 
     ・[23978] 入門レベル 
     ・[23979] 入門レベル 
     ・[23980] たかぎ 
     ・[23981] Mist 
     ・[23982] Dixq (管理人) 
     ・[23983] 入門レベル 
     ・[23985] 入門レベル 
     ・[23986] non 
     ・[23988] Mist 
     ・[23989] Mist 
     ・[23990] 入門レベル 
     ・[23991] たかぎ 
     ・[23993] Mist 
     ・[23994] たかぎ 
     ・[23997] non 
     ・[23999] 入門レベル 
     ・[24017] 入門レベル 
     ・[24018] non 
     ・[24019] 入門レベル 
     ・[24020] やそ 
     ・[24021] non 
     ・[24022] 入門レベル 
     ・[24023] non 
     ・[24024] Mist 
     ・[24025] 入門レベル 
     ・[24026] 入門レベル 
     ・[24027] GPGA 
     ・[24028] non 
     ・[24029] 入門レベル 
     ・[24031] non 
     ・[24032] たかぎ 
     ・[24033] 入門レベル 
     ・[24034] たかぎ 
     ・[24035] 入門レベル 
     ・[24036] non 
     ・[24038] 入門レベル 
     ・[24050] たかぎ 
     ・[24061] 入門レベル 
     ・[24062] non 
     ・[24063] 通りすがり 
     ・[24064] たかぎ 
     ・[24065] non 
     ・[24066] non 
     ・[24067] バグ 
     ・[24068] Mist 
     ・[24070] バグ 
     ・[24071] たかぎ 
     ・[24072] non 
     ・[24075] たかぎ 
     ・[24081] non 
     ・[24106] 組木紙織 
     ・[24107] たかぎ 
     ・[24124] non 
     ・[24234] 入門レベル 
     ・[24235] 入門レベル 
     ・[24236] 入門レベル 
     ・[24237] non 
     ・[24238] 入門レベル 
   親子間でプロセス間通 ....   
     ・[24227] toyo 
     ・[24228] Haru 
   アルゴリズムのソース ....   
     ・[24200] たかぎ 
     ・[24202] non 
     ・[24206] neco 
     ・[24207] 組木紙織 
     ・[24221] conio 
     ・[24223] neco 
   教えてください(文字 ....   
     ・[24046] GPGA 
     ・[24051] non 
     ・[24054] GPGA 
     ・[24222] たっくん 
   二重定義・・・?   
     ・[24158] 御津凪 
     ・[24201] J 
   プログラムの構造と誤 ....   
     ・[24126] Dixq (管理人) 
     ・[24130] non 
     ・[24132] box 
     ・[24144] conio 
     ・[24166] girisya 
     ・[24170] non 
     ・[24180] non 
     ・[24183] girisya 
   プログラムの意味   
     ・[24174] 御津凪 
     ・[24176] たかぎ 
   ゲームのシーンをソー ....   
     ・[24171] 御津凪 
   画像と音楽ファイルが ....   
     ・[24140] J 
     ・[24157] 御津凪 
     ・[24160] ぴーすけ 

Name: ひで  ..ぴよぴよ(266ポイント)   Date: 2008/11/19(水) 01:42   No:24289       
Title: パターンマッチング    
openCVを用いてパターンマッチングをするプログラムを作成しています.
プログラムは作ることができるのですが,マッチングを行う原理がわかりません.
今回用いた関数は,「cvMatchTemplate」という関数で,以下のようになっています.

http://opencv.jp/document/opencvref_cv.html#decl_cvMatchTemplate

このマッチング方法として,いくつかの式があるのですが,
これらの式を見ていてもどのようにマッチングが行われているのかがわかりません.
画像処理の教科書を見たりしているのですが,いまいちわかりません.
なにかヒントでも,勉強になるサイトでもかまいません.
この原理を知りたいので,教えてもらいたいと思います.
画像処理に関しては,かなりの素人ですが,よろしくお願いします.


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


Name: Justy  ..ハッカー(271,589ポイント)   Date: 2008/11/19(水) 03:15   No:24300     
Title: Re:パターンマッチング    
 私もあまり詳しくないので間違っているかもしれませんが、
この式の見方は

・ R(x,y)=
 結果として出力される画像データの座標 x, yを意味しています。
 つまり、=の右にある計算結果を結果画像の x, yの位置に格納されます。

・ sum x', y'
 x'と y'は xと yとは別物で、テンプレート画像の全てのピクセル x'=0..w-1, y'=0..h-1の
あらゆる値をとります。

 sumがついているので、テンプレート画像の全てピクセルにおいて
後ろに続くの計算結果の総計となるのでしょう。

・ [T(x',y')-I(x+x',y+y')]^2
 Tがテンプレート画像、Iが入力画像になります。
 従って、テンプレート画像[x', y']の位置のピクセルの値から、
イメージ画像の [x+x', y+y']の位置のピクセルの値を引き、
二乗したもの、という意味になります。

 [x', y']はテンプレート画像の全てのピクセル分ということになるので、
x' × y'回数分計算を行うことになります。

 ここで、先の sumがあるので、それらの全ての計算の結果を足した合計が
結果として出力されるのでしょう。

 つまり、
[x, y]=[0,0]の時
  (T[0,0]-I(0+0, 0+0))^2
  +(T[1,0]-I(0+1, 0+0))^2
  +(T[2,0]-I(0+2, 0+0))^2
  ....
  +(T[w-1,0]-I(0+w-1, 0+0))^2
  +(T[0,1]-I(0+0, 0+1))^2
  +(T[1,1]-I(0+1, 0+1))^2
  ....
[x, y]=[5,6]の時
  (T[0,0]-I(5+0, 6+0))^2
  +(T[1,0]-I(5+1, 6+0))^2
  +(T[2,0]-I(5+2, 6+0))^2
  ....
  +(T[w-1,0]-I(5+w-1, 6+0))^2
  +(T[0,1]-I(5+0, 6+1))^2
  +(T[1,1]-I(5+1, 6+1))^2
  ....

 という感じです。

 まとめると、イメージ画像内をテンプレート画像の一致するかどうか
ずらしながら評価しているのでしょう。


2倍のポイントを手に入れた! 1,038ポイント を手に入れた。

Name: ひで  ..ぴよぴよ(512ポイント)   Date: 2008/11/24(月) 15:08   No:24495 解決!     
Title: Re:パターンマッチング    
詳しい解説,ありがとうございます.
全ての式がわからなかったのですが,画像処理の本を何度も見直しました.
この式はおそらく,ユークリッド距離などを求めて,
類似度を出しているということがわかり,間違っているかもしれませんが,理解することができました.
ありがとうございました.


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



Name: 我九  ..ぴよぴよ(33ポイント)   Date: 2008/11/21(金) 22:43   No:24412       
Title: アルゴリズム    
 問題は平衡性の高速化の文字列の検証です。

 文字列をキーとする二分探索木、AVL木の2つを作成する(追加関数)。
ファイルを読み込み、2種類の木を生成する。
読み込みレコード数(要素数)を以下のように10万ずつ増加させた時点で、
   1万、2万、3万、・・・・・、9万、10万
両木の高さ、および構築時間を測定する。

という問題です。

整数での問題としてはこんな感じかな、とできたんですが
文字列はどこをいじっていいのやら;;

何でも良いので、ヒントなどのせてください。

OS:Linux コンパイラ名:gcc


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


Name: たいちう  ..上級者(16,462ポイント)   Date: 2008/11/22(土) 09:24   No:24424     
Title: Re:アルゴリズム    
> 整数での問題としてはこんな感じかな、とできたんですが
> 文字列はどこをいじっていいのやら;;

文字列の比較にはstrcmpが使えます。


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

Name: non  ..初心者(8,990ポイント)   Date: 2008/11/22(土) 09:59   No:24425     
Title: Re:アルゴリズム    
> 整数での問題としてはこんな感じかな、とできたんですが

プログラムを途中まで見たんですが、あきらかにエラーや警告が出そうです。
ほんとうに出来てるんですか?
字下げは、TABで行って下さい。読みにくいです。





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

Name: Mist  ..プログラマー(33,003ポイント)   Date: 2008/11/22(土) 10:34   No:24427     
Title: Re:アルゴリズム    
>> nonさん
> 字下げは、TABで行って下さい。読みにくいです。

きちんとしたルールの下で字下げされているので私はそんなに見にくいとは思いません。
コーディングスタイルは人それぞれですし、全くされていない、とか無秩序に下げられているとかでもなければ特に問題ないと思いますけど。

>> 我九さん
変数名をnewって名前にするのはやめたほうがいいと思います。
たぶんCでコンパイルしているためエラーになってないものと思いますが、C++のnew演算子と混同してしまいそうです。
あと、add_node関数で値を返さないreturnが存在します。(108行目)


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

Name: 我九  ..ぴよぴよ(212ポイント)   Date: 2008/11/22(土) 10:50   No:24428     
Title: Re:アルゴリズム    
>たいちろうさん
ありがとうございます。
strcmpだろうなというのは分かるんですけど、(入れるであろう大体の場所も)
strcmpとともに何か他の文も入れた方がいいのでしょうか?

>nonさん
一応字下げは行ってあるのですが。。。
ちなみにこのプログラムでのエラーはでてないです。

>Mistさん
ありがとうございます。
それで少し行ってみます。


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

Name: non  ..中級者(9,206ポイント)   Date: 2008/11/22(土) 12:07   No:24433     
Title: Re:アルゴリズム    
>きちんとしたルールの下で字下げされているので私はそんなに見にくいとは思いません。
>コーディングスタイルは人それぞれですし、全くされていない、とか無秩序に下げられているとかでもなけれ
>ば特に問題ないと思いますけど。

まぁ、字下げはされてはいますけど、forやwhileの中のifの{の位置があそこだと、読みにくくって・・
それは、そうと、コンパイルしてみたら確かにエラーは出ませんでした。(new以外は)失礼しました。
mainで使ってない変数と、returnの後の変数がないところまで、読んで止めましたので、きっとコンパイル
しても無駄だと思って、レスしちゃいました。



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

Name: non  ..中級者(9,270ポイント)   Date: 2008/11/22(土) 15:55   No:24440     
Title: Re:アルゴリズム    
ここの意味だけがよくわかりませんでした。

if(((j)/g)==100000){
printf(" %7d %4d %f\n",j,hi,time);
g++;
}

>読み込みレコード数(要素数)を以下のように10万ずつ増加させた時点で、
>   1万、2万、3万、・・・・・、9万、10万
>両木の高さ、および構築時間を測定する。

if(((j)/g)==10000){ の間違いでしょうか?



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

Name: 我九  ..ぴよぴよ(260ポイント)   Date: 2008/11/23(日) 11:40   No:24463     
Title: Re:アルゴリズム    
>nonさん

多分その辺は一応、講師のところから
とってきているんで、間違ってはいないと思います。


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

Name: 初級者  ..かけだし(1,861ポイント)   Date: 2008/11/23(日) 12:27   No:24464     
Title: Re:アルゴリズム    
講師からもらったものがいつも正しいとは限りません。
常に「自分で」確かめることが大事だと思います。


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

Name: non  ..中級者(9,374ポイント)   Date: 2008/11/23(日) 14:16   No:24465     
Title: Re:アルゴリズム    
10万個のデータで1万個おきに、出力されていれば、問題ありません。
私は試しておりませんが、最後の10万個の時にしか、出力されないような気がしたものですから。

ところで、プログラムは完成したでしょうか?


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

Name: 我九  ..ぴよぴよ(337ポイント)   Date: 2008/11/23(日) 22:51   No:24483     
Title: Re:アルゴリズム    
>nonさん

多分大丈夫だと思うんですが、もう一度確かめてみます;;
一応完成したにはしたんですけど、もとのプログラムからさほどいじってないため
結果がちょっとおかしくなってます;;


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



Name: 海老天  ..かけだし(1,682ポイント)   Date: 2008/11/23(日) 02:38   No:24461       
Title: 素材について    
短期間に何度も質問をして申し訳ありません
今回伺いたいことはゲームを作る際に使う絵のフリー素材のことです
まだゲームを作り始めて1週間程度でほとんど形になっていないのですが絵を組み込みたいと思っています
自分で描ければ良いのですが生憎そのような技術は持ち合わせておらずどこかのサイトからダウンロードしたいと思っています
みなさんが利用している素材のサイトなどを良ければ教えてください


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(896,285ポイント)   Date: 2008/11/23(日) 03:29   No:24462     
Title: Re:素材について    
「RPG 素材」で検索したらいくつか出てきます。
しかし、やはりRPGツクール系の素材ばかりになりますよね。
ファーストシードマテリアルなどはツクール以外にも使えたりするので、よいと思います。

※前トピを読んでいる人はRPGを制作されているのがわかると思いますが、なるべく、トピごとにそれだけ読んで意味が解るような質問文にした方がわかりやすいかもしれません。


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

Name: 海老天  ..かけだし(1,712ポイント)   Date: 2008/11/23(日) 19:11   No:24477 解決!     
Title: Re:素材について    
>>管理人様

ありがとうございます
これから質問はわかりやすいように書かせていただきます


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



Name: Musashi  ..ぴよぴよ(26ポイント)   Date: 2008/11/23(日) 17:44   No:24473       
Title: C言語のプログラム    
C言語のプログラムを読もうとしているのですが、初心者故に難儀しており、お助けいただければ幸いです。
プログラムの内に下記のような「CnsktModule* 」の部分があります。
例えば、char *p; のような記述であれば、p はポインタでポインタの指し示す内容はキャラクタの型を
持っていると理解できるのですが、「CnsktModule* 」はどのように解釈したらよいのでしょうか?

CnsktModule* cnsktNew(char *printer, char *locale, char *folder_path, int port_num)
{ 以下省略


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


Name: 初級者  ..かけだし(1,928ポイント)   Date: 2008/11/23(日) 18:55   No:24475     
Title: Re:C言語のプログラム    
http://okwave.jp/qa4500926.html

他の場所で回答をもらった「後」に
別の場所で同じ質問をするのはいかがなものか。
回答内容に不満・不服があれば、最初に質問した場所で
その旨伝えればよい。



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

Name: non  ..中級者(9,374ポイント)   Date: 2008/11/23(日) 19:10   No:24476     
Title: Re:C言語のプログラム    
何のプログラムなんでしょうね。
ぐぐると、canonのドライバぽいのですが。。。。





Name: ウィン  ..ぴよぴよ(141ポイント)   Date: 2008/11/23(日) 14:43   No:24466       
Title: ウインドウサイズの幅と高さを出力するには…    
初投稿です。何卒お願い致します。
はじめての動画ファイルプログラミングの第7章の7−1のサンプルを改造して、
フレームごとの色の特徴量を取れるプログラムを作成しています。省略するのも、良くないと思いますし、文字制限がありますので、区切って書き込みます。

// frame3.cpp DirectShowを使ったフレームの切り出しの応用
// ○list502.h、list502b.cppを合わせて、
//  コンソールアプリケーションで作成すること
// ○[プロジェクト][リンク]にstrmiids.lib を追加
// ○COMの操作はすべてHRESULTを返すが、プログラムを簡単にするため
// 最低限の吟味しか行っていない。

#include <windows.h>
#include <string.h>
#include <dshow.h> // DirectShowのヘッダファイル
#include <qedit.h> // SampleGrabber用
#include <conio.h> // getch()用
#include <stdio.h>
#include "lis.h"

void main( void )
{
// インターフェース用のポインタ
// フィルタグラフ用
IGraphBuilder *pigb = NULL;
IMediaControl *pimc = NULL;
IMediaSeeking *pims = NULL;
// サンプルグラバ用
IBaseFilter *pF = NULL;
ISampleGrabber *pGrab = NULL; // これらは後で解放すること。

IMG0 img00; // 表示ウィンドウ用の構造体
BYTE *buffer; // 外部バッファ
AM_MEDIA_TYPE amt;
WCHAR filename[ MAX_PATH ];
HRESULT hr;

img00.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
img00.x = 100; img00.y = 100;
gr_reg(); // 表示用ウィンドウの登録

CoInitialize(NULL); // COMの準備

// FilterGraphの初期化
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pigb);
// フィルタグラフのインターフェースを得る
pigb -> QueryInterface( IID_IMediaControl, (void **)&pimc );
pigb -> QueryInterface( IID_IMediaSeeking, (void **)&pims );

// グラバフィルタを作りフィルタグラフに追加
CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)&pF);
pF -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab );
pigb -> AddFilter( pF, L"SamGra" );

// グラバフィルタの挿入場所の特定のための設定
ZeroMemory( &amt, sizeof(AM_MEDIA_TYPE) );
amt.majortype = MEDIATYPE_Video;
amt.subtype = MEDIASUBTYPE_RGB24;
amt.formattype = FORMAT_VideoInfo;
pGrab -> SetMediaType(&amt);

OPENFILENAME fname;
static char fn[256];
memset(&fname, 0, sizeof(OPENFILENAME));
fname.lStructSize = sizeof(OPENFILENAME);
fname.lpstrFile = fn; // パス付きファイル名が格納されるアドレス
fname.nMaxFile = sizeof(fn);
fname.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if( ! GetOpenFileName( &fname ) ) return ;

// ファイル名の変換
MultiByteToWideChar( CP_ACP, 0, fn, -1, filename, MAX_PATH );
// 再生するファイルを指定、この時点で使用するフィルタが決まる
hr = pigb -> RenderFile( filename, NULL );
printf( "RenderFile hr %x\n", hr );
if(hr != 0) return;

// ビットマップ情報の取得
pGrab -> GetConnectedMediaType( &amt );
// ビデオ ヘッダーへのポインタを獲得する。
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
img00.bih = ((VIDEOINFOHEADER*)amt.pbFormat) ->bmiHeader;
long n = amt.lSampleSize;
buffer = (BYTE *)malloc( n );
img00.lpBmpData=buffer;

pims -> SetTimeFormat( &(TIME_FORMAT_FRAME) ) ;
// シークをフレーム単位で行うよう設定

〜つづく



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


Name: ウィン  ..ぴよぴよ(0ポイント)   Date: 2008/11/23(日) 14:46   No:24468     
Title: Re:ウインドウサイズの幅と高さを出力するには…    
続き
LONGLONG	nn;

pims -> GetDuration( & nn );
printf("フレーム数 %d\n",nn);
// レンダリングとグラブ

int n0, n1;
printf( "開始フレーム?" );
scanf( "%d", &n0 );
printf( "終了フレーム?" );
scanf( "%d", &n1 );
gr_init( &img00 ); // グラフィックウィンドウを生成

FILE * fp;
char cbuf[300],cbuf2[300];
int i;

i=0; // 結果ファイル名を編集
while(fn[i] != '.'){
cbuf[i] = fn[i];
i++;
}
cbuf[i] = 0;
sprintf( cbuf2 , "%s.csv" , cbuf , nn );
printf( "save [%s]\n",cbuf2 );
fp = fopen( cbuf2,"w");


int j,k;
int ij;
int cnt=0;
int rr,gg,bb;
int total_r=0,total_g=0,total_b=0;
int total_r_ave,total_g_ave,total_b_ave;

pGrab -> SetBufferSamples(TRUE); // グラブ開始
for( nn = n0; nn <= n1; nn=nn+15){
// シーク
pims -> SetPositions( &nn, AM_SEEKING_AbsolutePositioning,
&nn, AM_SEEKING_AbsolutePositioning );

pimc->StopWhenReady();
// シークしてレンダリング
printf( "run at %d\n", nn );

OAFilterState fs;
pimc->GetState( INFINITE, & fs); // レンダリング完了を待つ
pGrab -> GetCurrentBuffer( &n, (long *)buffer );
// グラブ
//for(j = 0; j< 100 *720 * 3;j++) // 画面下部を無視
//buffer[j] = 0;
InvalidateRect( img00.hwnd, NULL, FALSE); // 表示

// 各特徴量の計算

for(i = 0;i< 10 ;i=i++){
for(j = 0;j< 31;j++){
ij = i * 31 + j;
bb = buffer[ ij * 3 ] ; // b
gg = buffer[ ij * 3 +1 ] ; // g
rr = buffer[ ij * 3 +2 ] ; // r
k = rr * 0.299 + gg * 0.587 + bb * 0.114;
if( k > 20 ){
total_r=total_r+rr;
total_g=total_g+gg;
total_b=total_b+bb;


printf("%3d,%3d赤=%3d,緑=%3d,青=%3d\n",i,j,rr,gg,bb);
cnt++;
}
}
}
total_r_ave=total_r/cnt;
total_g_ave=total_g/cnt;
total_b_ave=total_b/cnt;
printf("%3d %3d %3d\n",rr, gg, bb);
printf("赤平均=%3d",total_r_ave); //フレームごとの画面内赤平均値
printf("緑平均=%3d",total_g_ave); //フレームごとの画面内緑平均値
printf("青平均=%3d",total_b_ave); //フレームごとの画面内青平均値
fprintf(fp,"%d , %d , %d \n", rr, gg, bb );


}

fclose( fp );
printf("終了\n");
getch();

// FilterGraph他の開放
pigb -> Release(); pimc -> Release();
pims -> Release();
pF -> Release(); pGrab-> Release();

CoUninitialize();
SendMessage( img00.hwnd, WM_CLOSE, 0, 0 ); // グラフィック画面の終了
free( buffer );

return ;

}

つづく


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

Name: ウィン  ..ぴよぴよ(0ポイント)   Date: 2008/11/23(日) 14:56   No:24469     
Title: Re:ウインドウサイズの幅と高さを出力するには…    
続き

// hojo.cpp
//
// 処理部分を書きやすくするため
// コンソールアプリケーションの形態をとり
//   ウィンドウ関係の処理はスレッドに任せる
//   そのためのスレッド側、ウィンドウ側リスト  
#include "lis.h"

// グラフィック用のウィンドウクラスの登録
int gr_reg( void )
{
WNDCLASSEX wc; // 新しくつくるウインドクラス

memset( &wc, 0, sizeof(WNDCLASSEX) );
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = grProc; // このクラスの持つウインドプロシージャ
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hInstance = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
wc.lpszClassName = "GRC0"; // このクラスの名前
wc.cbWndExtra = 10; // 関連する構造体のポインタ用のエリアを確保
return RegisterClassEx( &wc ); // ウィンドクラスの登録
}

// グラフィックウィンドウの生成,メッセージループ用スレッドの起動
void gr_init( IMG0 * pimg00)
{
DWORD tid;

pimg00 -> hwnd = NULL;
CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)th_Proc,
(void *)pimg00, 0, &tid );
// メッセージループのスレッドを起動
while( !(pimg00 -> hwnd) ); // ウィンドウが表示されるのを待つ
}

// メッセージループのためのスレッド
DWORD th_Proc( void * pp)
{
MSG msg;

int sm0 = GetSystemMetrics( SM_CYCAPTION );
int sm1 = GetSystemMetrics( SM_CXFIXEDFRAME ); // WS_OVRELAPPの場合、枠の太さは
int sm2 = GetSystemMetrics( SM_CYFIXEDFRAME ); // SM_C?FIXEDFRAMEになる
// 必ずスレッドの中でウィンドウを作る
((IMG0 *)pp) -> hwnd = CreateWindow( "GRC0", // クラスの名前
"...",
WS_OVERLAPPED | WS_VISIBLE, // ウィンドウの属性
((IMG0 *)pp) -> x, ((IMG0 *)pp) -> y, // 表示位置
((IMG0 *)pp) -> bih.biWidth + sm1 * 2, // 描画サイズから大きさを計算
((IMG0 *)pp) -> bih.biHeight + sm0 + sm2 * 2,
HWND_DESKTOP, // 親はディスクトップ
NULL, ((IMG0 *)pp)->hi, NULL );
SetWindowLong(((IMG0 *)pp) -> hwnd, 0, (LONG)pp);
while( GetMessage( &msg, NULL, 0, 0 ) ){
DispatchMessage( &msg );
}

return 0;
}

// ウィンドウプロシージャ,再描画のみを行う
LRESULT CALLBACK grProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
IMG0 * pimg;
PAINTSTRUCT ps;

pimg = (IMG0 * )GetWindowLong( hwnd , 0 ); // 拡張ウィンドウメモリより
// このウィンドウ用データへの
// ポインタを取り出す
switch (msg) {

case WM_PAINT: // ビットマップの描画
BeginPaint( hwnd, &ps );
SetDIBitsToDevice( ps.hdc, 0, 0, // コピー先x,y座標
pimg -> bih.biWidth, // DIBの幅
pimg -> bih.biHeight, // DIBの高さ
0, 0, // DIBの座標
0, // 走査線
pimg -> bih.biHeight, // 走査線数
pimg -> lpBmpData,
(BITMAPINFO *)&( pimg -> bih), // BITMAPINFOにキャスト
DIB_RGB_COLORS );
EndPaint( hwnd, &ps );
return 0;

case WM_DESTROY: // スレッドの
PostQuitMessage( 0 ); // メッセージループを終了させる
break;

default:
return DefWindowProc( hwnd, msg, wp, lp );
}
return 0;

}

//
// lis.h
//
#include <Windows.h>
#include <vfw.h> // Video for Windows include file

// グラフィック用ウィンドウのデータをまとめた構造体
typedef struct{
HINSTANCE hi;
int x; // 表示開始位置
int y;
HWND hwnd; // 自分のウィンドウハンドル
BYTE *lpBmpData; // BMPのデータ部分
BITMAPINFOHEADER bih;
} IMG0;

int gr_reg( void );
void gr_init(IMG0 *);
DWORD th_Proc( void *);
LRESULT CALLBACK grProc( HWND, UINT, WPARAM, LPARAM );



私が知りたいのは、for(i = 0;i< 10 ;i=i++){
for(j = 0;j< 31;j++){
の部分を変数を使って、for(i = 0;i< width ;i=i++){
for(j = 0;j< height;j++){
という風にしたいです。動画ファイル再生時のウインドウサイズを読み取って、変数に格納出来れば
どのようなファイルでも画面全体の特徴量を求められます。
ソースのビルドはしっかり出来ています。

動画関連の質問を尋ねている感じですが、実際はウインドウサイズを変数に入れてそれを利用したいというのが中身です。恥ずかしい話、ウインドウ関連のCはあまり知りません。
皆様どうか、ご教授お願い致します。


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

Name: ウィン  ..ぴよぴよ(60ポイント)   Date: 2008/11/23(日) 14:57   No:24470     
Title: Re:ウインドウサイズの幅と高さを出力するには…    
忘れていました。
サンプルプログラムは
http://www.cqpub.co.jp/shoseki/mycomputer/pic019/
ここの7章の7−1から取りました。


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

Name: Justy  ..ハッカー(272,546ポイント)   Date: 2008/11/23(日) 15:58   No:24472     
Title: Re:ウインドウサイズの幅と高さを出力するには…    
 本当にウインドウサイズでいいのですか?

 ウインドウサイズでいいのなら、CreateWindow()で与えている第6・7引数の値が
それぞれウインドウの幅と高さになります。
 それを記憶しておけばいいでしょう。


 でもウインドウサイズではなく、動画のサイズが欲しいので有れば、
img00変数のメンバ bih.biWidthと bih.biHeightにそれぞれ入っています。



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

Name: ウィン   Date: 2008/12/04(木) 13:14   No:244661228364041 解決!     
Title: Re:ウインドウサイズの幅と高さを出力するには…    
すっかり、間が空きましたが
その通りに設定したら、しっかり入りました。
ありがとうございました。




Name: 海老天  ..かけだし(1,459ポイント)   Date: 2008/11/22(土) 20:31   No:24449       
Title: アドバイスをお願いします    
RPGを作りたいと思い25章までを勉強し終わったのですが次に何をしてよいのか具体的にわかりません。
サンプルプログラミングの館に公開されている管理人様のRPGのサンプルなどのソースを参考にすればいいのでしょうか?
アドバイスをお願いいたします。


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


Name: kazuoni  ..プログラマー(37,795ポイント)   Date: 2008/11/22(土) 20:43   No:24451     
Title: Re:アドバイスをお願いします    
自分が踏んでいた道のりを・・・^^;

とりあえずマップ移動の幅を広げる

アイテムを作る

メニュー画面をつける

敵を作る

戦闘を作る



これだけやるでも案外メンドイです。。どれぐらいの規模のRPGか分からないですけど・・・
まずはシンプルな感じにして進めていったほうが挫折しないと思います。
(若干自分は規模のせいで制作が止まってますが・・・w)

ここまで出来てれば、ストーリ、タイトル画面、セーブ機能などをつけていけばいい気がします。
管理人さんのを参考にするのは良いことだと思います。
が、考え方を理解しての参考でないと、あとあと管理に面倒になってくるのは気を付けてください。

このアドバイス参考にならないですね^^;
がんばってください。


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

Name: 海老天  ..かけだし(1,550ポイント)   Date: 2008/11/22(土) 21:24   No:24452     
Title: Re:アドバイスをお願いします    
>>kazuoniさん
そうなのですか参考になります

ところでゲームを作る際には複数のソースに分けて書いていますか?
あまり詳しく知らず確かオブジェクト指向と呼ぶと記憶していますが、やはり覚えたほうがいいのでしょうか?


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

Name: 御津凪 [URL]  ..プログラマー(38,152ポイント)   Date: 2008/11/22(土) 21:56   No:24453     
Title: Re:アドバイスをお願いします    
複数のソースに分ける(各ファイルに分割)のは、オブジェクト指向とは言いません。
オブジェクト指向は、簡潔に言えば「物体(オブジェクト)」を中心とした処理方法のことを言います。
(あってるかな?)

たとえば、「キャラクター」というオブジェクトがあるとします。
この「キャラクター」に対し、「走る」や、「ジャンプをする」、「必殺技を出す」などが
命令対象になります。

↓コードにするとこんな感じ
struct Character{

void Run(){/*走る*/}
void Jump(){/*ジャンプ*/
void SkillAction(){/*必殺技*/}
};


もしオブジェクト指向として作る場合(そうでなくても規模が大きくなれば)、
作業効率を考えてオブジェクト(あるいは機能)ごとにファイルを分けると楽です。
(一つのファイルの中に沢山のオブジェクトがゴチャゴチャしてたら見づらいし扱いづらいくなります)

RPG であれば、簡易的に分けると、
・システム周り(入力・描画など)
・各シーン(タイトル・戦闘シーンなど)
・メニューなどのUI周り
・キャラクター
・マップ
・イベント
・各種アイテム
・セーブデータ
ぐらいでしょうか。


オブジェクト指向は原理を知らないとうまく書けませんが、
知ってしまえばすらすらと書いていくことが出来ます。

また、C言語として書くとしても、規模が大きくなれば、
機能ごとに分けるのが必須となるでしょう。

# ちなみに私は機能(オブジェクト)ごとにファイルを分けて書く派です。




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

Name: 海老天  ..かけだし(1,589ポイント)   Date: 2008/11/22(土) 23:14   No:24455     
Title: Re:アドバイスをお願いします    
>>御津凪さん

そうなのですか
大学に入って2年経つのですがそんなことはまったく教えてもらっていませんでした
C言語関係のサイトはほどほどに見て回っているのですが分割のやり方が載っているサイトを知りません
学びたいのですがどこかいいサイトをご存じないでしょうか?


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

Name: 御津凪 [URL]  ..プログラマー(38,350ポイント)   Date: 2008/11/23(日) 00:39   No:24456     
Title: Re:アドバイスをお願いします    
サラっと検索したらよさそうなサイトを見つけたのでリンクを貼って置きます。
http://www.geocities.jp/ky_webid/c/index.html (ここの32章)

ソースファイルの分割自体は難しくは無いのですが、コンパイラによっては、
コンパイルの設定の変更などが必要になったりする(メイクファイルとか)ので、
恐らくもう少し後で学ぶと思いますよ。

VC++ のような総合開発環境であれば、
ほとんどがファイル分割の対応を自動で行ってくれているので、
上記のような少し面倒なことをする必要はないですよ。


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

Name: 海老天  ..かけだし(1,612ポイント)   Date: 2008/11/23(日) 01:17   No:24457 解決!     
Title: Re:アドバイスをお願いします    
ありがとうございます!大変参考になりました
これから目を通してみたいと思います


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(895,790ポイント)   Date: 2008/11/23(日) 01:31   No:24458     
Title: Re:アドバイスをお願いします    
せっかくなのでうちのリンクも貼っておきますね。

分割コンパイル
http://dixq.net/s/5.html

しかし、こういう書き方は変数が多くなってきたりすると面倒なことになるので、

龍神録プログラミングの館みたいな書き方も出来ます
http://dixq.net/rp/

フォーマットがすでに作られているので、プロジェクトをダウンロードしてそれを使うことも出来ます。


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



Name: 愚かな平民 [URL]  ..ぴよぴよ(8ポイント)   Date: 2008/11/20(木) 13:43   No:24357       
Title: リンク    
全然関係ない話題ですいません。
ブログにリンク貼らせて
もらってもよろしいでしょうか。
問題があれば外します。


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


Name: Dixq (管理人)  ..伝説なるハッカー(892,010ポイント)   Date: 2008/11/20(木) 14:09   No:24358     
Title: Re:リンク    
初めまして。こんにちは(^^
ご連絡ありがとうございます。
リンクフリーですので、全く問題無いです。
むしろありがとうございますm(_ _)m


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

Name: 愚かな平民 [URL]  ..ぴよぴよ(31ポイント)   Date: 2008/11/22(土) 22:47   No:24454 解決!     
Title: Re:リンク    
わかりました。
これからよろしくお願いします。


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



Name: ムンバ  ..中級者(10,833ポイント)   Date: 2008/11/22(土) 00:59   No:24413       
Title: 円の面積について    
こんばんは。お世話になります。
テンプレート使わせて頂きます。^^

[1] 質問文
 [1.1] 自分が今行いたい事は何か

 自分が今行いたい事
 ・C言語を使ってゲームを作りたい。
 ・職場での個人の労働時間(時給とか)と交通費などを
  簡単に計算できるプログラムを作りたい。(自分個人で使用)
 ・今、読んでるC言語の参考書を最後まで読む。

 質問
  今、参考させて頂いている参考書の「関数」という項目の練習問題で

  「1!, 2!, 3!, 4!, …, 10!」の値を表示するプログラムを作って下さい。

  と、ありました。 

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

  練習問題に対する自分の解答プログラムを添付させて頂きます。
  (できれば、まだ見ないで下さい。添付しといて、ごめんなさい。)
    
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)

  参考書の模範解答と自分の作ったプログラムが、ぜんぜん違ってました。^^;

 [1.4] 今何がわからないのか、知りたいのか

  「1!, 2!, 3!, 4!, …, 10!」の値を表示するプログラムを作って下さい。

  と問題があった場合、皆さんは、どの様なプログラムを書かれますか?

  自分が練習問題の問いと、あまりにもかけ離れた解答をしてたので質問させて頂きました。(涙
  お時間のある方、ご意見よろしくお願い致します。
  管理人さんには、ご迷惑をお掛けする事と思いますが
  可能であれば、こちらの掲示板に解答プログラムを添付頂けるとありがたいです。
  勝手で、すみません。
  この先、勉強するために皆さんのプログラムが自分のと、どのように違うのか知りたいです。
  皆様の優劣とかレベルとかを試したいのではありません。純粋に、お聞きしたいです。
  宜しくお願い致します。(謝

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : VC++ 2008

[3] その他
 ・どの程度C言語を理解しているか

  参考書の項目で言いますと
  プログラムのしくみ・C言語の基本・変数とデータ型・式と演算子・制御文・関数
  まで、だと思われます。^^;
  この先の勉強は、配列・ポインタ・構造体などです。
  
 ・ライブラリを使っている場合は何を使っているか
  
  標準ライブラリです。


2倍のポイントを手に入れた! 1,446ポイント を手に入れた。


Name: ムンバ  ..中級者(10,912ポイント)   Date: 2008/11/22(土) 01:03   No:24414     
Title: Re:円の面積について    
すみません。↑タイトル間違ってました。
パス入れるの忘れてしまったので訂正できません。(激汗
↑タイトルは、「値を表示するプログラム」に訂正です。ごめんなさい。


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

Name: box  ..ハッカー(129,644ポイント)   Date: 2008/11/22(土) 01:09   No:24415     
Title: Re:円の面積について    
階乗の定義はご存じですか?
定義の中に掛け算をするところがあるのに、
提示のコードには見あたりません。
その1点だけを見ても、正しくないことがわかります。


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

Name: ムンバ  ..中級者(11,022ポイント)   Date: 2008/11/22(土) 01:19   No:24416     
Title: Re:円の面積について    
半径×半径×π ですよね?^^;
すみません。私がタイトルを間違ってしまってます。
ご迷惑おかけします。boxさん、ごめんなさい。

管理人さん、お忙しい所大変申し訳ございませんが
このタイトル、修正して頂けないでしょうか?
今度から、パスワード入れ忘れない様に気をつけますので、すみません。
お時間ある時にでも、宜しくお願い致します。(謝


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

Name: GPGA  ..熟練のプログラマー(53,808ポイント)   Date: 2008/11/22(土) 05:39   No:24420     
Title: Re:円の面積について    
こんなのを書きます。

#include <stdio.h>
int Func(int n) {
return (n > 0) ? printf("%d!, ", Func(n - 1)), n + 1 : n + 1;
}

int main() {
Func(10);
return 0;
}
 


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

Name: Dixq (管理人)  ..伝説なるハッカー(895,216ポイント)   Date: 2008/11/22(土) 05:52   No:24421     
Title: Re:円の面積について    
いや、そうではなくて、階乗の定義をboxさんはお聞きになっているのだと思います。
3!や4!は(√2)のようにある別の数値を表すものです。

「(√2)、(√3)...の数値を表示するプログラムを書きなさい」という問題に対して
「printf("(√2)、(√3)...");」
のように書くのはおかしいですよね。

計算結果を表示させてください。
階乗の定義をご存じなかったらググってください。
これは簡単なので、答えを書かずに自分で解いたほうがためになると思います。

また、これは再帰関数を勉強するよい機会です。
for文などの方が最初わかりやすいでしょうから、まずfor文などのループ文で書き、
できたら再帰関数で作ってみてください。

後、
[1] 質問文
 [1.1] 自分が今行いたい事は何か
には、その質問について限定して書いてください。
話す要点を先に言って、人に伝えやすくする為です。
例えば再帰関数について質問する時、
「自分は今クイックソートについて理解したいのです。その為にまず再帰関数を勉強しようと思っています」
のように冒頭にかけば、これから続く文章を読む助けになります。

もし詳しい理由に興味ありましたら、今日の私のブログご覧ください
http://directxq.blog58.fc2.com/

たとえば自分はクイックソートについて質問しようとしているのに冒頭で

[1.1] 自分が今行いたい事は何か
→「今私はバイクのメンテナンスがしたいです」

とか書いても後に続く文章を読む助けにならないのです。
もちろん他の部分で雑談としてお書きになるのは構わないのですが、[1.1]に書く内容は上で説明したことに限定してください。


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

Name: Dixq (管理人)  ..伝説なるハッカー(895,295ポイント)   Date: 2008/11/22(土) 05:55   No:24422     
Title: Re:円の面積について    
こんな時間だからと思ってのんびり書いてたら・・・^^;

×再帰関数で作ってみてください。
○GPGAさんのプログラムを参考にしてください。

訂正しますw


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

Name: ムンバ  ..中級者(11,434ポイント)   Date: 2008/11/22(土) 10:33   No:24426 解決!     
Title: Re:円の面積について    
おはようございます。
早速のご解説ありがとうございます。

すみません。私の勘違いでした。
参考書の解答を見てみたら、皆さんの言われてる階乗でした。
(勉強のため、できるだけ解答は見ないようにしてます。)
お恥ずかしい。^^;

boxさん、GPGAさんありがとうございます。

参考書の解答


#include <stdio.h>

int kaijo(int n)
{
if (n == 0)
return 1;
else
return n * kaijo(n - 1);
}

int main()
{
int n;

for (n = 1; n <= 10; n++)
printf("%2d! = %d\n", n, kaijo(n));

return 0;
}


関数が kaijo になってました。^^;

管理人さん、お騒がせしてすみませんでした。
再帰関数は、この章の解説にありましたが結びつきませんでした。
質問させて頂いて良かったです。
言われる様に、もう1度勉強しなおします。

>[1.1]に書く内容は上で説明したことに限定してください。
また日記みたいな事を書いてしまいました。
了解致しました。以後、気をつけます。ごめんなさい。
&寝不足には注意です。w

また見当違いな質問をしてしまうかもしれませんが
その節は、また宜しくお願い致します。
どうもありがとうございました。


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

Name: lbfuvab  ..初心者(8,079ポイント)   Date: 2008/11/22(土) 14:31   No:24436     
Title: Re:円の面積について    

int fact(int n){
int ret=1;
while(n)ret*=n--;
return ret;
}

とかもありですね。


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

Name: ムンバ  ..中級者(11,405ポイント)   Date: 2008/11/22(土) 14:54   No:24437 解決!     
Title: Re:円の面積について    
どうもありがとうございます。
勉強させて頂きます!


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



Name: 素人  ..初心者(8,652ポイント)   Date: 2008/11/22(土) 03:03   No:24417       
Title: 無題    
はじめまして。ゲームプログラミングの館から来ました。
c言語の勉強の最中です。
vc++2008 EEを使用しています。

入門編の0章でDxLib_VC2008_and_2005用.slnを実行するところがありますが、
どうやっても実行できません。
エラーすら出ず、ダブルクリックしても反応すらしない状態です。
対処法はありますでしょうか?

DXライブラリの設定は、恐らく大丈夫だと思います。
(設定方法が載っているサイトの点を打つプログラムが動きましたので)

なにとぞよろしくお願いします。


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


Name: Justy  ..ハッカー(272,207ポイント)   Date: 2008/11/22(土) 03:35   No:24418     
Title: Re:無題    
 直接 slnファイルを Visual Studioにドラッグ&ドロップする、
或いは Visual Studioのファイルメニューからソリューションを指定して
開いてみてはどうでしょうか。

 それでうまくいけば、プロジェクトの変換ダイアログが出るかと思います。


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

Name: 素人  ..初心者(8,654ポイント)   Date: 2008/11/22(土) 04:59   No:24419 解決!     
Title: Re:無題    
Justyさん、ありがとうございます。
ドラッグ&ドロップでやるとできました(無事に画像も出ました)。
ほんとにありがとうございます。





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

Name: Justy  ..ハッカー(272,386ポイント)   Date: 2008/11/22(土) 11:31   No:24429     
Title: Re:無題    
 一応解決したようですが、根本的に slnファイルをダブルクリックで開いても
全く何も反応がないというのは、何かがおかしいのです。

 "DxLib_VC2008_and_2005用.sln"だけの話ならいいのですが、他の slnや projファイルも
同様な現象を起こしているようでしたら、なんとかしないとわざわざドラッグするのも
面倒ですよね?

 これが .txtファイルとかでもエディタが起動しない、などの現象でしたらOSを
何とかするしかないのですが、影響が VisualStudio関連(sln/proj)だけでしたら
一端 VisualStudioをアンストールして、再インストールを行った方がいいのかもしれません。


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



Name: 海老天  ..ぴよぴよ(623ポイント)   Date: 2008/11/21(金) 20:27   No:24406       
Title: 14章で    
14章において
image = LoadGraph( "char.png" ) ;
と記述するところがありますがここと13章の内容を組み合わせて画面を歩いて行くプログラムを作りたいと思い

int i,image[16];

for(i = 16;i > 0;i--)
{
 image[i] = LoadGraph("e/char%d.png",i);
}

のように記述しようとしたのですがどうもうまくいきません
%dの部分にiと同じ値が入っているようにしたいのですがどうすればいいでしょうか?


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


Name: box  ..ハッカー(129,574ポイント)   Date: 2008/11/21(金) 20:39   No:24407     
Title: Re:14章で    

> のように記述しようとしたのですがどうもうまくいきません

うまくいきません、とは、具体的にどうなることを指していますか?
コンパイルエラーが出たならそのときのメッセージを、
実行時エラーが出たならそのときのメッセージを、提示してください。

> %dの部分にiと同じ値が入っているようにしたいのですがどうすればいいでしょうか?

やったこともない私ごときの者が推測でものを言うのはおこがましいですが、

char str[40];

for (i = 16; i > 0; --i) {
sprintf(str, "e:\\char%d.png", i);
LoadGraph(str);
}

あたりでうまくいきませんか?


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

Name: 海老天  ..ぴよぴよ(723ポイント)   Date: 2008/11/21(金) 20:49   No:24408     
Title: Re:14章で    
返信ありがとうございます
エラーは一切出ず、ただ画像が全く読み込まれていないようです
教えていただいた通りにやってみたのですがうまくいきませんでした
LoadGraphの()の中で
printf("%d",i);
のような記述は不可能なのでしょうか?


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

Name: non  ..初心者(8,952ポイント)   Date: 2008/11/21(金) 20:57   No:24409     
Title: Re:14章で    
いろいろ試すのはいいと思いますが、19章まで行けば、歩きますよ。

>LoadGraphの()の中で
>printf("%d",i);
>のような記述は不可能なのでしょうか?

それは、無理なので、boxさんがいわれるようにsprintfを使うのでしょう。
それで海老天さんは16枚の絵を用意したのですか。
DrawGraphも16回ウェイトを入れて繰り返したのでしょうか?



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

Name: box  ..ハッカー(129,608ポイント)   Date: 2008/11/21(金) 21:03   No:24410     
Title: Re:14章で    
> int i,image[16];
>
> for(i = 16;i > 0;i--)
> {
>  image[i] = LoadGraph("e/char%d.png",i);
> }

i が 16 のとき、配列 image[] の定義範囲外の領域にアクセスしています。
本題と関係あるかどうかはわかりませんが、まずいと思います。


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

Name: 海老天  ..かけだし(1,379ポイント)   Date: 2008/11/21(金) 21:14   No:24411 解決!     
Title: Re:14章で    
>>nonさん
絵はchar.pngを分割して16枚用意しました
今17章を見たところ今やっている方法よりも優れた方法で行われているようですのでそちらを参考にしてみようと思います
アドバイスありがとうございました


>>boxさん
今気が付きました
ありがとうございます


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



Name: 海老天  ..ぴよぴよ(187ポイント)   Date: 2008/11/21(金) 02:50   No:24388       
Title: Sleepなのですが    
ゲームプログラミングの館の12.画像を動かすの所を今やっているのですが画像が動いてくれません。
最初はSleepに入れる値が少なすぎると思ったのですが1000を入れると今度はフリーズして動かなくなりました。
プログラムはコピーなのであっていると思うのですがどうしていいかわかりません。アドバイスをお願いします。

使用OS Windows Vista
使用コンパイラ Visual C++ 2008 Express Edition


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


Name: non  ..初心者(8,836ポイント)   Date: 2008/11/21(金) 08:53   No:24391     
Title: Re:Sleepなのですが    
もう少し、詳しく状況を書かないと、フォローしようがありません。
1 その前の所までは順調に動いていた。
2 12のプログラムをコピペしたが画像が動かない。
 (ということは、左上にchar.pngの画像が出たまま)
3 Sleepを1000にしたら、フリーズした。
 (ということは、Sleepが10のときは、何かキーを押したら終了していた)

まず、Sleep(1000)は1秒ですから、300秒、5分しないと終わりません。5分以上立ってもフリーズでしたか。
ビルドしたときにエラーは出ませんでしたか?

短いプログラムですから、コピペを失敗していないか、そのプログラムを掲示板にコピペしてください。


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

Name: 海老天  ..ぴよぴよ(439ポイント)   Date: 2008/11/21(金) 18:24   No:24401     
Title: Re:Sleepなのですが    
5分間は確認していませんでした
5分間も試したのですが画像が右上に表示されることもなく12の実行結果の状態にいきなり移行してしまいます。
エラーは特に出ていませんでした

プログラムは
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了


int i ;
for(i=0;i<300;i++){
LoadGraphScreen( i , 0 , "char.png" , TRUE ); //画像を描画
Sleep(10); //10ミリ秒待つ
}


WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

です
どこかまずいところがあったでしょうか?


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

Name: Mist  ..プログラマー(32,913ポイント)   Date: 2008/11/21(金) 18:39   No:24402     
Title: Re:Sleepなのですが    
OSがVistaなんですよね。
VistaはXP以前と画像処理周りが少し違うらしく、裏画面を使用しないプログラムは正しく動作しないことがあるそうです。
ですので、そのプログラムを正しく動作させるのは無理かと思います。

通常、裏画面を使用しないでゲーム作りをすることはありませんので13章へ進まれてはどうでしょうか。


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

Name: 海老天  ..ぴよぴよ(470ポイント)   Date: 2008/11/21(金) 18:47   No:24404 解決!     
Title: Re:Sleepなのですが    
ありがとうございます
そうなのですかわかりました
次の章に進んでみようと思います


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

Name: Mist  ..プログラマー(32,807ポイント)   Date: 2008/11/21(金) 18:51   No:24405     
Title: Re:Sleepなのですが    
本家掲示板の同様の問題についてのスレです。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1028

> 管理人さんへ
上記スレのDXライブラリ作者さんの回答にもあるとおり、Vistaでの不具合は対応されることもなさそうなので表画面使用のサンプルについては注意書きでも入れておいたほうがよいのではないでしょうか。


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



Name: ルルシア  ..ぴよぴよ(79ポイント)   Date: 2008/11/20(木) 23:10   No:24381       
Title: RPGゲームを作ろうと思ってるんですが…。    
現在RPG作成中なんですがキャラ移動などはこちらのサイトの内容を参考して作らせていただきましたが会話イベント中の「はい」「いいえ」などの分岐はどのようなプログラムで考えればよろしいでしょうか?

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


Name: array [URL]  ..プログラマー(38,816ポイント)   Date: 2008/11/21(金) 00:11   No:24382     
Title: Re:RPGゲームを作ろうと思ってるんですが…。    
キャラ移動は、できているみたいなので、文字列の描画や画像の描画は大丈夫だと思います。

> 「はい」「いいえ」などの分岐はどのようなプログラムで考えればよろしいでしょうか?
分岐のプログラムはswitch文で分岐するのが大半みたいです。

分岐させるにはどちらを選択しているか判断する必要があるので「ポイント」を用意します

まず描画するのは以下の3つで良いと思います。
1.「はい」
2.「いいえ」
3.どちらを選択してるか判断するポイント

画像、もしくは文字を描画する際、どの位置に表示させるか座標(X,Y)を指定しますよね。
その一例として書いておきます
例)
「はい」 (0、 0)←(10、0)
「いいえ」(0、10)
矢印(←)がどちらを指定しているかのポイントです。
キャラ移動と同じ要領で、ポイント(←)を動かします。

上記の状態から、キーボードから[↓]を入力してポイントを移動させます。
例)
「はい」 (0、 0)
「いいえ」(0、10)←(10、10)

このポイントの位置で処理を分岐させればいいと思います。


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

Name: ルルシア  ..ぴよぴよ(111ポイント)   Date: 2008/11/21(金) 00:19   No:24383 解決!     
Title: Re:RPGゲームを作ろうと思ってるんですが…。    
なるほど、switch文を使うんですね。ありがとうございます!

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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(894,602ポイント)   Date: 2008/11/21(金) 00:40   No:24384     
Title: Re:RPGゲームを作ろうと思ってるんですが…。    
サンプル作ってみました。
ファイルわけしたらもっと効率的になるんですけどねぇ。
サンプル実行して上下キー及びZキーを押したりしてサンプルの動作を見てみて下さい。



#include "DxLib.h"

/* セレクト項目の最大数 */
#define SELECT_ELEMENT_MAX 10

/* セレクト項目の要素 */
typedef struct{
int iX, iY;
char cName[128];
}Element_t;

/* セレクト項目要素の親 */
typedef struct{
int iNum; //今選択されている番号
int iMax; //登録されている数
Element_t Element[ SELECT_ELEMENT_MAX ];
}Select_t;

/* キー状態格納変数 */
int Key[256];

/* キー入力管理関数 */
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++)
{
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

/* 呼ぶ関数を制御する変数 */
int FunctionState;

/* セレクト要素にメニュー情報を登録する */
void EnterSelectString( Select_t *Sel, int iX, int iY, char cStr[] ){
strcpy( Sel->Element[ Sel->iMax ].cName, cStr ); //文字列格納
Sel->Element[ Sel->iMax ].iX = iX; //座標格納
Sel->Element[ Sel->iMax ].iY = iY;
Sel->iMax++; //今いくつ要素が入っているかカウント
}

/* セレクト情報初期化 */
void SelectIni( Select_t *Sel ){
memset ( Sel, 0, sizeof(Select_t) ); //全て0に
EnterSelectString( Sel , 100, 100, "メニュー0" );
EnterSelectString( Sel , 100, 150, "メニュー1" );
EnterSelectString( Sel , 100, 200, "メニュー2" );
EnterSelectString( Sel , 100, 250, "メニュー3" );
EnterSelectString( Sel , 100, 300, "メニュー4" );
EnterSelectString( Sel , 400, 450, "メニューA" );
FunctionState=1; //次の関数を呼ぶ
}

/* キー入力などからセレクト状況を計算する */
void SelectCalc( Select_t *Sel){
/* 上下キーが押されたら現在選択されている番号を表す->iNumを変化させる */
if( Key[ KEY_INPUT_UP ] == 1 )
{
Sel->iNum--;
if( Sel->iNum < 0 )
{
Sel->iNum = Sel->iMax - 1 ;
}
}
if( Key[ KEY_INPUT_DOWN ] == 1 )
{
Sel->iNum = (++Sel->iNum) % Sel->iMax ;
}
}

/* セレクト項目と現在のセレクト状況描画 */
void SelectGraph( Select_t Sel){
int i, Col = GetColor(255,255,255) ;
for(i=0; i<Sel.iMax; i++)
{
DrawFormatString( Sel.Element[ i ].iX, Sel.Element[ i ].iY, Col, "%s", Sel.Element[ i ].cName );
}
DrawCircle( Sel.Element[ Sel.iNum ].iX-20, Sel.Element[ Sel.iNum ].iY+7, 7, Col, TRUE );
}

/* セレクトメイン */
void SelectMain( Select_t *Sel ){
SelectCalc( Sel ); //計算
SelectGraph( *Sel );//描画
if( Key[ KEY_INPUT_Z ] == 1 )
{
FunctionState = 2;//けって〜
}
}

//決定されて2秒間その項目を表示する
void Decided( Select_t Sel ){
int Col = GetColor( 255, 255, 255 );
static int cnt=0;
DrawFormatString( 100, 100, Col, "%sが選択されました。", Sel.Element[ Sel.iNum ].cName );
cnt++;
if( cnt > 120 )//60FPSのモニタで2秒たったら
{
cnt = 0;
FunctionState = 0;
}
}

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

Select_t Select;

ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
switch(FunctionState){
case 0:
//初期化
SelectIni( &Select );
break;
case 1:
//メイン計算
SelectMain( &Select );
break;
case 2:
//決定した瞬間その項目を表示->0に戻る
Decided( Select );
break;
}
ScreenFlip();
}

DxLib_End();
return 0;
}
 


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(894,764ポイント)   Date: 2008/11/21(金) 00:52   No:24385     
Title: Re:RPGゲームを作ろうと思ってるんですが…。    
あ、DXライブラリじゃなかったらごめんなさい。
なんかちょうどmixiのDXライブラリコミュでRPGの記事見てたのでDXライブラリだと思ってしまいました^^;
別にDXライブラリじゃなくてもアルゴリズム的には何にでも使えると思います。
もし処理の流れがよくわからなかったら補足するので遠慮なく言って下さい。
ただこれは私がやってる方法だというだけでいい方法かどうか知りませんのでその辺はご了承下さい・・。


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

Name: バグ  ..ハッカー(126,205ポイント)   Date: 2008/11/21(金) 07:08   No:24390     
Title: Re:RPGゲームを作ろうと思ってるんですが…。    
いっそのこと、メッセージボックスを使うというのはどうでしょ?(^_^;)

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



Name: t_white  ..入門者(3,811ポイント)   Date: 2008/11/16(日) 22:57   No:24209       
Title: DirectInputのマウス関連についての質問です。    
どうもこんばんはです。

DirectInputを用いて入力関連を扱うクラスを作っているのですが、
通常のマウスカーソルと同じ座標を取得するにはどうしたら良いのでしょうか。
協調レベルがDISCL_NONEXCLUSIVE(非排他的アクセス)で表示される通常のマウスカーソルが指している座標を取得したいのです。

軸モードが相対値のまま、


// 毎ループ呼ばれる状態更新用の関数です。
HRESULT CInputMouse::UpdateState()
{
HRESULT rc;

// 添え字の切り替え(0⇔1)(ボタンを押した直後判定用に状態を現在と一つ前の二つ取得してます)(lXとか座標の状態まで二重に取得する必要は無いのでボタン用に配列つくって分けちゃったほうがよかったかも・・・)
m_NowBufNo=1-m_NowBufNo;

// アクセス権を取得する前に初期化
ZeroMemory(&m_MouseState[m_NowBufNo], sizeof(DIMOUSESTATE2));

// マウスのアクセス権を取得
rc = m_pMouseDevice->Acquire();
if(FAILED(rc))
{
return rc;
}

// マウスの状態を取得
rc = m_pMouseDevice->GetDeviceState(sizeof(DIMOUSESTATE2),&m_MouseState[m_NowBufNo]);
if(FAILED(rc))
{
return rc;
}

if(m_MouseState[m_NowBufNo].lX)
m_AbsPosition.x += m_MouseState[m_NowBufNo].lX;
if(m_MouseState[m_NowBufNo].lY)
m_AbsPosition.y += m_MouseState[m_NowBufNo].lY;
if(m_MouseState[m_NowBufNo].lZ)
m_AbsPosition.z += m_MouseState[m_NowBufNo].lZ;

return S_OK;
}


以上のように実装しても、マウスの動き自体は合わせられるのですが、
始点が違っていてずれていたり、ウィンドウの端に行ってからもマウスを外側へ動かしていくと、
標準のマウスカーソルは端でとまったままなのにm_AbsPosition.x、yの値は端より外へ進み続けてしまいます。

絶対値モードにして実装すれば標準のマウスカーソルの座標と合わせる事は可能でしょうか?
それとも相対地モードで実装する方法はあるのでしょうか。
WindowsAPIの関数を使わなければならないのでしょうか。(出来る限り使用を控えたいです)
(ゲームのウィンドウの外から内へ入った時のみ、その最初の座標を取得するような使い方ならいいです)

毎度毎度文章の構成が下手ですみません。;
必要な情報が欠けていたら書きますので言ってくださいです。

どうかご教示して頂けたらありがたいです。よろしくお願いします。


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


Name: t_white  ..入門者(4,127ポイント)   Date: 2008/11/16(日) 23:31   No:24212     
Title: Re:DirectInputのマウス関連についての質問です。    
取り合えずWindowAPIを毎更新使う方法では、


RECT rect;
GetWindowRect(hWnd,&rect);
POINT MousePos;
// スクリーン上での位置を取得
// ツールバー、タイトルバーなどは未考慮
GetCursorPos( &MousePos );
m_AbsPosition.x = MousePos.x-rect.left;
m_AbsPosition.y = MousePos.y-rect.top;


という方法で実装できました。
よく考えたら、標準のマウスカーソルはWindowsが管理しているわけだから、
WindowsAPIを使わなきゃ座標取得できるわけないですよね・・・。
担任の教員に「DirectInputのほうが断然処理速度はやいからそっち使えるならWindowsAPIなんか使うなよー」と言われたことがあったので拘りすぎていたかもです…。
FPSなどのマウスを排他的アクセス、相対値座標で使うゲームならDirectInputで、
ノベルゲーやシュミレーションなどの非排他的アクセス、絶対値座標で作ったほうが快適なゲームではWindowsAPIで実装すればよいのでしょうか。

この見解に間違いがあったら思いっきり突っ込んでいただけるとありがたいです。
引き続きDirectInputを使った実装についてのご教示もお願いしますです。


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

Name: Justy  ..ハッカー(267,322ポイント)   Date: 2008/11/16(日) 23:43   No:24213     
Title: Re:DirectInputのマウス関連についての質問です。    

>m_AbsPosition.x、yの値は端より外へ進み続けてしまいます

 DirectInputはそういうものです。
 ドライバと通信するので細かい制御はできますが、
Windoswのウインドウとは関係なく動くので、DirectInputだけでは
画面上の絶対座標は取得できません

 絶対値モードを使っても、結局どこかを原点とした座標になってしまいます。



>WindowsAPIの関数を使わなければならないのでしょうか

 ウインドウに関連付いた使い方をするなら、使うのを避けられないです。

 結局のところ併用するのがいいと思います。
 5ボタンなどの押下情報は WinAPIではとれないですし、DirectInputを使った
情報取得の方が速いですし。


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

Name: t_white  ..入門者(4,251ポイント)   Date: 2008/11/17(月) 00:32   No:24218     
Title: Re:DirectInputのマウス関連についての質問です。    
>>Justy様
>ウインドウに関連付いた使い方をするなら、使うのを避けられないです。
やはりそうですか。;
それではこれからWindowsAPIを使ってウィンドウの枠なども考慮したコードを考えて行きたいと思います〜。
横の枠によるずれは直せたのですが、縦のタイトルバーなどによるずれは難しいですね。
回答ありがとうございました。^


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

Name: Justy  ..ハッカー(267,550ポイント)   Date: 2008/11/17(月) 01:27   No:24219     
Title: Re:DirectInputのマウス関連についての質問です。    

>横の枠によるずれは直せたのですが、縦のタイトルバーなどによるずれは難しいですね

 ?
 横が直せたのなら、同じような手法で縦も直せるはずです。

 縦はタイトルバーの高さ(SM_CYCAPTION)とフレーム枠(SM_CYDLGFRAME)の大きさを
横と同じく GetSystemMetrics()で求めて足せばYオフセットになりますよ。


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

Name: t_white  ..入門者(4,431ポイント)   Date: 2008/11/21(金) 06:22   No:24389     
Title: Re:DirectInputのマウス関連についての質問です。    
返信遅くなってすみません。

> 縦はタイトルバーの高さ(SM_CYCAPTION)とフレーム枠(SM_CYDLGFRAME)の大きさを
>横と同じく GetSystemMetrics()で求めて足せばYオフセットになりますよ。
なるほど、そういう方法もあったのですね。勉強になります。ありがとうございました!

現在知っていたGetClientRect()とGetWindowRectを組み合わせて差異を求めるというような事をやっていたのでタイトルバーを考慮するのが難しかったのです…。WinAPIも勉強しよう・・・。

あのあとScreenToClient()という、
GetCursorPos()で取得した座標を直接クライアントの座標に直してくれる便利な関数を見つけたので
それを使用していたりします。(もしこの関数が処理が重くて有名とか問題があったら教えて下さい=)
色々便利だなぁ。


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



Name: 紅葉  ..初心者(6,127ポイント)   Date: 2008/11/20(木) 20:16   No:24375       
Title: マウスでの回転について    
すいません><
前に作ったものと合体させたら回転できなくなってしまいました。
操作はマウスです。

GameMain修正前のソースが合体する前のものです。
どこが間違えているかご指摘いただけないでしょうか?


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


Name: 紅葉  ..初心者(6,167ポイント)   Date: 2008/11/20(木) 20:16   No:24376     
Title: Re:無題    
すいません。
タイトル抜けていました。
マウスでの回転でお願いします。


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

Name: Justy  ..ハッカー(272,106ポイント)   Date: 2008/11/20(木) 20:44   No:24378     
Title: Re:無題    
 クォータニオンは初期化してから使いましょう。
(未初期化で使っている変数がある)


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

Name: やそ  ..比類無きプログラマー(85,693ポイント)   Date: 2008/11/20(木) 20:54   No:24379     
Title: Re:無題    
ソースは見ていませんが・・・

せめて、
「回転できなくなってしまいました。 」
というのはどういう結果が得られた(自分の期待するものではないにせよ)
のか、
エラーメッセージがでたとか、
マウスに反応してくれないとか、

現象を書くべきじゃないでしょうか?
コンパイル&テストなど全てを誰か(回答者)にお任せでしょうか?

また、紅葉さんの理想とする実行結果

「こういう処理結果が欲しい」

というのも書かないと、回答者は進むべき方向が見出せず、
好き勝手な方向に書かれてしまうのではないでしょうか?


Justyさん、優しいなぁ^^


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

Name: 紅葉  ..初心者(6,234ポイント)   Date: 2008/11/21(金) 01:18   No:24387     
Title: Re:無題    
>>Justyさん

すいません><
初期化したらできました。

>>やそさん

説明不足になってしまいすいませんでした><


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



Name: C  ..ぴよぴよ(340ポイント)   Date: 2008/11/20(木) 08:26   No:24349       
Title: 無題    
以前次数の大きい順に単項式を出力するプログラムを質問したんですがそれを変えて
2個の多項式を入力してその和を求め、次数の大きい順に出力するというものにしたいのですがどこを変えればいいでしょうか?


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


Name: non  ..初心者(8,367ポイント)   Date: 2008/11/20(木) 08:50   No:24350     
Title: Re:無題    
>2個の多項式を入力してその和を求め、次数の大きい順に出力

具体的な、実効例を書いてもらえますか。
それと、構造体を定義してみてください。



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

Name: non  ..初心者(8,382ポイント)   Date: 2008/11/20(木) 08:52   No:24351     
Title: Re:無題    
実効例じゃなくて実行例ね。


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

Name: non  ..初心者(8,555ポイント)   Date: 2008/11/20(木) 09:00   No:24352     
Title: Re:無題    
>2個の多項式
ごめんなさい。勘違いしてました、2変数の多項式と・・・
2つの多項式なんですね。
いろんな方法がありそうですが、一つの方法として、
まず、おのおのの多項式で前と同じようにリスト構造を作りましょう。
次に、2つのリスト構造を先頭から順に見ながら、別のリスト構造を作っていくという方法でどうでしょう。
マージソートのように考えるといいかな。



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

Name: C  ..ぴよぴよ(415ポイント)   Date: 2008/11/20(木) 20:11   No:24374     
Title: Re:無題    
やり方はいくつかあるようですが元のプログラムを少し改良すればそんなに長くなりませんよね?
本やネットみてたら混乱してきてわけが分からなくなってきた^^;


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

Name: non  ..初心者(8,616ポイント)   Date: 2008/11/20(木) 20:27   No:24377     
Title: Re:無題    
ウィキペディアでマージで検索してみてください。参考になりますよ。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8


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



Name: 初心者  ..中級者(14,358ポイント)   Date: 2008/11/20(木) 11:14   No:24353       
Title: switch文    

switch{
case 01:
CDC *v;
v=GetDC();
static double bx =0, by=0;
v->MoveTo(bx,by);
v->LineTo(A,B);

bx=A;
by=B;

ReleaseDC(v);
break;


case 02:
CDC *w;
w=GetDC();
static double cx=0,cy=0;
double r;
r=sqrt(C*C+D*D);
w->Arc(cx,cx-r,A,B+r,cx,cy,A,B);
cx=A;
cy=B;
ReleaseDC();
break;
}


というswitch文なのですがbx,byの初期化がcaseのラベルによって行われませんでしたとなります。
どうすればいいのかわかりません。
後Arcの所がdoubleからintに変換しました。データが失われているかもしれませんと出るのが気になります。


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


Name: 御津凪 [URL]  ..プログラマー(37,186ポイント)   Date: 2008/11/20(木) 11:31   No:24354     
Title: Re:switch文    
> bx,byの初期化がcaseのラベルによって行われませんでした

switch 文の中に直接変数を宣言することはできません。
この場合、
  case 01:

{
CDC *v;
v=GetDC();
static double bx =0, by=0;
v->MoveTo(bx,by);
v->Lineto(A,B);

bx=A;
by=B;

ReleaseDC(v);
}
break;


のように、case 〜 break 内を{}括弧で囲むと良いでしょう。
あるいは、switch 文の外で事前に変数を宣言・初期化しておく方法もあります。

それと、 case の部分は 01 では無く、 1 にしたほうがいいです。
先頭に0をつけると8進数表記になってしまいます。


> doubleからintに変換しました。データが失われているかもしれません

こちらの方は、浮動小数点型から整数型へ丸められる(小数点以下は切り捨てられる)ための警告です。
切捨てで問題なければそのままで大丈夫です。
(四捨五入等で丸める場合は事前に処理する必要があります)

この警告を消すには、
w->Arc((int)(cx),(int)(cx-r),(int)(A),(int)(B+r),(int)(cx),(int)(cy),(int)(A),(int)(B));



と明示的に変換すると良いでしょう。(大雑把ではありますが)


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

Name: 初心者  ..中級者(14,386ポイント)   Date: 2008/11/20(木) 11:42   No:24356 解決!     
Title: Re:switch文    
キャストですね。できましたありがとうございました

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



Name: 初心者  ..中級者(13,977ポイント)   Date: 2008/11/19(水) 21:59   No:24331       
Title: 組み合わせの数    

下記のように組み合わせの数を求めるプログラムを作ったのですが
大きい数を入力すると値が求められないときがありました。
値が何より大きくなると求められないとかあるのでしょうか?


#include <stdio.h>

long fact2(int,int);

main()
{
int n, m;
long c;

printf("input n m =");
scanf("%d %d",&n, &m);

c = fact2(n,m) / fact2(m,m);
printf("%dC%d = %d\n",n, m, c);
}

long fact2(int n,int m)
{
int i;
long c=1;

for(i=n; i>=n-m+1; i--) c*=i;

return(c);
}



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


Name: box  ..ハッカー(129,417ポイント)   Date: 2008/11/19(水) 22:09   No:24332     
Title: Re:組み合わせの数    

> 値が何より大きくなると求められないとかあるのでしょうか?

nとmの値の内容によります。

> for(i=n; i>=n-m+1; i--) c*=i;

nとmの値によっては、cがlong型で扱える範囲を超える(オーバーフロー)ことがあります。
計算の順序を工夫することで、オーバーフローする時期を遅らせることはできます。
それでも、nとmの値によっては、いつかはオーバーフローします。
似たような話を、最近どこかのスレッドで見かけたような記憶があります。



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

Name: non  ..初心者(8,326ポイント)   Date: 2008/11/19(水) 23:18   No:24333     
Title: Re:組み合わせの数    
long型の最大値はLONG_MAXですから、

#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("%ld\n",LONG_MAX);
return 0;
}

を実行したら、その環境のlong最大値がわかります。



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

Name: non  ..初心者(8,589ポイント)   Date: 2008/11/20(木) 11:35   No:24355     
Title: Re:組み合わせの数    
ちょっと暇だったんで、作ってみました。
nCr=n-1Cr-1+n-1Cr の公式を使って、再帰呼び出しにしてみました。
fact2が初心者さんの関数、factが私が作った関数です。


#include <stdio.h>

long fact(int,int);
long fact2(int,int);

int main(void)
{
int n, m;
long c;

printf("input n m =");
scanf("%d %d",&n, &m);

c = fact(n,m);
printf("fact :%dC%d = %ld\n",n, m, c);
c = fact2(n,m) / fact2(m,m);
printf("fact2:%dC%d = %ld\n",n, m, c);
return 0;
}

long fact(int n,int r)
{
if(r==1)
return n;
if(r==n-1)
return n;
return(fact(n-1,r-1)+fact(n-1,r));
}
long fact2(int n,int m)
{
int i;
long c=1;

for(i=n; i>=n-m+1; i--) c*=i;

return(c);
}



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



Name: 紅葉  ..入門者(3,138ポイント)   Date: 2008/11/11(火) 15:30   No:23876       
Title: 3Dでの移動計算    
どうしてもわからないのでまた質問させていただきました><

3D上で床の角度をみてボールを転がせるということを書きたいのですが
物理学が苦手でどなたかご教授願えないでしょうか?

添付したライブラリのGameMain内のBallMove()を変更して
床の角度にあった方向にボールが落下するプログラムをかきたいです。

お時間のある時で構いませんのでよろしくお願いします。


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


Name: たいちう  ..上級者(15,996ポイント)   Date: 2008/11/11(火) 18:05   No:23879     
Title: Re:3Dでの移動計算    
床面の法線ベクトルをxy平面に射影することで、
ボールの受ける力の向きと大きさが分かるのではないかと。
後はその向きに動かすなり、その向きの加速度を与えるなりすれば良いかと。

それとも全然別の話ですか?


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

Name: 紅葉  ..入門者(3,218ポイント)   Date: 2008/11/11(火) 18:26   No:23880     
Title: Re:3Dでの移動計算    
とりあえず加速度などは考えずにその方向に転がってくれればいいです。
射影の意味がわからないのですが具体的にどのようなことを書けばいいのでしょうか?


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

Name: たいちう  ..上級者(16,073ポイント)   Date: 2008/11/11(火) 18:36   No:23881     
Title: Re:3Dでの移動計算    
法線ベクトルのx成分とy成分です。
これをボールのx座標とy座標に足したら良いでしょう。速度を調節して。
z座標については斜面に沿う形にしないとボールが浮いてしまいます。


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

Name: 紅葉  ..入門者(3,264ポイント)   Date: 2008/11/11(火) 19:18   No:23882     
Title: Re:3Dでの移動計算    
法線ベクトルの使い方を見たのですが理解できないので
申し訳ないのですが書き方を教えていただけないでしょうか?
添付してあるものは現在の中身です。


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

Name: たいちう  ..上級者(16,086ポイント)   Date: 2008/11/11(火) 19:43   No:23884     
Title: Re:3Dでの移動計算    
床面をどうやって管理しているのですか?

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

Name: 紅葉  ..入門者(3,283ポイント)   Date: 2008/11/11(火) 20:40   No:23887     
Title: Re:3Dでの移動計算    
床はBox〜とついている構造体で管理しています。

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

Name: たかぎ [URL]  ..比類無きプログラマー(71,814ポイント)   Date: 2008/11/11(火) 21:25   No:23890     
Title: Re:3Dでの移動計算    
斜面の転がりを考える際に加速度を考慮しないというのはありえないのでは?
とりあえず摩擦を考慮しなければ、加速度は図のように g・sin θ になります。
進行方向の速度を v とすると、x軸成分は v・cos θ、y軸成分は v・sin θですね。

リアルさを追求するなら、摩擦を考慮する必要があります。
ボールや床の材質から静止摩擦係数と動摩擦係数を定め、垂直抗力を掛けてやれば摩擦力が求まります。
摩擦力をボールの質量で割れば、摩擦による加速度(の減少分)が求まるはずです。
空気抵抗はまあいいでしょう(ちなみに、空気抵抗は速度に比例します)。

元の質問は、

> 物理学が苦手でどなたかご教授願えないでしょうか?

とのことでしたので、プログラミングは自分で考えてください。


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

Name: 紅葉  ..入門者(3,355ポイント)   Date: 2008/11/11(火) 21:42   No:23891     
Title: Re:3Dでの移動計算    
図のものは2軸上の空間でのことですよね?

3軸上だと方向を求めなければいけないと思うのですが

その方向についてがわからないんです・・・


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

Name: たかぎ [URL]  ..比類無きプログラマー(71,820ポイント)   Date: 2008/11/11(火) 22:02   No:23893     
Title: Re:3Dでの移動計算    
> 3軸上だと方向を求めなければいけないと思うのですが

それは転がらない場合と同じです。
物理というより、単なる数学の話ですね。


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

Name: 紅葉  ..入門者(3,445ポイント)   Date: 2008/11/12(水) 00:02   No:23895     
Title: Re:3Dでの移動計算    
申し訳ないのですが
たかぎさんの説明がよく理解できませんでした。
数学だとどのようにして求められるのですか?
勉強不足で申し訳ないのですが、どうか教えていただけないでしょうか?


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

Name: Justy  ..ハッカー(264,964ポイント)   Date: 2008/11/12(水) 01:44   No:23904     
Title: Re:3Dでの移動計算    

>3D上で床の角度をみてボールを転がせるということを

 床と接触しているかどうか関係なしに床の角度とボールの転がる向きが一致すればいいのですね。
 
 箱のクォータニオン情報を持っているので箱の傾き(ベクトル)は計算できます。
 その向きがy軸方向が−ならそのまま、+なら反転させた方向
(箱の面に平行に下に向かって落ちていくように)に加速移動させ、
回転は移動量と球(を円と考えたときの)円周の長さの比から回転角度を求めて
その分回せばいいんじゃないかな、と思います。


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

Name: 紅葉  ..入門者(3,473ポイント)   Date: 2008/11/12(水) 07:56   No:23915     
Title: Re:3Dでの移動計算    
最終的には床と接しているかを見て接していたら
その方向にという感じです。

また箱の端に来たら画面下部に落ちるのではなく
地球の引力みたいに隣の面(四角形なら)へ移動します。
この場合の面はステージではなく四角形の面です。
このときに少しくらいなら、一時的に浮いてしまっても
問題ありません。

クォータニオンから傾きを求められるのですか?


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

Name: たいちう  ..上級者(16,279ポイント)   Date: 2008/11/12(水) 10:17   No:23916     
Title: Re:3Dでの移動計算    
> クォータニオンから傾きを求められるのですか?

勿論可能です、というかできるはずですが、簡単な方法を私は知りません。
D3DXQuaternionRotationAxis()の逆関数があれば良いのですが。

# この程度の物理学なら十分理解していますが、
# 問題は3D特有の数学に移っているようです。
# 私が片手間で出来る範囲を超えていますので、他の方の回答を待つか、
# 紅葉さんご自身がクォータニオンを理解してください。中途半端で申し訳ない。
# D3DXQuaternionRotationAxis()の逆関数など必要ないほど簡単なのかも知れません。


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

Name: やそ  ..比類無きプログラマー(85,126ポイント)   Date: 2008/11/12(水) 11:14   No:23917     
Title: Re:3Dでの移動計算    
具体的なプログラムは
http://shop.cqpub.co.jp/hanbai/books/36/36951.html

とかの書籍に載ってるんじゃないかな?


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

Name: Justy  ..ハッカー(265,393ポイント)   Date: 2008/11/12(水) 20:18   No:23932     
Title: Re:3Dでの移動計算    

>クォータニオンから傾きを求められるのですか?
>を付け加えたらできました><

 たいちうさんが仰っているように可能です。

 クォータニオンが3Dにおいてどういう意味をもっているのかを
考えてみて下さい。


 一応やりかたを書いておくと

1 クォータニオンを行列に変換します。

2 行列から面の法線となる上向きのベクトル v1と
 そのベクトルの y要素を0にしたベクトル v2(法線のXZ平面)を求め、
それらの外積を求めます。
 
3 2で求めた結果を回転軸として面の法線である v1を90度回転させます。
 すると、これが傾いている面に平行なベクトルになります。
 
4 あとは y要素を調べて上を向いているか下を向いているかで
y要素の符号を−になるようにすれば、移動方向が求まります。


 といったところです。

 が、隣の面へ移動となるとその面における傾きを求めなければ
なりません。

 処理としては上記の応用で出来ますが、それぞれの面を構成する頂点情報を
入手して、面の法線を計算する必要があるかと。


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

Name: Justy  ..ハッカー(265,521ポイント)   Date: 2008/11/12(水) 20:33   No:23933     
Title: Re:3Dでの移動計算    

>また箱の端に来たら画面下部に落ちるのではなく
>地球の引力みたいに隣の面(四角形なら)へ移動します。

 あれ? ってことは最初の面は下向きの重力が働いて転がっていくけど、
次の面に移動すると重力は下向きではない???



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

Name: 紅葉  ..入門者(3,623ポイント)   Date: 2008/11/12(水) 21:49   No:23939     
Title: Re:3Dでの移動計算    
一応、画面から見て下向きですが
方向は先ほどの面に対してではなく現在一番上にある面に対して
に変化していきます。
やはり難しいでしょうか?


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

Name: Justy  ..ハッカー(265,732ポイント)   Date: 2008/11/12(水) 23:24   No:23944     
Title: Re:3Dでの移動計算    
 あ、ひょっとして、次の面というのは1つの箱の中の別の面ではなく、
別の箱の上を向いた面、ということですか?

 同じ箱の中の隣り合った別の面だと思っていたので、重力が変わって箱の側面に張り付くのかな
と思ってました(w



>やはり難しいでしょうか?

 先のやりかたで書いた、クォータニオン〜行列〜外積〜傾きの
流れが出来てしまえばそんなに難しくはないです。


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

Name: 紅葉  ..入門者(3,748ポイント)   Date: 2008/11/13(木) 01:56   No:23948     
Title: Re:3Dでの移動計算    
箱はひとつしかないです。
箱の側面につくであっています。
ただ重力の向きは変わりませんが転がる方向は変わると思うので
質問させていただきました。


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

Name: Justy  ..ハッカー(265,855ポイント)   Date: 2008/11/13(木) 02:45   No:23949     
Title: Re:3Dでの移動計算    

>ただ重力の向きは変わりませんが転がる方向は変わると思うので

 そういうことですか。
 勢いがついて、面から飛び出すことがなく常に面に接しているから
加速度が関係なく転がる向きだけが重要になる、というわけですね。


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

Name: 紅葉  ..入門者(3,801ポイント)   Date: 2008/11/13(木) 03:02   No:23950     
Title: Re:3Dでの移動計算    
そのとおりですww
いろいろ調べたのですが私にはそのコードが書けなさそうです><
もしよろしければ、お暇のある時に書いては頂けないでしょうか?


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

Name: Mist  ..プログラマー(31,645ポイント)   Date: 2008/11/13(木) 09:49   No:23954     
Title: Re:3Dでの移動計算    
> もしよろしければ、お暇のある時に書いては頂けないでしょうか?

最終的なご判断はJustyさんにお任せしますが、ここは制作依頼板ではないと思うんですけどね。
悪しき前例にならなければ良いなと思います。


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

Name: 紅葉  ..入門者(3,817ポイント)   Date: 2008/11/13(木) 16:46   No:23966     
Title: Re:3Dでの移動計算    
Mistさん
理解はしています。
ただDirectXどころかGUIをやったことがないので
いろいろ調べても書きたくてもかけないんです・・・(C++は理解しています)
同人でチームを組んでいるのですがプログラム担当の方が
遂に逃げて?しまい制作が止まってしまっています><
そこでこちらで質問をさせていただいています。


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

Name: Mist  ..プログラマー(31,826ポイント)   Date: 2008/11/13(木) 18:03   No:23972     
Title: Re:3Dでの移動計算    
> 同人でチームを組んでいるのですがプログラム担当の方が
> 遂に逃げて?しまい制作が止まってしまっています><
> そこでこちらで質問をさせていただいています。
そちらの事情は理解していますが(同情はしません)、あなたはあと何回ここの回答者に
プログラムしてもらうつもりなんですか?
質問であれば私は何も言いませんが「書いてください」は質問ではないでしょう。
作成を依頼するのであればここではない別の掲示板に行かれたほうがよいかと思います。

もっとも、リーダとしてあなたがやるべきことは今いるメンバの実力の範囲で出来ること
に切り替えるか、新しいPGを探すほうが先だと思いますが。
(もしくはDirectXの中身など知らなくても使えるライブラリを使用するか)
他質問を見ても今回の部分が完成すれば全て終わりというわけでもなさそうですし。


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

Name: Justy  ..ハッカー(265,890ポイント)   Date: 2008/11/13(木) 20:17   No:23996     
Title: Re:3Dでの移動計算    
>> Mistさん
 フォローどうもです。


>> 紅葉さん

>ただDirectXどころかGUIをやったことがないので

 うーん、厳しいですね。
 加えて、3Dの基礎、数学・物理がおぼつかない、となると
完成どころかスタート地点にすら立つことは現状のままでは難しいでしょう。
 前に言いましたが出来るプログラマを探すことが先決です。

 もし、本気で今のままやりたいなら、諦めるのが早すぎです。
 もうちょっと時間をかけて調べて下さい。

 3D・DirectXの本を持っていますか?
 持っていなければ最低1冊は買ってきて、まずそれを一通りやって下さい。



>私にはそのコードが書けなさそうです

 どこで詰まりましたか?
 具体的にどこかどうわからなかったのか“ピンポイント”で不明点を書いて
頂ければ、多少何かしらのサポートはできると思いますよ。


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

Name: 紅葉  ..入門者(4,477ポイント)   Date: 2008/11/14(金) 01:50   No:24011     
Title: Re:3Dでの移動計算    
Justyさん
そうですねw
そろそろDirectX関連の本を買ってみようかと思います。
値段は5000円くらいまでなら出せますので初心者(GUI含め)でもできそうな
本がありましたら紹介していただけないでしょうか?

今の私のレベルは
2Dなら添付してあるライブラリを使えば大抵のことはできるレベルです。
そのかわり3Dは全くと言っていいくらいわからないです。


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

Name: Justy  ..ハッカー(266,592ポイント)   Date: 2008/11/14(金) 22:58   No:24093     
Title: Re:3Dでの移動計算    
 そうですねぇ。
 予算的に微妙ですが、まず3D数学関連から。

Amazon.co.jp: ゲームプログラミングのための3Dグラフィックス数学
ttp://www.amazon.co.jp/dp/4939007375

ゲームプログラミングのための数学と物理
ttp://www.amazon.co.jp/dp/4939007898/

 とかがお薦めです。


 DirectX周りは結構いろいろ出ているので実際に書店を回って
良さそうなのを見た方がいいと思いますが、

Amazon.co.jp: DirectX ゲームグラフィックス プログラミング Ver. 2.1
ttp://www.amazon.co.jp/dp/4797341874/

DirectX逆引き大全500の極意
ttp://www.amazon.co.jp/dp/4798013161

が、基本的な本になります。


 ただ、Ci-Libがある程度既に吸収している項目も多いので、
もし買われるようでしたら、実際に手に取って何ぺージか試し読みしてから
買って下さいね。

 人によって合う合わないもありますしね。


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

Name: 紅葉  ..入門者(4,726ポイント)   Date: 2008/11/17(月) 18:34   No:24243     
Title: Re:3Dでの移動計算    
DirectX ゲームグラフィックス プログラミング Ver. 2.1
を購入させていただきました。
いろいろ勉強させてもらいます><

またわからない点についてなのですが、まず法線の出し方とその傾きの出し方がわからないです><


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

Name: Justy  ..ハッカー(268,629ポイント)   Date: 2008/11/17(月) 23:12   No:24256     
Title: Re:3Dでの移動計算    

>まず法線の出し方と

 これは法線の計算がわからないのですか?
 それともその法線の計算の元になる情報の取り出し方がわからないのですか?

 法線の計算はこちらの項目を参照して下さい。

面法線と頂点法線_3DCG - FreeStyleWiki
ttp://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%CC%CC%CB%A1%C0%FE%A4%C8%C4%BA%C5%C0%CB%A1%C0%FE_3DCG

 今回必要なのは面法線ですね。
 外積などの関数は DirectXのリファレンスを見れば載っています。


 ただ、この方法で法線を出す為には、面を構成する各頂点の情報を ID3DXMeshから
取得しないといけないのですが、これは CiLibを拡張しなければ出来ません。
 しかもちょっと面倒です。

 横着してもいいのなら、Xファイルの中を覗いて座標を決めうちしてしまっても
いいかもしれませんね。


 実は法線だけならば、この方法でなくても
・ 形状が直方体であること
・ オブジェクトの向きと全ての面の向きが平行或いは直角であること

であるならば、6つの面のローカル座標系の法線の方向は確定することができます。

 具体的に言えば。
[1, 0, 0] [-1, 0, 0] [0, 1, 0] [0, -1, 0] [0, 0, 1] [0, 0, -1]
 となります。

 後はオブジェクトの姿勢を掛ければ、それぞれの面のワールド座標系の法線となります。

 或いは姿勢からワールド座標系の法線を1つ導きだして、後はそれを90度・180度
回転させて6方向分出してもいいですね。



>その傾きの出し方がわからないです

 23932に書いてありますけど、この課程のうちどこかわからないのですが?


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

Name: 紅葉  ..入門者(4,879ポイント)   Date: 2008/11/18(火) 01:21   No:24265     
Title: Re:3Dでの移動計算    
法線の求め方はサイトを拝見しなんとなくやり方はわかりました><
また物体なのですが凹凸が結構あります。
できれば ID3DXMeshの取得でやりたいです。
どのように拡張すればよいのでしょうか?
また、物体は一シーンに一つですが一つの処理で複数の物体にも使える様にしたいです。

23932なのですが1からわかりません。
D3DXQuaternionMatorix?に入れればよいのでしょうか?

どうしても金曜までに完成させたいので質問する回数が多くなると思いますが
お許しください。


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

Name: Justy  ..ハッカー(268,771ポイント)   Date: 2008/11/18(火) 02:04   No:24270     
Title: Re:3Dでの移動計算    

>また物体なのですが凹凸が結構あります

 なるほど。箱じゃないのですね。
 となると、あたり判定も必要になりますし、
このペースでは道のりは相当長いです。

 多分掲示板などでは到底説明しきれないのでしょう。



>どのように拡張すればよいのでしょうか?

 ID3DXMeshを使ったのサービス関数をいろいろ追加していくことになるかと。
 まずは、ID3DXMeshを使った関数に何があるのか、何ができるのか、
リファレンスは勿論、各種Webを調べてみて下さい。



>23932なのですが1からわかりません。
>D3DXQuaternionMatorix?に入れればよいのでしょうか?

 うーん、ここで躓くのは想定外でした。
 DirectXのリファレンスは見ていますか?

 行列への変換はD3DXMatrixRotationQuaternion() です。
 
 行列に変換できたのなら、この箱の面の法線・・・つまりローカル座標系における上向きのベクトル [0, 1, 0]を
この行列を使って座標変換すれば箱のワールド座標での上向きのベクトルが取れます。

 もう一方のベクトルはこのベクトルのy要素を0にしたものになるので、
この2つのベクトルの外積を求めれば、23932の2は終了です。



>金曜までに完成させたいので質問する回数が多くなると。

 質問するのは構いませんが、必ず回答することを約束することは出来ませんよ。


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

Name: 紅葉  ..初心者(5,005ポイント)   Date: 2008/11/18(火) 17:47   No:24276     
Title: Re:3Dでの移動計算    
すいません><
わからないというより合っているかが不安でした。
現在はこう書いてあるのですが

D3DXMatrixRotationQuaternion(&Ball.Mat, &Box.Quat); 
//箱のクォータニオンをボールの行列に変換

と聞くべきでした・・・

2についてなのですが

D3DXVECTOR3 v1 = VEC3(0,1,0);
D3DXVECTOR3 v2 = VEC3(0,0,0);

とかいてどう Ball.Mat と掛け合わせるのでしょうか?

D3DXMATRIX m1;
D3DXMatrixTranslation(&m1, v1.x, v1.y, v1.z);
// ここに座標変換処理  ここのやり方もわからないです・・・
v2 = VEC3(v1.x,0,v1.z);
// ここに外積

みたいに行列を作るのでしょうか?



外積は
D3DXVec3Cross で求めて D3DXVec3Normalize で正規化をするべきなのでしょうか?

回答していただけなくても、もちろん構いません><
こちらは教えてもらっている身ですので、逆に申し訳ない気持ちでいっぱいです。


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

Name: Justy  ..ハッカー(269,743ポイント)   Date: 2008/11/18(火) 21:44   No:24280     
Title: Re:3Dでの移動計算    

>箱のクォータニオンをボールの行列に変換

 ボールの行列にするわけじゃないですよ?
 そもそも、ボールの行列はどこにも出てきてないですし、
この箱の傾きに関しては計算する予定もありません。

 ここではあくまで、箱のクォータニオンで表現していた姿勢を行列にしただけです。



>とかいてどう Ball.Mat と掛け合わせるのでしょうか?

 D3DXMatrixTranslation()は平行移動の行列を作る為の関数です。
 これを使って行列を作るから、わからなくなってしまうのではないでしょうか。

 D3DXVec3TransformNormal()を使って(使い方はリファレンスを参照)
ローカル座標のベクトル v1[0, 1, 0] をワールド座標系のベクトルを変換して下さい。
 
 この結果を改めて v1とし、この v1の yを 0にしたものが v2になります。
 出来たら、v1を Gs_DrawLine3D()で表示してみるといいでしょう。

 で外積を求めると v1、v2の両ベクトルに垂直なベクトル vAxisが求まります。
 垂直である、ということはこのベクトルを回転軸にして v1を回転させれば
v2に重なりますし、さらには箱の傾く方向と一致するということを意味しています。

 では、v1を何度傾ければ箱の傾く方向になるか、というと、前にも書きましたが、
90度です。

 v1を傾けるには、D3DXMatrixRotationAxis()を使って、
一端 vAxisを回転軸に90度傾ける行列を作り、その行列を使って v1を変換して下さい。

 ここまでくれば、あとは4ですね。

 随時、ベクトルを画面に出しつつ(何倍かスケーリングしないと小さすぎて表示されないかも)進めれば、
各段階でどういうベクトルが生成されているのかわかるかと思うので、色違いにしてみるなど
工夫しながら試してみて下さい。




>D3DXVec3Cross で求めて D3DXVec3Normalize で正規化をするべきなのでしょうか?

 D3DXVec3Cross()を使うのはその通りです。
 D3DXVec3Normalize()に関してはそれが必要な時は必要になるのですが、
今回は D3DXVec3Cross()に与えてるベクトルそのものが
既に正規化されたものになっていますし、出てきたベクトルもD3DXMatrixRotationAxis()
突っ込むだけなので、必要ないと思います。


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

Name: 紅葉  ..初心者(5,472ポイント)   Date: 2008/11/19(水) 01:53   No:24290     
Title: Re:3Dでの移動計算    
//---グローバル変数

D3DXMATRIX mAxis;
D3DXVECTOR3 v1,v2;

//---初期化

v1 = VEC3(0,1,0);
v2 = VEC3(v1.x,0,v1.z);

//---処理

// クォータニオンを行列に変換 とりあえずBall.Matに入れています。
D3DXMatrixRotationQuaternion(&Ball.Mat, &Box.Quat);
v1 = VEC3(0,1,0);

// 行列から面の法線となる上向きのベクトル v1と
// そのベクトルの y要素を0にしたベクトル v2(法線のXZ平面)を求め
// それらの外積を求める。
D3DXVec3TransformNormal(&v1, &v1,&Ball.Mat);
v2 = VEC3(v1.x,0,v1.z);
D3DXVec3Cross(&v1, &v1, &v2);
D3DXMatrixRotationAxis(&mAxis, &v1, 90);

//---描画
Gs_DrawLine3D(v1.x, v1.y+2, v1.z,v1.x+5, v1.y+2, v1.z);  // ここは違いますよねw

現在のソースは上のようになっています。
もし間違えがありましたら指摘していただけますと助かります。
また4なのですがmAxisのY要素?をみるのでしょうか? 見方もわからないです・・・
4についての説明をしていただけないでしょうか?
イライラさせてしまっていると思いますがお願いします><


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

Name: Justy  ..ハッカー(269,943ポイント)   Date: 2008/11/19(水) 02:20   No:24293     
Title: Re:3Dでの移動計算    

>D3DXVec3Cross(&v1, &v1, &v2);

 惜しい!
 
「外積を求めると v1、v2の両ベクトルに垂直なベクトル vAxisが求まります。」

ですよ。

 つまり、vAxisは行列ではありません。

 それに後からこの直前の時点での v1は使いますので、外積の結果を v1にしてしまうと
後から使えなくなってしまいます。


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

Name: 紅葉  ..初心者(5,564ポイント)   Date: 2008/11/19(水) 02:30   No:24296     
Title: Re:3Dでの移動計算    
D3DXMATRIX 型でかいていた mAxis を D3DXVECTOR3型で vAxisで用意し

D3DXVec3Cross(&vAxis, &v1, &v2);
D3DXMatrixRotationAxis(&Ball.Mat, &v1, 90); // ここの行列はこれでいいのでしょうか?

この後の書き方が分かりませんw

またここまで出来たのも
Justyさんのものすごいわかりやすい説明があったからですよw?


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

Name: Justy  ..ハッカー(270,551ポイント)   Date: 2008/11/19(水) 02:57   No:24299     
Title: Re:3Dでの移動計算    

>D3DXMatrixRotationAxis(&Ball.Mat, &v1, 90);

 
「一端 vAxisを回転軸に90度傾ける行列を作り」

 行列は作っていますが、vAxisはどこへ行ってしまったのでしょうか。

 それから、90度というのは Degreeでの話、なので単位を Radianしてあげて下さい。


 出てきた行列を使って v1を変換(90度傾ける)し、以前の4で書いたように
yが負になるよう符号を調整(反転)すれば、終了です。

 あと少しですよ、頑張って下さい。
 
 

>Gs_DrawLine3D(v1.x, v1.y+2, v1.z,v1.x+5, v1.y+2, v1.z);  // ここは違いますよねw

 見落としてましたが、違いますね。
 v1はベクトルであり、向きを表します。
 とりあえず、[0, 0, 0]と [v1.x*scale, v1.y*scale, v1.z*scale]のラインにしてみて下さい。


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

Name: 紅葉  ..初心者(5,748ポイント)   Date: 2008/11/19(水) 03:26   No:24301     
Title: Re:3Dでの移動計算    
すいませんwww

#define RAD(x) (((double)(x))*((double)((2.0*PAI)/360.0))) // 角度→ラジアン
D3DXMatrixRotationAxis(&Ball.Mat, &vAxis, float(RAD(90.0f)));
でいいのでしょうか?
また出てきた行列を v1に適用して座標を変換しとあるのですがここが理解できないです><

変換した後の反転は

v1 = VEC3(v1.x,(-1*v1.y),v1.z);

でいいのでしょうか?


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

Name: Justy  ..ハッカー(271,083ポイント)   Date: 2008/11/19(水) 21:23   No:24329     
Title: Re:3Dでの移動計算    

>でいいのでしょうか?

 多分大丈夫でしょう。


>また出てきた行列を v1に適用して座標を変換しとあるのですがここが理解できないです

 前に、ベクトルに対し行列を掛け合わせてベクトルを作る、ということをやっているはずです。
 思い出して下さい、というかコード的にはわずか数行前の処理なのですが。



>変換した後の反転は
>v1 = VEC3(v1.x,(-1*v1.y),v1.z);
>でいいのでしょうか?

 あー、しまった。
 すみません。少し訂正します。

「y要素の符号を−になるようにすれば、移動方向が求まります」
ではなくて、
「y要素が正なら、ベクトルの向きを反転させるようにすれば、……」

 ですね。
 yを判定するのは変わらないのですが、yだけ反転させるのではなく、
ベクトル全体を反転させます。

 なので、反転させる場合は v1 = -v1でいいはずです。


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

Name: 紅葉  ..初心者(5,790ポイント)   Date: 2008/11/20(木) 00:43   No:24337     
Title: 無題    
現在の状況です。
数行前にありましたね・・・すいません><

多分どこか間違えていると思うのですが
教えていただけないでしょうか?


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

Name: Justy  ..ハッカー(271,505ポイント)   Date: 2008/11/20(木) 01:09   No:24338     
Title: Re:無題    

>// v1 を vAxis を使ってどうにかする。
>D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);

 えーと。
 また引用します。

「面の法線である v1を90度回転させます」
「一端 vAxisを回転軸に90度傾ける行列を作り、その行列を使って v1を変換して下さい」

 vAxisのベクトルを90度傾ける為の行列は Ball.Matとして作りました。
 その行列を使ってどのベクトルを傾けるのでしょうか。

 これを考えれば自ずと答えが出てきます。


 さて、更に1点忘れていたので追加。
 最終的に出てきたベクトル vは、傾いたときに転がる向きを表していますが、
全く傾いていなかったときはつまり、v.yが 0の時は動きません。

 なので、v.yが 0(というか外積を行ったときの v1と v2のなす角度が0度の時、
と言い換えることも出来ます)の時は移動しないようにして下さい。



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

Name: 紅葉  ..初心者(5,824ポイント)   Date: 2008/11/20(木) 01:41   No:24339     
Title: Re:無題    
つまりどこが間違えているのでしょうか?
間違っているところがわからないです・・・


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

Name: Justy  ..ハッカー(271,629ポイント)   Date: 2008/11/20(木) 01:49   No:24340     
Title: Re:無題    

>// v1 を vAxis を使ってどうにかする。
>D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);

 では、逆に質問しますが、この式はBall.Mat行列を使って
何を回転させていますか?


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

Name: 紅葉  ..初心者(5,896ポイント)   Date: 2008/11/20(木) 01:49   No:24341     
Title: Re:無題    
すいません・・・
どうにかする って言うのは D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);
のことで消すのを忘れていました


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

Name: 紅葉  ..初心者(5,918ポイント)   Date: 2008/11/20(木) 01:54   No:24342     
Title: Re:無題    
v1でしょうか・・・?
すいません・・・わからないです><


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

Name: Justy  ..ハッカー(271,670ポイント)   Date: 2008/11/20(木) 01:59   No:24343     
Title: Re:無題    
 D3DXVec3TransformNormal()のマニュアル読んで、
「ベクトル v1を座標変換する」ように修正してみて下さい。


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

Name: 紅葉  ..初心者(5,974ポイント)   Date: 2008/11/20(木) 02:04   No:24344     
Title: Re:無題    
D3DXVec3TransformNormal(&v1,&v1,&Ball.Mat);

こういうことですか><
すいませんwww普通に間違えです・・・


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

Name: Justy  ..ハッカー(271,714ポイント)   Date: 2008/11/20(木) 02:09   No:24345     
Title: Re:無題    
 OKです。
 後は、これで yが 0のとき(多少誤差も念頭に置いた方がいいかも)は
動かないようにするだけで、傾けた方向に転がっていくはずです。


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

Name: 紅葉  ..初心者(6,024ポイント)   Date: 2008/11/20(木) 02:15   No:24346     
Title: Re:無題    
最後までありがとうございました><
将来Justyさんみたいに他の人にこたえられるように頑張ります><


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

Name: 紅葉  ..初心者(6,039ポイント)   Date: 2008/11/20(木) 02:16   No:24347 解決!     
Title: Re:無題    
すいません。
マーク忘れました。


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

Name: Justy  ..ハッカー(272,070ポイント)   Date: 2008/11/20(木) 02:36   No:24348     
Title: Re:無題    
 長々と続けてきましたが、やっぱり基本的な DirectXや3D数学的なところに
難がありますね。

 今回のこの一連の処理はやりかただけを書いて、理論的なところは
ほぼ放置してしまいました。

・ どうしてこれで傾いている方向がでるのか
・ どの段階でのベクトルがそれぞれ何を意味しているのか
・ 外積の処理の結果何の意味を持ったベクトルになるのか
・ 各座標変換で何が行われて、何が求められたのか

 このあたりは書籍なり Webなりできっちり理解してから、次に進んで下さい。

 ベクトルに関してはどっちを向いているのか画面に出せばそれが何を表しているのか
理解することはできますが、それ以外は理論的にどうなっているのか、
押さえておいて下さい。

 そうしないと、次に何かやろうとしたときやっぱり同じように基本的なところで
詰まってしまうことになりますので。


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



Name: Tera  ..ぴよぴよ(40ポイント)   Date: 2008/11/19(水) 23:44   No:24334       
Title: マウスカーソルが・・・    
画面上の画像でマウスカーソルが乗ったら他の画像に変えるのはどうすればいいのでしょうか・・・

○(マウスカーソルのってない)――→●(マウスカーソルのっている)

みたいに


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


Name: kazuoni  ..プログラマー(37,535ポイント)   Date: 2008/11/20(木) 00:12   No:24335     
Title: Re:マウスカーソルが・・・    
環境は何ですか?
DXライブラリならGetMousePoint()が有効かと。
本家↓
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R5N6


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

Name: lbfuvab  ..初心者(8,020ポイント)   Date: 2008/11/20(木) 00:19   No:24336     
Title: Re:マウスカーソルが・・・    
WM_MOUSEMOVEメッセージを捕まえればいいと思いますよ。

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



Name: 初心者  ..中級者(12,553ポイント)   Date: 2008/11/18(火) 22:37   No:24285       
Title: 無題    
n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れという問題で下記のように作りました。
linuxとgccをつかってます。

実行できるのですがもっとコンパクトなプログラムにできないでしょうか?
最近関数を習ったのでそれを使うのではないかとおもうのですがよくわから
ないので教えてもらえるとありがたいです。

forの部分とかまとめられますか?

#include<stdio.h>
#include<math.h>
#define N 50

main()
{
int eng[N], jap[N], math[N], sum, n=0, i;
char name[N][12];
double SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi;


while(scanf("%s %d %d %d",&name[n][0],&eng[n],&jap[n],&math[n]) != EOF)
{
sum=0;
sum = eng[n]+jap[n]+math[n];
sum1 += eng[n];
sum2 += jap[n];
sum3 += math[n];
printf("name , sum : %-12s %4d\n",name[n], sum);
n++ ;
}

ave1 = sum1/n;
ave2 = sum2/n;
ave3 = sum3/n;

for(SUM=0,i=0; i<n; i++)
{
SUM += (eng[i]-ave1)*(eng[i]-ave1);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,s_devi);

for(SUM=0,i=0; i<n; i++)
{
SUM += (jap[i]-ave2)*(jap[i]-ave2);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("japanese\naverage = %.2f\nstandard deviation = %.2f\n\n",ave2,s_devi);

for(SUM=0,i=0; i<n; i++)
{
SUM += (math[i]-ave3)*(math[i]-ave3);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("math\naverage = %.2f\nstandard deviation = %.2f\n\n",ave3,s_devi);
}



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


Name: ムンバ  ..中級者(9,423ポイント)   Date: 2008/11/18(火) 23:57   No:24287     
Title: Re:無題    
こんばんは。お世話になります。
ちょっと気になったので、横レスごめんなさい。(謝

n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れ

何となく検索してみたのですが

http://oshiete1.goo.ne.jp/qa4466285.html
http://qanda.rakuten.ne.jp/qa4466285.html
http://okwave.jp/qa4466285.html
http://oshiete.hito2.jp/qa4466285.html
http://soudan1.biglobe.ne.jp/qa4466285.html
http://qa.mapion.co.jp/qa4466285.html
(その他)

で、引っかかりました。
相変わらず変な意味は無いのですが、何でこれで検索にかかるのでしょうか?

初心者さん、ごめんなさい。
すごく気になったので、すみません。


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

Name: ムンバ  ..中級者(9,461ポイント)   Date: 2008/11/19(水) 00:10   No:24288     
Title: Re:無題    
ちなみに

n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れという問題で下記のように作りました。
linuxとgccをつかってます。

で検索しても、上記と同じ様な結果(1件マイナス)が出ました。<by yahoo

どうしてなんでしょうか?^^;


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(891,925ポイント)   Date: 2008/11/19(水) 02:17   No:24291     
Title: Re:無題    

まず投稿前に規約をお読みになり、コードはタグを使い、トピには題名をつけて下さいね。

コードは変数名が重複している部分が多いですね。
ある変数をセットで使うなら構造体が便利です。
もし構造体についてご存じなければググって下さい。

コードはなるべく変えないように修正しました。
sum0, sum1, sum2は配列にして3回ループにすればさらに省けますね。


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

/* 登録人数最大数 */
#define N 50

/* 生徒のスコアデータ */
typedef struct{
int SubScore[3]; //教科別スコア
char Name[64]; //名前
double Average; //平均
}StudentData_t;

/* 教科別スコアデータ */
typedef struct{
char Name[12]; //教科名
double Average; //平均
double StdDev; //標準偏差
}SubScoreData_t;

int main(){
int n=0, i , s;
int sum;
double sum0, sum1, sum2;
double Val, SubSum;
StudentData_t StudentData[N] ={0,};
SubScoreData_t SubScoreData[3] ={0,};

/* 名前代入 */
strcpy(SubScoreData[0].Name, "English");
strcpy(SubScoreData[1].Name, "Japanese");
strcpy(SubScoreData[2].Name, "Math");

/* 初期化 */
sum0 = sum1 = sum2 = 0;

/* 代入しながらループ */
while( scanf("%s %d %d %d",
StudentData[n].Name,
&StudentData[n].SubScore[0],
&StudentData[n].SubScore[1],
&StudentData[n].SubScore[2] ) != EOF )
{
/* 3教科の合計 */
sum = StudentData[n].SubScore[0] + StudentData[n].SubScore[1] + StudentData[n].SubScore[2];
/* 各教科のスコアの加算 */
sum0 += StudentData[n].SubScore[0];
sum1 += StudentData[n].SubScore[1];
sum2 += StudentData[n].SubScore[2];

printf("name , sum : %-12s %4d\n", StudentData[n].Name, sum);
n++ ;
}

/* 平均の計算 */
SubScoreData[0].Average = sum0 / n;
SubScoreData[1].Average = sum1 / n;
SubScoreData[2].Average = sum2 / n;

/* 3教科分ループ */
for(s=0; s<3; s++)
{
/* 人数分ループ */
for(SubSum=0,i=0; i<n; i++)
{
SubSum += (StudentData[i].SubScore[s] - SubScoreData[s].Average)
* (StudentData[i].SubScore[s] - SubScoreData[s].Average) ;
}
Val = SubSum / n ;
SubScoreData[s].StdDev = sqrt(Val);
printf("%s\naverage = %.2f\nstandard deviation = %.2f\n\n",
SubScoreData[s].Name, SubScoreData[s].Average, SubScoreData[s].StdDev);
}

return 0;
}
 
 



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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(891,975ポイント)   Date: 2008/11/19(水) 02:19   No:24292     
Title: Re:無題    
>ムンバさん

以前そのURLにその類の質問があったのでしょう。
その後規約違反か何かで削除されたのでしょう。
タイムラグで検索データベースに残ってただけじゃないでしょうか。


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

Name: ムンバ  ..中級者(9,387ポイント)   Date: 2008/11/19(水) 09:58   No:24303     
Title: Re:無題    
おはようございます。
そういう事でしたか。すみません、余計な事を。^^;
質問があったのですが、もう少し考えてみます。w
また、宜しくお願いします。


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

Name: 初心者  ..中級者(13,123ポイント)   Date: 2008/11/19(水) 14:04   No:24306     
Title: すみません    
構造体について調べてよくわからなかったので
大学の先生に質問したら構造体というのは使わないで作れといわれました。

プログラムを見せたら、
もっとまとめられるといわれましたが詳しく教えてくれませんでした。
構造体を使わないでまとめられませんか?


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

Name: Mist  ..プログラマー(32,784ポイント)   Date: 2008/11/19(水) 14:17   No:24307     
Title: Re:すみません    
ん〜、こういうことかな。

eng[N], jap[N], math[N]



seiseki[3][N]

とする。
seiseki[0] 英語
seiseki[1] 国語
seiseki[2] 数学

これでプログラム後半の標準偏差のところを


int kyouka;

for (kyouka = 0; kyouka < 3; kyouka++) {
// 標準偏差の計算を行う
}

とすればかなり短くなると思います。


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

Name: non  ..初心者(8,076ポイント)   Date: 2008/11/19(水) 14:28   No:24308     
Title: Re:すみません    
もしくは、点数の配列はそのままで、
標準偏差を計算する関数を作って、3回呼び出すのかも。
同じような処理が3回ですからね。



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

Name: 御津凪 [URL]  ..プログラマー(36,795ポイント)   Date: 2008/11/19(水) 14:36   No:24309     
Title: Re:すみません    
> 最近関数を習ったので

とありましたので関数にまとめたものを作ってみました。
void show_ave_sdiv( const int* points, int n, const char* coursename ){

double ave, pt, ssum, sdiv;
int i,sum;

for(i = 0;i < n;++i){
sum += points[i];
}

ave = sum / (double)n;

for(i = 0,ssum = 0;i < n;++i){
pt = points[i] - ave;
ssum += pt*pt;
}

sdiv = sqrt(ssum / n);

printf("%s\naverage = %.2f\nstandard deviation = %.2f\n\n",coursename,ave,sdiv);
}


教科の各点数の配列、人数、教科名を引数とし、
その教科の平均点と標準偏差を計算、出力する関数です。

コンパイルチェックはしていませんので注意。

# 利用する場合はちゃんと理解してからじゃないと、先生に聞かれたときが大変です。


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

Name: Dixq (管理人)  ..伝説なるハッカー(891,961ポイント)   Date: 2008/11/19(水) 14:48   No:24311     
Title: Re:すみません    
う〜ん、授業以上のことを知ってるならそれで作ってもいいと思いますが・・。
こうなるとポインタ使うなconst使うなとか言われそうですね。
とりあえず上にも書いたとおり、
同じような変数が3つあるので配列にしてループさせるだけでいいと思いますよ。


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

Name: バグ  ..ハッカー(125,873ポイント)   Date: 2008/11/19(水) 15:02   No:24312     
Title: Re:すみません    
試しに、なんでもかんでも関数化してみました(^_^;)


#include<stdio.h>
#include<math.h>
#define N 5

/* プロトタイプ宣言 */
int calcSum(int eng, int jap, int math);
double calcAvg(int* score, int count);
double calcStandardDeviation(int *score, int count);

/* メイン関数 */
int main()
{
char name[N][12];
int eng[N], jap[N], math[N], i;

for (i = 0; i < N; ++i)
{
/* 文字列の入力 */
scanf("%s %d %d %d", name[i], &eng[i], &jap[i], &math[i]);

/* 入力データと合計値の表示 */
printf("name , sum : %-12s %4d\n\n", name[i], calcSum(eng[i], jap[i], math[i]));
}

/* 計算結果の表示 */
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(eng, i), calcStandardDeviation(eng, i));
printf("Japanese\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(jap, i), calcStandardDeviation(jap, i));
printf("Math\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(math, i), calcStandardDeviation(math, i));

return 0;
}

/* 3教科の合計値の計算 */
int calcSum(int eng, int jap, int math)
{
return eng + jap + math;
}

/* 平均値の計算 */
double calcAvg(int* score, int count)
{
int i, sum = 0;

for (i = 0; i < count; ++i)
{
sum += *(score + i);
}

return (double)(sum) / (double)(count);
}

/* 標準偏差の計算 */
double calcStandardDeviation(int *score, int count)
{
int i;
double sum = 0.0, avg = calcAvg(score, count);

for (i = 0; i < count; ++i)
{
sum += pow(*(score + i) - avg, 2.0);
}

return sqrt(sum / (double)count);
}


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

Name: non  ..初心者(8,248ポイント)   Date: 2008/11/19(水) 15:09   No:24313     
Title: Re:すみません    
なるべく初心者さんがわかりやすいように変更をすくなくして、標準偏差だけを関数にしました。

double StandardDeviation(int n,int ten[],double ave)
{
double sd=0;
int i;
for(i=0; i<n; i++) {
sd += (ten[i]-ave)*(ten[i]-ave);
}
sd = sqrt(sd/n);
return sd;
}

関数呼び出しは
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,StandardDeviation(n,eng,ave1));


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

Name: バグ  ..ハッカー(126,001ポイント)   Date: 2008/11/19(水) 15:25   No:24316     
Title: Re:すみません    
よくよく見ると、私の投稿のcalcSum関数って、全く意味ないですね…(苦笑)

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

Name: 初心者  ..中級者(13,445ポイント)   Date: 2008/11/19(水) 21:43   No:24330 解決!     
Title: Re:    
皆さんありがとうございました^^
あとは自分でやってみようとおもいます。
またお願いします。


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



Name:  ..上級者(17,476ポイント)   Date: 2008/11/19(水) 16:00   No:24319       
Title: (DXライブラリnoFileRead_getcについて    
DXライブラリのFileRead_getc関数を使用し、
テキストファイルの内容を読み出すことを試していた際、改行を検出した時点でそこにヌル文字を代入するという処理を行おうと思ったのですが、うまくいきません。
具他的に言うと、

void draw_block(){
int fp, size=0, p_posi=0;
char String[256];


//ファイルを開く
fp = FileRead_open( "haiti.txt" ) ;

for(int i=0; i<100; i++){
String[i]=FileRead_getc(fp);
DrawFormatString( 10*i, 100, color_white, "%c", String[i]) ;
//String[3]='\0';
if(String[i]=='\n'){
String[i]='\0';
break;
}
}
size=FileRead_size( "haiti.txt" ) ;
p_posi=FileRead_tell( fp ) ;

// 画面に描画
DrawFormatString( 0, 0, color_white, "%s", String);
DrawFormatString( 0, 40, color_white, "size=%d byte", size) ;
DrawFormatString( 0, 60, color_white, "p_posi=%d byte", p_posi) ;

// ファイルを閉じる
FileRead_close( fp ) ;
}
haiti.txtの中身。
10011
2


このようなプログラムを実行してみると、

1001・

という結果になってしまいます。
この「・」の部分にヌル文字が入るようにし、1001と表示したいと思っています。
「・」の部分がヌル文字なのかと思い条件式の内容を変更し、
試してみましたがそういうわけでもないようです。
getcが2バイト文字を正常に読み込めないのが関係しているのかとも思っているのですが……(haiti.txtの中身はすべて半角で書いています)。
ちなみにfgetcで試してみましたが、1001と表示されました(コンパイラはBorlandC++ Compilerです)
もしよろしければアドバイス頂けると幸いです。

開発環境:VisualC++ 2005
OS:Windows XP
ライブラリ:DXライブラリ


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


Name:  ..上級者(16,802ポイント)   Date: 2008/11/19(水) 16:04   No:24320     
Title: Re:無題    
すいません、勢いでエンター押してしまいました……。


タイトル:DXライブラリのFileRead_getcについて

です。
編集キーを設定しないまま投稿してしまったため編集できず、申し訳ないですm(__)m


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

Name: 御津凪 [URL]  ..プログラマー(36,920ポイント)   Date: 2008/11/19(水) 16:19   No:24323     
Title: Re:無題    
おそらく、テキストファイルの改行コードが "\r\n" (CR LF) になっているので、
「・」はその "\r" の部分だと思います。
fgetc で無事にできたのは fopen で テキストコードとして開かれているため、
内部で改行を "\r\n" から "\n" に変換されます。

試しに fopen で "r" を "rb" にしてやってみてください。

FileRead_getc と同様の結果になれば、改行コードが原因です。

# となると、FileRead_getc はテキストコードとして開かれていないことになりますね。

対処方法はテキストファイルの改行コードを "\n" (LF)として保存するか、
自前で "\r" をスキップするようにする必要があります。


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

Name: non  ..初心者(8,306ポイント)   Date: 2008/11/19(水) 17:21   No:24326     
Title: Re:無題    
御津凪さんの言われる通りだと思いますので、
if(String[i]=='\n')をif(String[i]=='\r')にしてみたらどうですか?


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

Name:  ..上級者(17,752ポイント)   Date: 2008/11/19(水) 19:43   No:24328 解決!     
Title: Re:無題    
CR LFが何か分からなかったため、ちょっと調べてみましたが、
改行コードもなかなか奥が深いのですね。。。

なんとなくどういう仕組みになっているのか理解できたため、
まずはnonさんの言われた通りに変更してみた所、問題なく表示されました。
次にテキストファイルの行末コード自体を変更する方法を試した所、こちらも問題なく表示できました。

最終的には、

if(String[i]=='\r'){
String[i]='\0';
}
else if(String[i]=='\n'){
String[i]='\0';
break;
}


という条件式にすることで落ち着きました。

とりあえずWindowsでは改行コードがCRとLFの連続した文字コードだということが分かり、
疑問が解けてすっきりしました。
御津凪さん、nonさん、アドバイスありがとうございます。


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



Name: 初心者  ..中級者(13,006ポイント)   Date: 2008/11/19(水) 13:28   No:24305       
Title: 図形    
VC++で図形を作成してるのですがダイアログベース上で
@始めは原点から直線をひく
A2回目以降は前の直線の終点から引く、というプログラムを作りたいのですが
{

CEdit *p,*q;
p=(CEdit *)GetDlgItem(IDC_EDIT1);
q=(CEdit *)GetDlgItem(IDC_EDIT2);

CString a,b;
int x=atoi(a)
int y=atoi(b)

CDC *v;
v=GetDC();
v->MoveTo(0,0);
v->Lineto(x,y);
ReleaseDC(v);
}


現在このようなプログラムになっています。EDIT箱1に終点のx座標、EDIT箱2に終点のy座標を打ち込めば
始点(0,0)から終点(x,y)までの直線が書き込まれます。
それから上記@、Aがつくプログラムに変更したいのですが
よくわかりません。教えてください。


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


Name: 御津凪 [URL]  ..プログラマー(36,825ポイント)   Date: 2008/11/19(水) 14:39   No:24310     
Title: Re:図形    
最初の点を指定する時だけ、
v->MoveTo(0,0);
を実行するように変更するだけで良いのではないでしょうか。


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

Name: バグ  ..ハッカー(125,969ポイント)   Date: 2008/11/19(水) 15:12   No:24314     
Title: Re:図形    
原点というのがどのポジションを指すのか分からないので、なんとも答えられないと思います。
原点座標が(0,0)であるという仮定で話を進めるならば、御津凪さんの言うように、初回だけMoveTo関数とLineTo関数を実行し、2回目以降はLineTo関数だけを実行してやればいいと思いますよ。


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

Name: 初心者  ..中級者(13,145ポイント)   Date: 2008/11/19(水) 15:24   No:24315     
Title: Re:図形    
そのイメージはもってるのですがプログラムの方が思い浮かばないんですよね。


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

Name: バグ  ..ハッカー(126,116ポイント)   Date: 2008/11/19(水) 15:28   No:24317     
Title: Re:図形    
プログラムを書く上で必要な事の中で、具体的に何が思い浮かばないんですか?

1:CEditから文字列を取り出して、数値に変換する方法

2:変換した数値をMoveTo、LineTo関数へ引数として渡す方法

3:初回だけMoveTo関数を使用して、2回目以降は使用しないようにする方法


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

Name: 初心者  ..中級者(13,225ポイント)   Date: 2008/11/19(水) 15:34   No:24318     
Title: Re:図形    
上記のプログラムならわかるので上記ではダイアログに入力した数字を(この段階ではまだ文字扱いですが)
atoiでint型にしそれをLinetoに渡してるので1,2は大丈夫なんじゃないかなと思います。
3だと思います


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

Name: バグ  ..ハッカー(126,153ポイント)   Date: 2008/11/19(水) 16:10   No:24321     
Title: Re:図形    
よくよく見てみると、上記のプログラムをそのまま使おうとすると、CDCクラスを毎回解放してしまうので、私や御津凪の言っていた方法は使えませんね。

線を引くたびに毎回CDCクラスのポインタを取得するのであれば、前回描画した際の座標を記憶させておくしかないかと思います。

具体的には、ダイアログクラスにCPoint型のメンバ変数を追加して、線を描画した後に次回描画時の原点座標を代入してやればいいかと思います。

※追記
上記の初心者さんのプログラムですが、CString型の変数が空っぽのままint型に変換しようとしているようですが、そこは問題ありませんか?


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

Name: バグ  ..ハッカー(126,171ポイント)   Date: 2008/11/19(水) 16:11   No:24322     
Title: Re:図形    
>>御津凪さん
敬称を略してしまいました。申し訳ありません。


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

Name: 初心者  ..中級者(13,410ポイント)   Date: 2008/11/19(水) 16:49   No:24324     
Title: Re:図形    
ああ大有りですね・・

{
CEdit *p,*q;
p=(CEdit *)GetDlgItem(IDC_EDIT1);
q=(CEdit *)GetDlgItem(IDC_EDIT2);

CString a,b;
int x=atoi(a)
int y=atoi(b)

p->GetWindowText(a);
q->GetwindowText(b);

CDC *v;
v=GetDC();
v->MoveTo(0,0);
v->LineTo(x,y);
ReleaseDC(v);
}


前回入力した文字を始点にするにはCPoint関数を使えばいいのはわかりましたが
初回だけ(0,0)で2回目以降の場合わけの方がいまいちよくわかりません


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

Name: GPGA  ..熟練のプログラマー(53,724ポイント)   Date: 2008/11/19(水) 17:15   No:24325     
Title: Re:図形    
staticなら、比較的簡単にできます。


static int bx = 0; by = 0;
v->MoveTo(bx, by);
v->LineTo(x,y);
bx = x;
by = y
 


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

Name: 初心者  ..中級者(13,419ポイント)   Date: 2008/11/19(水) 17:23   No:24327 解決!     
Title: Re:図形    
できました。ありがとうございました。

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



Name: 初心者  ..中級者(12,729ポイント)   Date: 2008/11/19(水) 09:56   No:24302       
Title: Gコード    
VC++のSDIとかで例えば

{
CDC *a;
a=GetDC();
a->MoveTo(0,0);
a->LineTo(100,100);
a->ElispeDC(a);
}


の様にすれば図形が描けますよね。この方法に解析する機能?を加えたいのです
要はGコード(CADCAMで使うやつです)を入力して解析して図形を描きたいんですがその様なことはできますか?
できるならばどのようなプログラミングになるのでしょうか。
C言語のVC++6.0を使っています。


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


Name: 初心者  ..中級者(12,746ポイント)   Date: 2008/11/19(水) 11:00   No:24304 解決!     
Title: Re:Gコード    
意味不明な質問になってしまったので締め切ります

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



Name: えっと  ..ぴよぴよ(708ポイント)   Date: 2008/11/13(木) 16:24   No:23964       
Title: ステージの開始時間    
龍神録プログラミングの館50章の段階では、プログラムを実行したとき、いきなりステージ画面から始まりますが、その前にキャラクター選択画面などを挿入したいときどう変えればいいのでしょうか?
つまりステージ0の開始時間を自分で設定するにはどこをどういじればいいのでしょう・・。


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


Name: Dixq (管理人)  ..伝説なるハッカー(887,928ポイント)   Date: 2008/11/13(木) 18:07   No:23975     
Title: Re:ステージの開始時間    

まずメイン関数の仕様を確認してください。スイッチ文で実行したい関数を制御していますよね?
func_stateの値を任意に変更することで、呼びたい関数が制御できます。

例えばメニューを表示する関数をmenu()として作ったとして、
func_stateが10の時にmenu()を呼びたいとします。

初期化処理が済んだとき、func_stateを10にするようにしてください。
すると初期化が済んだとき、この関数が呼ばれます。
シューティング画面にしたいときは、シューティングの画面の関数を呼ぶ値にfunc_stateを変更してください。
このことをプログラムを見ながら確認してみます。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;

}
DxLib_End();//DXライブラリ終了処理
return 0;
}

処理は最初case 0に入ってデータのロードや色々と最初の初期化処理がされます。
func_state=99;
があるので、次は99に入ります。
ここではシューティングゲームについての初期化やシューティングの設定のロードなどが行われます。
func_state=100;
があるので、次には100に入ります。
100で普通にシューティングの処理がされています。

では先ほど言ったようにcase 10でメニューの処理をしてみます。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=10;
break;
case 10:
DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255));
DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255));
if( CheckStatePad(configpad.shot ) == 1 ){
func_state = 99;
}
break;

case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;

}
DxLib_End();//DXライブラリ終了処理
return 0;
}

このようにcaseで好きな処理を分けてください。
fps制御や音楽ファイル管理などは共通しているので、毎回呼ばれるようになっています。



 


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

Name: えっと  ..ぴよぴよ(778ポイント)   Date: 2008/11/13(木) 18:55   No:23987 解決!     
Title: Re:ステージの開始時間    
ありがとうございます。
caseで場合分けすれば良かったんですね。
私はメニューの処理をシューティングのところに無理やり押し込もうとしていました・・。



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

Name: えっと  ..ぴよぴよ(960ポイント)   Date: 2008/11/15(土) 16:58   No:24115     
Title: Re:ステージの開始時間    
解決のマークを出してしまいましたが、続けて質問させていただきます。
上に書いてくださったcase10のところで、”メニューを表示しています。”と”Zキーを押すとシューティングを開始します。”という文章が同時に表示されていますが、これを、”メニューを表示しています”と表示したあとにshotキーを押すと”Zキーを押すとシューティングを開始します。”という文に切り替わるようにしたいです。


case 10:
DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255));
if( CheckStatePad(configpad.shot ) == 1 ){
DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255));
}
if( CheckStatePad(configpad.shot ) == 1 ){
func_state = 99;
}
break;


としてみたのですが、一度shotキーを押すと一気にcase99に飛んでしまい、上手くいきません。
試しに下のようにshotキーではなく、bomキーでやってみたのですが、


case 10:
DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255));
if( CheckStatePad(configpad.bom ) == 1 ){
DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255));
}
if( CheckStatePad(configpad.shot ) == 1 ){
func_state = 99;
}
break;


”Zキーを押すとシューティングを開始します。”という文が、キーを押した瞬間しか表示されません。
ifの部分に原因があると思いますが、どのように変更すれば上手くいくでしょうか?


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

Name: ibis  ..上級者(15,041ポイント)   Date: 2008/11/15(土) 17:10   No:24116     
Title: Re:ステージの開始時間    
例えばこういうのとか。
擬似コードですが勘弁。

case 10:
"メニューを表示しています。"を表示;
if(shotキー押下){
func_state = 11;
}
case 11:
"メニューを表示しています。"を表示;
"Zキーを押すとシューティングを開始します。"を表示;
if(Zキー押下){
func_state = 99;
}


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,908ポイント)   Date: 2008/11/15(土) 17:22   No:24119     
Title: Re:ステージの開始時間    

最初はだいたいの説明をするので、自分で調べて解決してみて下さい。
その方が今後の為になると思いますので。

まず、関数の仕様を確認して下さい。
CheckStatePad
ってどういう関数でしたっけ?返って来るのは何でしたっけ?

後、

if(条件式1){
//1;
}

if(条件式1){
//2;
}

と書くと1も2も同時に実行されてしまいますよね。実行する条件が同じなんですから。

この辺に気をつけて書いてみて下さい。

 


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

Name: えっと  ..かけだし(1,003ポイント)   Date: 2008/11/15(土) 17:27   No:24121     
Title: Re:ステージの開始時間    
ibisさんありがとうございます。
そのように書いてみたところ、上手く表示させることができました。
(case11では "メニューを表示しています。"という文は消すという意味でした。その一文をcase11から取り除くと、意図したように出来ました。)

ただ、caseを分けずに、同じcase内で文を切り替えることは出来ないのでしょうか?
もし、case100内(STG内)でそのようにしたいとき、困ってしまうと思うので。


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

Name: えっと  ..かけだし(1,008ポイント)   Date: 2008/11/15(土) 17:30   No:24123     
Title: Re:ステージの開始時間    
管理人さんありがとうございます。考えてみます。

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

Name: やそ  ..比類無きプログラマー(85,386ポイント)   Date: 2008/11/15(土) 17:46   No:24128     
Title: Re:ステージの開始時間    
おおぉ、すでに回答がたくさん付いておるわい。やそじいさんじゃ。
横から入るのは瓦版(掲示板)だけはいいのじゃ!
じゃが、バス停で並んでいる所に横入りはけしからんのじゃ!入っていいのはうちのタマだけなのじゃ。

えっと殿よ、
一瞬しか表示しないのは仕様なのぢゃっ!(嘘・・・じゃないですわい)
メインループ処理はその名の通りメインなので1秒のうち何十回どころの騒ぎじゃないほど
るーぷしてるのぢゃぞ。そりゃもう大騒ぎなのぢゃっ!裏の大吉じじいの通夜ぐらいの大騒ぎなのじゃ!!

なのじゃからして毎回ProcessLoop()が実行されて、その中でGetHitKeyStateAll_2();//現在のキー入力処理を行う
を行っているのじゃぞ?
そうしたら前回押したキーの情報なぞ、もう古いに決まっておろうが。
となりの梅婆さんの漬けた梅干くらいに古すぎるんじゃ。ふぉっふぉっふぉ。

じゃからして、メニュー画面を段階的に制御したければ一工夫するしかないわいのぉ。
若者よ、あせらずじっくり考えるのじゃ。

とりあえず、
8のきーこんふぃ○○、ふがふがっ!

(ゴキッ!)

・・・

ピーポーピーポー!!(退場!!)

(削除パス:fuga)


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,312ポイント)   Date: 2008/11/15(土) 17:50   No:24129     
Title: Re:ステージの開始時間    
何の一人芝居っすか^^;
しかも削除パスまで公開されているw


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

Name: やそ  ..比類無きプログラマー(85,508ポイント)   Date: 2008/11/15(土) 18:10   No:24131     
Title: Re:ステージの開始時間    
この大不況やさぐれ時代を生きるためには気分転換も必要なのら。
ここの掲示板もだいぶ回答者側に疲れが見えてきて、ささくれが痛い季節になってきたのだぴょん。
(ささくれの原因はビタミン不足で季節は関係ないけどね〜)

一人で仕事してるとつまらないので掲示板見て、ただ回答するのもつまらないから
以前のツンデレバージョンがマニアに受けたので、
これからの高齢者社会の予行演習(?)ということで「じじいバージョン」を作ってみたッス。

評判が悪いなら消せるようにと削除キー(パス)も載っけておいた。
(つーか、スルーされて終わりだな(笑))
(削除パス:fuga)


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

Name: えっと  ..かけだし(1,698ポイント)   Date: 2008/11/18(火) 01:35   No:24267     
Title: Re:ステージの開始時間    
やそじいさんありがとうございますww
じじいバージョン凄く良いと思います!!
普通に説明されるよりもわかり易かったような気がしますw
(最初見たときちょっとびっくりしました。意表を突かれた感じで)
とりあえず第2弾期待しています!
(ツンデレバージョンも気になる・・過去ログあさってみようかなw)

私の理解力が乏しすぎるせいで返信するのが遅くなってしまいました。
管理人さんが示してくれたifの用法と、やそさんのおっしゃったメインループ処理、曖昧にしていたこれらの内容をなんとか理解できたかと思います。
メニュー画面の段階的な制御についてですが、ibisさんが答えてくださったcaseを増やす方法が一番良いような気がします。同じcase内で制御を行いたかったら、その内部でswitch文を使えばいいですよね。
switch文を使わないシンプルな方法がありましたら教えてください。

8章はkeyやpadに関する関数が多く登場して頭が混乱してます。
一つずつ整理していこうと思います。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(891,977ポイント)   Date: 2008/11/19(水) 02:33   No:24297     
Title: Re:ステージの開始時間    
if文、スイッチ文などの使い方がC言語のごく基本的な部分なので、
もしこの辺が曖昧ならまだゲームに手を出さない方がいいかもしれません。

今回の場合だけ特別で、分からなかっただけだと言う場合はよいかもしれませんが、
背伸びすると余計に時間がかかる場合があります。
龍神録の館には少し難しい書き方も出てきます。1から10まで説明していない部分もあります。
なんでも基礎が大事と言いますが、基礎がしっかりしていないと、読んでも理解が困難である場合が多いと思います。
もしよくわからなければ、さしあたりC言語入門系のサイトを見て、サンプルを沢山実行し、読み、理解し、演習し、C言語に慣れて下さい。
一通りC言語を勉強し、慣れてからもう一度ゲーム制作に戻れば随分違ってくると思います。



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



Name: bigin  ..ぴよぴよ(9ポイント)   Date: 2008/11/18(火) 20:19   No:24278       
Title: 無題    
日付と曜日を表示させるプログラムを作成してるのですが各要素をfor文でつなぐとこが分からないのですが教えてください
他の箇所はあってると思うのですがおかしいところがあったら指摘してください



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


Name: non  ..初心者(8,020ポイント)   Date: 2008/11/18(火) 21:39   No:24279     
Title: Re:無題    
なんか、最近、この手の課題が多いですね。
リスト構造なのに配列を使っている課題。実際にはこんな使い方しないだろ・・って、我思う。

for (i=0;i<6;i++)
Week[i].next=&Week[i+1];
Week[6].next=NULL;



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

Name: box  ..ハッカー(129,238ポイント)   Date: 2008/11/18(火) 21:50   No:24281     
Title: Re:無題    
> 他の箇所はあってると思うのですがおかしいところがあったら指摘してください

コンパイルしてみましたか?


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

Name: bigin  ..ぴよぴよ(65ポイント)   Date: 2008/11/18(火) 22:29   No:24284     
Title: Re:無題    
すいません、自宅のPCにはコンパイラをいれてなくて^^;
for文を使わずにやると下のような感じで書けますか?

Week[0].next = &Week[1];
Week[1].next = &Week[2];
Week[2].next = &Week[3];
・・・続く


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

Name: box  ..ハッカー(129,263ポイント)   Date: 2008/11/18(火) 22:39   No:24286     
Title: Re:無題    
> for文を使わずにやると下のような感じで書けますか?
>
> ・・・続く

どういう風にどこまで続くかを書いてくださると、
正しいかどうかがわかります。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(892,065ポイント)   Date: 2008/11/19(水) 02:22   No:24294     
Title: Re:無題    
プログラムの勉強は自分のPCにコンパイラを入れることから始まります。
まずはコンパイラを入れましょう。
紙の上ではプログラムの勉強は出来ません。

VisualStudio Express

で検索して、

VisualC++2008

をインストールして下さい。
まずはハローワールドがコンパイル・実行できるようになるのがプログラムの勉強の第一段階です。


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



Name: 匿名  ..かけだし(2,480ポイント)   Date: 2008/10/29(水) 12:53   No:23198       
Title: GetHitKeyStateAll_2関数の拡張    
キーがどのくらい押されているかを調べるGetHitKeyStateAll_2関数ですがこれを拡張してジョイパッドのボタンがどのくらい押されているかを調べるにはどうすればいいでしょうか?

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


Name: kazuoni  ..プログラマー(35,808ポイント)   Date: 2008/10/29(水) 13:21   No:23204     
Title: Re:GetHitKeyStateAll_2関数の拡張    
int GetHitKeyStateAll_2(int KeyStateBuf[])

{
char GetHitKeyStateAll_Key[257];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<257;i++)
{
if(GetHitKeyStateAll_Key[i]==1)
KeyStateBuf[i]++;
else if(i==256 && (GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_UP)!=0 )
KeyStateBuf[256]++;
else
KeyStateBuf[i]=0;
}
return 0;
}


こんな感じですかね?255に加えてジョイパッドのボタンを監査していく・・・
あってますかね^^;
ちょっと分からないですが。。


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

Name: 匿名  ..入門者(2,602ポイント)   Date: 2008/10/29(水) 13:37   No:23208     
Title: Re:GetHitKeyStateAll_2関数の拡張    
えーと・・値を見る時はどう書けば呼べるんですか?

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

Name: kazuoni  ..プログラマー(35,943ポイント)   Date: 2008/10/29(水) 13:44   No:23210     
Title: Re:GetHitKeyStateAll_2関数の拡張    
自分でキー用の配列を用意してますよね?

http://dixq.net/g/#41

プログラミングの館ではKey[256]ですが,
これを先ほどのコードに合わせるにはKey[257]に変えて
Key[256]を呼び出せばいいです。
おそらく押され続けている場合にはインクリメントを続けているはずですが。。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(868,443ポイント)   Date: 2008/10/29(水) 14:56   No:23214     
Title: Re:GetHitKeyStateAll_2関数の拡張    
龍神録の館にその実装が書いてあります。
参考になればどうぞ。
http://dixq.net/rp/8.html


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

Name: kazuoni  ..プログラマー(36,040ポイント)   Date: 2008/10/29(水) 15:28   No:23222     
Title: Re:GetHitKeyStateAll_2関数の拡張    
申し訳ないです。
やはり独立させたほうがよかったですね。。


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

Name: Dixq (管理人)  ..伝説なるハッカー(868,280ポイント)   Date: 2008/10/29(水) 15:35   No:23223     
Title: Re:GetHitKeyStateAll_2関数の拡張    
いえいえ、色んな意見があった方がいいと思いますし、
お気軽にご回答下さい^^
私も普段答えている内容が適切かどうかはわかりませんよw

リンク貼っただけじゃ不親切かもしれないので追記です。
実際にパッドについて見ている部分はこちらです。


int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}
 

まずはリファレンスでGetJoypadInputState関数についての記述を見て下さい。
仕組みを理解する必要があります。
各ビットがたっているかどうかしらべ、たっていたらインクリメントしているだけです。
mulは使わずに、iでビットシフトしてもOKです。


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

Name: 匿名  ..入門者(2,772ポイント)   Date: 2008/10/31(金) 16:08   No:23293     
Title: Re:GetHitKeyStateAll_2関数の拡張    
たしかによく見てみれば簡単に見えてきますね。
ところで見たところ知りたいボタンの数だけpad.key[i]を増やせばいい見たいですが
四本のパッドのボタンがどのくらい押されているか知りたい場合はpad.key[p][i]とでも
宣言すればいいのでしょうか?


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(870,908ポイント)   Date: 2008/11/01(土) 01:49   No:23305     
Title: Re:GetHitKeyStateAll_2関数の拡張    
宣言は
pad.key[p][i]
とするわけにはいきませんが、感じとしてはそんな感じでも出来ると思います。


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

Name: 匿名  ..入門者(3,331ポイント)   Date: 2008/11/01(土) 18:10   No:23321     
Title: Re:GetHitKeyStateAll_2関数の拡張    
えーと最後のmul*=2;はどういう意味でしょうか?
そもそもmulは何に使われているんですか?
あと感じとしては分かるんですが実際にまとめると

int i,PadInput,mul[4]={1,1,1,1};

int pad.key[4][16];

void Pad(void){



PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[0])
else pad.key[0][i]=0;
mul[0]*=2;
}



PadInput = GetJoypadInputState( DX_INPUT_PAD2 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[1])
else pad.key[1][i]=0;
mul[1]*=2;
}


PadInput = GetJoypadInputState( DX_INPUT_PAD3 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[2])
else pad.key[2][i]=0;
mul[2]*=2;
}


PadInput = GetJoypadInputState( DX_INPUT_PAD4 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[3])
else pad.key[3][i]=0;
mul[3]*=2;
}



}



Pad();

if(pad.key[0][0]>0)



こんな感じですかね?どこか無駄なところありますか?
あとmulは4個いるんでしょうか?十字ボタンなどもこれで調べられるんでしょうか?
それから処理の前にパッドが刺さっているか調べる必要もありますね。
そういう処理はどう書けば・・
すいません私にはこれが限界です。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(872,567ポイント)   Date: 2008/11/01(土) 18:39   No:23323     
Title: Re:GetHitKeyStateAll_2関数の拡張    
GetJoypadInputStateの関数の説明を本家のリファレンスで確認していただければmulの意味は解ると思います。
mul *= 2;
じゃなくても、ビットシフトでもOKです。
各ビットがたっているかどうかを判断しているのです。

無駄な部分はまず
mul[4]
です。mulの計算は4種類分ける必要も、値を保持している必要もないので、
int mul;
で同じmulを使ってもいいと思います。

後、配列に
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を格納してやり、ループで回してやれば
同じ事を4回も書かなくて済むと思います。



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

Name: 匿名  ..入門者(3,639ポイント)   Date: 2008/11/04(火) 16:00   No:23437     
Title: Re:GetHitKeyStateAll_2関数の拡張    
配列とは何の配列でしょうか?
仮にchar型として

char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};

int i,j,PadInput,mul=1;

int pad.key[4][16];

void Pad(void){
for(j=0;j<4;i++){
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul)
else pad.key[j][i]=0;
mul*=2;
}
}
}

こんな感じですかね?
あとこれでコンフィグを作りたかったら

if(pad.key[P][K]>0)

のKの中身を変えればいいんですよね

心配なのはパッドが3本しか刺さってないのに
4本」めの処理をやるとどうなるかですね
全部0が入るなら特に問題はないんですけど



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

Name: 匿名  ..入門者(3,993ポイント)   Date: 2008/11/06(木) 16:27   No:23601     
Title: Re:GetHitKeyStateAll_2関数の拡張    
ちなみに
if(PadInput & mul)
の「&」はどういう意味があるんですか?


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

Name: Dixq (管理人)  ..伝説なるハッカー(875,754ポイント)   Date: 2008/11/06(木) 16:39   No:23605     
Title: Re:GetHitKeyStateAll_2関数の拡張    
0が入るんじゃないですかね。
やってみてはどうでしょう?
不安でしたら本家で聞いてみては。

お書きになったプログラムは色々問題があります。
記載ミスだと考えるとまぁまぁループの仕方はいいと思いますが、
mulは初期化してくださいね。
後加算もして下さい。
そのままだとうまくいかないのは試したら解ると思います。
とりあえず良いかどうかは聞く前に試してみる方が効率的です。

&は論理積です。
「論理積、論理和、否定、排他的論理和」
は是非知っておくべきことなので、この辺ググって確認してください。
このキーワードに「C言語」を付け加えたらC言語についてのプログラムコードも出てくるでしょう。


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

Name: 御津凪 [URL]  ..プログラマー(31,943ポイント)   Date: 2008/11/06(木) 16:42   No:23606     
Title: Re:GetHitKeyStateAll_2関数の拡張    
> ちなみに
> if(PadInput & mul)
> の「&」はどういう意味があるんですか?

こちらに簡単な説明が載っていますよ。→[19592]

あと、パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。


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

Name: Dixq (管理人)  ..伝説なるハッカー(876,001ポイント)   Date: 2008/11/06(木) 16:45   No:23608     
Title: Re:GetHitKeyStateAll_2関数の拡張    
>パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。

1,2,3,4
のコントローラーがささっていて、例えば途中で3が抜けたとき
1,2,4
になるときとかの話かなと思ったんですが、どうなんでしょう?


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

Name: 御津凪 [URL]  ..プログラマー(32,023ポイント)   Date: 2008/11/06(木) 16:56   No:23610     
Title: Re:GetHitKeyStateAll_2関数の拡張    
> >パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
>
> 1,2,3,4
> のコントローラーがささっていて、例えば途中で3が抜けたとき
> 1,2,4
> になるときとかの話かなと思ったんですが、どうなんでしょう?

DXライブラリのソースコードの方を軽く確認したところ、

DirectInput を使用した場合で、上記の状況になった時、
抜いた直前の状態のまま値が残る(0で埋まらない)ようです。

DirectInput を使わない設定では正しく0で埋めるようです。


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

Name: 匿名  ..入門者(4,415ポイント)   Date: 2008/11/07(金) 15:34   No:23653     
Title: Re:GetHitKeyStateAll_2関数の拡張    
なるほど&&と同じですね。
ところで配列とは何の配列なのでしょう?
わからないのでまたchar型として

char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};

int i,j,PadInput,mul=1;

int pad.key[4][16];

void Pad(void){
for(j=0;j<4;i++){
mul=1;
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[j][i]++;
else pad.key[j][i]=0;
mul*=2;
}
}
}

少しはマシになりましたか?
あとはどこに問題があるでしょうか?

とりあえず
「途中でパッドが抜けたら」は抜かないように注意する
「刺さっているパッドの数」はGetJoypadNum関数と何人対戦か選んでもらう
まあこんな感じで解決するとして

>後、配列に
>DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
>を格納してやり、ループで回してやれば
>同じ事を4回も書かなくて済むと思います。

配列は結局何の配列でしょうか?

PadInput = GetJoypadInputState( PAD[j] );//

見たところマクロっぽいですね。
さすがにここにchar型配列はまずいですよね。




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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(877,663ポイント)   Date: 2008/11/08(土) 04:46   No:23723     
Title: Re:GetHitKeyStateAll_2関数の拡張    
&&と論理積は違います。
&一つか&二つかで意味は違います。
&&は「かつ」です。「両方とも」を意味します。

配列というのは、お書きになっているとおり、
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を入れるための配列です。
配列を使えばループできますしね。
これらの正体は恐らくint型だと思います。
定義名を右クリックして「定義へ移動」すると宣言されている項目が出ます。
中身はきっと1,2,3,4でしょうから、1バイトでも格納できていると思いますが正しくはintだと思います。

後、ソースコードはタグを使ってくださいね。

試していませんが、見た感じよさそうです。
GetJoypadInputStateの引数がおかしいんじゃないかと思われているようですが、
DXライブラリのリファレンスは確認されましたか?
リファレンスにこの関数はintを渡すように書かれていますから、intであることがわかりますね。


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

Name: 匿名  ..入門者(4,421ポイント)   Date: 2008/11/10(月) 16:20   No:23852     
Title: Re:GetHitKeyStateAll_2関数の拡張    
えーとつまり&はAND回路のようなもの・・・ですかね?
まあとにかくchar型をint型に変えればOKですかね?
とりあえず組み込んで試してみるので少々お待ちください


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,033ポイント)   Date: 2008/11/10(月) 17:47   No:23853     
Title: Re:GetHitKeyStateAll_2関数の拡張    
>えーとつまり&はAND回路のようなもの・・・ですかね?

そうです。
真理値表をみたらどういう関係になっているか解ると思います。
関数に渡す引数はint型ですね。


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

Name: 匿名  ..入門者(4,474ポイント)   Date: 2008/11/14(金) 15:57   No:24048 解決!     
Title: Re:GetHitKeyStateAll_2関数の拡張    
うまくいきました。見た感じ問題ないです。
pad.keyの「.」をうけつけなっかたので「_」に変えました。
長々と付き合っていただいてありがとうございます。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,234ポイント)   Date: 2008/11/14(金) 16:00   No:24049     
Title: Re:GetHitKeyStateAll_2関数の拡張    
それは使い方が違う気がしますが・・;

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

Name: 匿名  ..入門者(4,482ポイント)   Date: 2008/11/17(月) 16:13   No:24230     
Title: Re:GetHitKeyStateAll_2関数の拡張    
えっ何か変わるんですか?

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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,611ポイント)   Date: 2008/11/17(月) 16:22   No:24232     
Title: Re:GetHitKeyStateAll_2関数の拡張    

.は構造体のメンバーを表しますが、
_は単に続きの変数名などの文字列になります。

上では小さくてよく見えませんでしたが

int pad.key[4][16];

これはまずいです。
padが持つ要素がkeyだけなのならただの配列で大丈夫です。
  



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

Name: 匿名  ..入門者(4,740ポイント)   Date: 2008/11/18(火) 21:59   No:24282 解決!     
Title: Re:GetHitKeyStateAll_2関数の拡張    
うーん、ただの配列と解釈して組み込みましたし、特に問題もおきてませんから大丈夫だと思います。

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



Name: かかし  ..ぴよぴよ(141ポイント)   Date: 2008/11/17(月) 20:41   No:24251       
Title: 無題    
シューティングゲームの館をゲーム作りの参考にさせていただいております。
Cは初心者です。
サンプルを見つつ自分でプログラムを作成し、実行しておりましたが、基本的な点でわからない部分がありましたので御教授頂ければと思います。

シューティングゲームの館で、敵の弾、主人公の弾を発射するところまで追ってきたのですが、
このとき、弾が右側に常に表示しているステータス部分に入ると表示が消えるようになっています。
それがどの部分の制御で行われているのかがソースを読んでもわかりませんでした。
(プレイヤーの動きについてはキー入力の範囲指定の座標を変えることで制御しているとはわかったのですが)

すいませんがよろしくお願い致します。


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


Name: array [URL]  ..プログラマー(38,543ポイント)   Date: 2008/11/17(月) 20:48   No:24253     
Title: Re:無題    
率直に回答だけ書いておくと


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

//描画と、画面外に出たらフラグを戻す事を行う関数
void EnemyShotCalcDisp()
で制御してます。

if(EnemyShot[i].EnemyShots[j].x<-20.0||EnemyShot[i].EnemyShots[j].x>440.0||EnemyShot[i].EnemyShots[j].y<-20.0||EnemyShot[i].EnemyShots[j].y>500)
EnemyShot[i].flag=0;


この部分で画面外に弾があると表示を消してます。


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

上記は敵の弾ですが、プレイヤーの制御は

void PlayerShotCalc()

の中で制御してるみたいです。


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

Name: かかし  ..ぴよぴよ(201ポイント)   Date: 2008/11/18(火) 20:04   No:24277 解決!     
Title: Re:無題    
完全に見落としておりました。
よく考えたら弾フラグを変化させてる部分を追っかければよかったです。
ありがとうございます。


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



Name: dic  ..初心者(6,447ポイント)   Date: 2008/11/18(火) 09:51   No:24272       
Title: マルチスレッドについて    
またまた質問させてもらいます
ゲームにおいてマルチスレッドで処理を行いたいのですが
各パーツをマルチスレッドで描画すると描画する順番どおりに
スレッドを実行させたいのですが、
そういった方法はあるのでしょうか?

OS:WindowsXP
C/C++ WINAPI関数 CreateThreadです


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


Name: 御津凪 [URL]  ..プログラマー(36,441ポイント)   Date: 2008/11/18(火) 10:09   No:24273     
Title: Re:マルチスレッドについて    
> 各パーツをマルチスレッドで描画すると描画する順番どおりに
> スレッドを実行させたいのですが、

とありますが、並列処理上で描画命令が出された時でしょうか?
それとも、描画処理に優先順位をつけて描画するのでしょうか?

どちらの方法でも、基本は描画処理中に別のスレッドが描画処理をしてはいけません。
(DirectXでマルチスレッド用デバイスを作成しない場合など)
この場合、排他的処理を行うためのクリティカルセクションが必要です。

前者の場合は上記のようにクリティカルセクション内で描画を行うようにするだけです。

後者の場合、描画処理とその順序をリストなどに格納しておいて、毎フレームの最後に
一度に描画する構造を構築すると良いでしょう。
(スプライトクラスを使った描画リストとかを使うと楽かも)



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

Name: Mist  ..プログラマー(32,682ポイント)   Date: 2008/11/18(火) 10:13   No:24274     
Title: Re:マルチスレッドについて    
> 各パーツをマルチスレッドで描画すると描画する順番どおりに
> スレッドを実行させたいのですが、
> そういった方法はあるのでしょうか?

どういった目的でマルチスレッドにしたいのか良くわかりませんが
順番どおりに実行させるのであれば、そもそもマルチスレッドにする意味がないです。
(DXライブラリを使用している場合は特に)
描画を行うところはひとつのスレッドに絞ったほうがいいと思います。


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

Name: dic  ..初心者(6,613ポイント)   Date: 2008/11/18(火) 10:48   No:24275 解決!     
Title: Re:マルチスレッドについて    
>御津凪さん
クリティカルセクションを使った方法は私の勉強不足で今回は見送らせてもらいます
後者のリストを作り毎フレームの最後に描画する処理にします

>Mistさん
目的はCPUの利用の効率化です
現在のソースでは while を使ってフレームレートの調整を行っているので
CPU利用率が100%になってしまうためです

ご回答ありがとうございました


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



Name: えっと  ..かけだし(1,295ポイント)   Date: 2008/11/17(月) 17:42   No:24241       
Title: 画像の透過処理    
龍神録のProjectフォルダの中にある画像はどれも周りが黒く塗りつぶされていないのに、どうして描画したときに透過されるのですか?
試しにDrawGraph関数の第四引数をFALSEにしてみると、キャラ等の周りが2色くらいで塗られています。
それは何のために行うのですか?黒で塗りつぶさず、そうすることで何か利点があるのですか?
そしてProjectフォルダのimgフォルダを開いたとき(あるいはペイントソフトでその画像を開いたとき)に、キャラクターの周りが塗られていないように見えるのはなぜですか?
ゲームプログラミングの館4.にちょこっと書いてあった、「予め画像に透過処理をしてある部分」というのと何か関係があるのでしょうか?


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


Name: Mist  ..プログラマー(32,606ポイント)   Date: 2008/11/17(月) 17:53   No:24242     
Title: Re:画像の透過処理    
PNGという種類の画像フォーマットを使用しているためです。
詳しくは下記のページか、PNGでググってください。

http://ja.wikipedia.org/wiki/Portable_Network_Graphics


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

Name: Justy  ..ハッカー(267,823ポイント)   Date: 2008/11/17(月) 20:26   No:24249     
Title: Re:画像の透過処理    

>どうして描画したときに透過されるのですか?

 その画像には通常のカラー構成である R/G/Bの3つのチャンネルの他に
透明度を表す A(アルファ)のチャンネルが含まれているからです。



>imgフォルダを開いたとき(あるいはペイントソフトでその画像を開いたとき)に、
>キャラクターの周りが塗られていないように見えるのはなぜですか?

 imgフォルダを開いたときというのはよくわかりませんが、
そのペイントソフトがアルファチャンネルに対応していないからでしょう。

 対応したソフトを使えば、その部分が透明になっていることが確認できます。



>、「予め画像に透過処理をしてある部分」というのと何か関係があるのでしょうか?

 まさにそれです。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,803ポイント)   Date: 2008/11/17(月) 20:33   No:24250     
Title: Re:画像の透過処理    
PNG画像には透過色が指定出来ることは既に回答に上がっていますね。


>それは何のために行うのですか?黒で塗りつぶさず、そうすることで何か利点があるのですか?

黒で表現した透過では表現出来ないことがあるのです。
例えば、「うっすら透けている」という表現を透過色黒のみで出来るかというと無理ですね。
レーザーのようにまわりがぼんやり透けている画像などはこの透過色を使うと簡単に表現出来るのです。


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

Name: えっと  ..かけだし(1,327ポイント)   Date: 2008/11/18(火) 01:04   No:24263 解決!     
Title: Re:画像の透過処理    
ありがとうございます!解決しました。
画像に透過処理を施せるフリーソフトを色々探してみたんですが、透過率まで設定できるものは結構少ないみたいですね。


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

Name: 紅葉  ..入門者(4,996ポイント)   Date: 2008/11/18(火) 01:26   No:24266     
Title: Re:画像の透過処理    
30日程度しか使わないのでしたらPhotoShopCS3などの体験版で何とかなると思います。

シェアで良いのでしたら
Corel Paint Shop Pro Photo XI
がお勧めです。
6000円程度しますがフォーマットもいろいろ対応しているのと
画像を透過の他にもレイヤー管理などもでき便利です。


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

Name: えっと  ..かけだし(1,735ポイント)   Date: 2008/11/18(火) 01:39   No:24269     
Title: Re:画像の透過処理    
紹介していただき、ありがとうございます。
購入を検討してみようと思います。


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

Name: Justy  ..ハッカー(268,774ポイント)   Date: 2008/11/18(火) 02:09   No:24271     
Title: Re:画像の透過処理    
 GIMP2もなかなかのものですよ。

GIMP - The GNU Image Manipulation Program
ttp://www.gimp.org/
ttp://www.geocities.jp/gimproject/gimp2.0.html

 もしよければお試し下さい。


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



Name: situmon  ..中級者(11,524ポイント)   Date: 2008/11/16(日) 20:57   No:24191       
Title: じゃんけんゲーム    

#include "include/DxLib.h"
int pzyoutai = 0;
int azyoutai = 0;
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
void janken(){
DrawString( 50, 100, "じゃんけんゲーム" , White); //文字列表示
if( CheckHitKey( KEY_INPUT_A ) == 1 ){
DrawString( 80, 120, "パー" , White); //文字列表示
pzyoutai = 1;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 ){
DrawString( 80, 120, "グー" , White); //文字列表示
pzyoutai = 2;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 ){
DrawString( 80, 120, "チョキ" , White); //文字列表示
pzyoutai = 3;
}
azyoutai = GetRand(3);
}

void hantei(){
if(pzyoutai = 1 && azyoutai =2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 1 && azyoutai =3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 1 && azyoutai =1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 2 && azyoutai =2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 2 && azyoutai =3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 2 && azyoutai =1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 3 && azyoutai =2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 3 && azyoutai =3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai = 3 && azyoutai =1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

janken();

hantei();

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

としたのですが
test.cpp(23) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
とwarning C4305: '=' : 'int' から 'bool' へ切り詰めます。
という警告がでてしまいました。
なんとなるわかるようなないようななのですが、
理由がわかりません。


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


Name: box  ..ハッカー(129,163ポイント)   Date: 2008/11/16(日) 21:00   No:24192     
Title: Re:じゃんけんゲーム    

> if(pzyoutai = 1 && azyoutai =2)

左右両辺が等しいかどうかを調べるには、等号が2個必要です。


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

Name: situmon  ..中級者(11,547ポイント)   Date: 2008/11/16(日) 21:03   No:24193     
Title: Re:じゃんけんゲーム    
またまちがえてしまいました。
これでは代入になってしまいますね。


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

Name: situmon  ..中級者(13,209ポイント)   Date: 2008/11/16(日) 21:08   No:24195     
Title: Re:じゃんけんゲーム    

#include "include/DxLib.h"
int pzyoutai = 0;
int azyoutai = 0;
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
void janken(){
DrawString( 50, 100, "じゃんけんゲーム" , White); //文字列表示
if( CheckHitKey( KEY_INPUT_A ) == 1 ){
DrawString( 80, 120, "パー" , White); //文字列表示
pzyoutai = 1;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 ){
DrawString( 80, 120, "グー" , White); //文字列表示
pzyoutai = 2;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 ){
DrawString( 80, 120, "チョキ" , White); //文字列表示
pzyoutai = 3;
}
azyoutai = GetRand(3);
}

void hantei(){
if(pzyoutai == 1 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 1 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 1 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

janken();

hantei();

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

ですね。
エラーがなくなりましたが
文字が表示されませんでした。
ですが処理は終わったみたいでDXライブラリが終了しました。


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

Name: ランド  ..入門者(3,842ポイント)   Date: 2008/11/16(日) 21:25   No:24196     
Title: Re:じゃんけんゲーム    
>azyoutai = GetRand(3);
たしかGetRand(3)は0,1,2,3のいずれかの値を入手だったはずです。
0が選ばれてどの条件式も真にならなかったのではないでしょうか。
azyoutai = GetRand(2)+1;にすれば正常に動作すると思います。


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

Name: Justy  ..ハッカー(267,066ポイント)   Date: 2008/11/16(日) 21:30   No:24198     
Title: Re:じゃんけんゲーム    

>文字が表示されませんでした

 ソースを見る限り、文字の表示はされてるはずですよ。
 ・・・多分黒色で。


# GetColor()は DxLib_Init()の後に使わないと正しく取得できません。


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

Name: situmon  ..中級者(14,331ポイント)   Date: 2008/11/16(日) 22:12   No:24204     
Title: Re:じゃんけんゲーム    

#include "include/DxLib.h"
int pzyoutai = 0;
int azyoutai = 0;
void janken(int White){
DrawString( 50, 100, "じゃんけんゲーム" , White); //文字列表示
if( CheckHitKey( KEY_INPUT_A ) == 1 ){
DrawString( 80, 120, "パー" , White); //文字列表示
pzyoutai = 1;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 ){
DrawString( 80, 120, "グー" , White); //文字列表示
pzyoutai = 2;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 ){
DrawString( 80, 120, "チョキ" , White); //文字列表示
pzyoutai = 3;
}
azyoutai = GetRand(2)+1;
}

void hantei(int White){
if(pzyoutai == 1 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 1 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 1 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 2 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==3)
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
if(pzyoutai == 3 && azyoutai ==1)
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

int White;
White = GetColor( 255 , 255 , 255 ) ; //色の取得



janken(White);

hantei(White);

ScreenFlip();//裏画面反映

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

と書き換えることによりなんとか文字を表示することができましたが、
最初から あなたがかちです。 と表示されてしまいます。
それにあいてはパーですなどが表示されません。


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

Name: non  ..初心者(7,180ポイント)   Date: 2008/11/16(日) 22:21   No:24205     
Title: Re:じゃんけんゲーム    
> if(pzyoutai == 1 && azyoutai ==2)
> DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
> DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示

DXライブラリは勉強したことがないので、わかりませんが、文法の話として
ifが成立したときに実行する文は1行だけですか、それとも2行ですか?


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

Name: 木霊  ..プログラマー(25,599ポイント)   Date: 2008/11/16(日) 23:03   No:24210     
Title: Re:じゃんけんゲーム    
 boxさんの指摘で既に直ってるんですが、代入(=)と比較(==)を良く間違えるのであれば、

if文の中だけ数字と変数の場所を逆にするようにしてみてください。

 こんな感じです。

if ( 1 == pzyoutai && 2 == azyoutai ) {・・・}

 こうしておけば=を一つしか書いてなかった時にはコンパイル時にエラーが出るので間違いに気付けますよ。

 1 == pzyoutai・・・○ 1とpzyoutai が同じ値かを比較する事はできます。
 pzyoutai = 1・・・○ pzyoutaiに1を代入する事もできます。
 1 = pzyoutai・・・× でも1にpzyoutaiを代入する事はできません。
 だからエラーが出ます。

 一度自分で確かめてみてください。


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

Name: situmon  ..中級者(14,352ポイント)   Date: 2008/11/16(日) 23:46   No:24214     
Title: Re:じゃんけんゲーム    
< ifが成立したときに実行する文は1行だけですか、それとも2行ですか?
2行です。



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

Name: box  ..ハッカー(129,222ポイント)   Date: 2008/11/17(月) 00:02   No:24216     
Title: Re:じゃんけんゲーム    

慣れないうちは、

if (...) {
// if文が成立したとき
}
else {
// if文が成立しなかったとき
}

のように、実行する文の数に関係なく、必ず { と } で囲う方がよいと思います。



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

Name: conio  ..入門者(3,225ポイント)   Date: 2008/11/17(月) 02:15   No:24220     
Title: Re:じゃんけんゲーム    

●situmonさんへ
-----------------------------------------------------------------------------------
>> if(pzyoutai == 1 && azyoutai ==2)
>> DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
>> DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
>>DXライブラリは勉強したことがないので、わかりませんが、文法の話として
>>ifが成立したときに実行する文は1行だけですか、それとも2行ですか?

>> < ifが成立したときに実行する文は1行だけですか、それとも2行ですか?
>>2行です。
------------------------------------------------------------------------------------


if(pzyoutai == 1 && azyoutai ==2)
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示

ifが成立した時に、2行分の文を実行したいのであれば、{}で閉じないと駄目です。
上の場合、if文の成立によって判定されるのは"あいてはグーです"と書いてある行だけです。
"あなたのかちです"という行はif分の判定に含まれません。

2行ともif分の判定により実行させたいのであれば、

if(pzyoutai == 1 && azyoutai ==2)
{
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
}
と書く必要があります。
他の部分も2行ずつ実行させたいのであれば、同じように{}で囲めばいいと思います。


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

Name: situmon  ..上級者(15,757ポイント)   Date: 2008/11/17(月) 19:27   No:24244 解決!     
Title: Re:じゃんけんゲーム    
みなさまどうもありがとうございました。
成功しました!
今度は10回勝負ができるようにしたり
switch文を使ったりしてコードをより簡潔にしたいです。
最初は{}を付け忘れないように、と==をしっかりと覚えて今後、
このようなミスが内容に努めたいです。
成功したコードを表示しておきます。
本当にどうもありがとうございました。


#include "include/DxLib.h"
int pzyoutai = 0;
int azyoutai = 0;
void janken(int White){
DrawString( 50, 20, "じゃんけんゲーム" , White); //文字列表示
DrawString( 50, 40, "パーならA、グーならB、チョキならCキーを押してください。" , White); //文字列表示
DrawString( 50, 60, "A、B、C以外のキーを押すと終了します。" , White); //文字列表示

WaitKey() ;

if( CheckHitKey( KEY_INPUT_A ) == 1 ){
DrawString( 80, 120, "パー" , White); //文字列表示
pzyoutai = 1;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 ){
DrawString( 80, 120, "グー" , White); //文字列表示
pzyoutai = 2;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 ){
DrawString( 80, 120, "チョキ" , White); //文字列表示
pzyoutai = 3;
}
azyoutai = GetRand(2)+1;
}

void hantei(int White){
if(pzyoutai == 1 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 1 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 1 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

int White;
White = GetColor( 255 , 255 , 255 ) ; //色の取得

janken(White);

hantei(White);

ScreenFlip();//裏画面反映

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}



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

Name: situmon  ..上級者(17,172ポイント)   Date: 2008/11/17(月) 19:27   No:24245 解決!     
Title: Re:じゃんけんゲーム    
みなさまどうもありがとうございました。
成功しました!
今度は10回勝負ができるようにしたり
switch文を使ったりしてコードをより簡潔にしたいです。
最初は{}を付け忘れないように、と==をしっかりと覚えて今後、
このようなミスが内容に努めたいです。
成功したコードを表示しておきます。
本当にどうもありがとうございました。


#include "include/DxLib.h"
int pzyoutai = 0;
int azyoutai = 0;
void janken(int White){
DrawString( 50, 20, "じゃんけんゲーム" , White); //文字列表示
DrawString( 50, 40, "パーならA、グーならB、チョキならCキーを押してください。" , White); //文字列表示
DrawString( 50, 60, "A、B、C以外のキーを押すと終了します。" , White); //文字列表示

WaitKey() ;

if( CheckHitKey( KEY_INPUT_A ) == 1 ){
DrawString( 80, 120, "パー" , White); //文字列表示
pzyoutai = 1;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 ){
DrawString( 80, 120, "グー" , White); //文字列表示
pzyoutai = 2;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 ){
DrawString( 80, 120, "チョキ" , White); //文字列表示
pzyoutai = 3;
}
azyoutai = GetRand(2)+1;
}

void hantei(int White){
if(pzyoutai == 1 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 1 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 1 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 2 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==2){
DrawString( 80, 150, "あいてはグーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのまけです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==3){
DrawString( 80, 150, "あいてはチョキです。" , White); //文字列表示
DrawString( 80, 180, "あなたとあいこです。" , White); //文字列表示
WaitKey() ;
}
if(pzyoutai == 3 && azyoutai ==1){
DrawString( 80, 150, "あいてはパーです。" , White); //文字列表示
DrawString( 80, 180, "あなたのかちです。" , White); //文字列表示
WaitKey() ;
}
}



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

int White;
White = GetColor( 255 , 255 , 255 ) ; //色の取得

janken(White);

hantei(White);

ScreenFlip();//裏画面反映

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}



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

Name: 組木紙織 [URL]  ..熟練のプログラマー(65,868ポイント)   Date: 2008/11/17(月) 22:53   No:24255     
Title: Re:じゃんけんゲーム    
>みなさまどうもありがとうございました。
>成功しました!

完成したようでよかったです。


私からvoid hantei(int White)の部分で二つアドバイスを

1:長さが少し長いと感じませんか?
もう少し短く出来るので考えてみたらいかがでしょうか?

2:表示の色を変えることが出来ますよね。でも変数名がWhiteだと読んでる人が勘違いします。
もっと適切な変数名を考えてみたらどうでしょうか?



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

Name: kazuoni  ..プログラマー(37,145ポイント)   Date: 2008/11/17(月) 23:20   No:24257     
Title: Re:じゃんけんゲーム    
自分からも・・・おめでとうございます^^
進歩してる感があっていいですねw
そうですねー。確かに
相手の出したもの、勝負を全とおり書くのは長いですね。
あとWaitKey()も。
作るゲームが大きくなっていくと、このままだとものすごいことになって、
自分でもどこがどうなってるのかわからなくなってしまう気がします。
早い段階からコードを簡潔に書くように工夫することはとても大切かと^^

がんばってください!





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

Name: 木霊  ..プログラマー(26,321ポイント)   Date: 2008/11/18(火) 01:08   No:24264     
Title: Re:じゃんけんゲーム    
 とりあえず完成したみたいでなによりです。

 上の御二方も今後へのアドバイスをされているので自分からも・・・

1・変数のスコープ(使える範囲)を理解して、グローバル変数を控える(極力使わない)
  グローバル変数はどこからでも使えるので便利ですが、同時にどこからでも変更できるので
  思わぬバグの温床になり、しかも駆除しにくいのでしっかり管理できないなら使わない方がいいです。

2・(1とは逆に)whiteのように値を変更する事のない変数はconstをつけて定数にするか、
  #defineでマクロ化しておく。(個人的には定数化を勧めます)

3・変数の横にコメントで「何に使うか」と「取る値の範囲」を書いておく。(フラグなら説明も)
  (前トピまでのsitumonさんの質問内容をみると、この部分をほとんど把握してない様子なので。)
  他人のコードを改変するならば、これをおざなりにすると何をやってるか全く分からないので
  改変する前に「何に使うか」ぐらいは把握するようにしないと同じことの繰り返しになります。

4・インデント(字下げ)はきっちりと。
  ところどころインデントがおかしいので少し見難いです。
  処理がif文の{}の中か外かが分かりくいので、それぐらいは分かりやすくするようにしてください。

 それでは本命のSTG作成、頑張ってください。

P.S.
 中学生という事は来月には期末試験ですよね。
 そっちの方も頑張ってくださいね。


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



Name: しょしょしょしんしゃ  ..入門者(3,638ポイント)   Date: 2008/11/14(金) 21:52   No:24082       
Title: ファイル操作    

宿題なのですが、
8人の成績データを"seiseki.dat"のファイルとして保存して、
"seiseki.dat"を読み込んでその中身を表示するプログラムを作成すること。
なお、関数にする必要はないです。
"seiseki.data"は

Aki 75 84 82 60 80 85
Daisuke 90 58 86 64 72 44
Eiko 64 78 72 76 77 79
Hiroshi 79 94 63 75 88 90
Kana 75 62 54 78 59 82
Ryuichi 89 65 88 72 85 68
Takashi 66 48 74 67 82 74
Yuka 76 79 75 84 88 70

 というようにする。なお、このファイルは、DATファイルです。
自分なりに考えてみましたがうまくいきませんでした。


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

int main(void)
{
FILE *fp;
char name[30];
int ten;

if((fp=fopen("seiseki.dat","rt"))==NULL){
printf("fopen error\n");
exit(0);
}
while(fscanf(fp,"%s %d",name,&ten)!=EOF){
printf("%s %f\n",name,ten);
}
fclose(fp);
return 0;
}

実行例はこのようになるそうです。

seiseki.datの中身を表示します
    1学期  2学期  3学期
名前  英語 数学 英語 数学 英語 数学
Aki 75   84   82  60 80 85
Daisuke 90   58   86 64 72 44
Eiko 64   78   72 76 77 79
Hiroshi 79   94   63 75 88 90
Kana 75   62   54 78 59 82
Ryuichi 89   65   88 72 85 68
Takashi 66   48   74 67 82 74
Yuka 76   79   75 84 88 70

よろしくお願いします

(管理人による記事の修正)


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


Name: しょしょしょしんしゃ  ..入門者(3,665ポイント)   Date: 2008/11/14(金) 22:19   No:24087     
Title: Re:ファイル操作    
すいません 
実行例がずれていました
見難くて


  


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

Name: non  ..初心者(5,590ポイント)   Date: 2008/11/14(金) 22:29   No:24090     
Title: Re:ファイル操作    
>if((fp=fopen("seiseki.dat","rt"))==NULL){
"rt"って何ですか?
>fscanf(fp,"%s %d",name,&ten)
名前のあとに6科目あるのに、なぜ1教科しかないの?

少し教えて欲しいのですが、しょしょしょしんしゃ さんは、大学の1年生くらいで、プログラムの授業ですか?確かに、プログラムはまるなげではありませんが、わかろうという努力はされてます?参考書なり読めばすぐにでもわかりそうな課題なんですが・・・ファイルを読む課題まで授業が進んでいるのなら、もう少し、基本の分かったプログラムを書かれてもいいような気がするのですが。
厳しいことを言って申し訳ありませんが、いつまで経ってもプログラムができるようになりませんよ。
唯単に、課題のレポートを出せばいいのなら、友人にコピーさせてもらった方がいいのでは。




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

Name: しょしょしょしんしゃ  ..入門者(4,009ポイント)   Date: 2008/11/14(金) 22:55   No:24092     
Title: Re:ファイル操作    
すいませんでした。

しかし 残念ながら 自分の実力を知った上で
しかも 私自身そのような友人は、
いませんので このように ネット上の力を借りて
質問しているのです。 
プログラミングの力は uouさん の言うとおり
いつまでも できないかもしれませんが 
誰かの返答で 私自身で何か 発見があるかもしれない
と期待していただけなのです。
できることなら 小言より 何か ヒントを書いてくれる方が
有難かったです....。

>"rt"って何ですか?
テキストファイルの読み込みのことらしいです。違いますか?
 まあ't'はなくてもよろしいのですが...。
 


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,418ポイント)   Date: 2008/11/14(金) 23:25   No:24094     
Title: Re:ファイル操作    
とりあえず沢山いっぺんに作ろうとすると挫折します。
こういうのは少しずつやっていきましょう。

じゃファイルに

「100」

だけかいて保存して下さい。

この100をとってきて表示するだけのプログラムをまず書いてみて下さい。

わかるところから始める事が大事です。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,532ポイント)   Date: 2008/11/14(金) 23:27   No:24095     
Title: Re:ファイル操作    
「100」

ができたら

「英語 100」

でやってみて、それが出来たら

「英語 100 200 300」

でやってみて・・、次第に完成に持っていってみましょう。

しかしファイルの内容を表示すればいいだけなら1文字ずつとってきて表示したらいいだけの気がしますが・・。


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

Name: 初級者  ..かけだし(1,429ポイント)   Date: 2008/11/14(金) 23:32   No:24097     
Title: Re:ファイル操作    

これで点数がもらえるかどうかは、よくわかりません。


#include <stdio.h>

int main(void)
{
FILE *fp;
char name[10];
int a, b, c, d, e, f, i;

fp = fopen("seiseki.dat", "r");
if (!fp) return printf("file open error\n"), 1;
printf(" 1学期 2学期 3学期\n");
printf(" 英語 数学 英語 数学 英語 数学\n");
for (i = 0; i < 8; ++i) {
fscanf(fp, "%s%d%d%d%d%d%d", name, &a, &b, &c, &d, &e, &f);
printf("%-11s%5d%5d%5d%5d%5d%5d\n", name, a, b, c, d, e, f);
}
fclose(fp);
return 0;
}





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

Name: 初級者  ..かけだし(1,814ポイント)   Date: 2008/11/14(金) 23:52   No:24098     
Title: Re:ファイル操作    

別の解です。

#include <stdio.h>

int main(void)
{
FILE *fp;
char name[8], a[4], b[4], c[4], d[4], e[4], f[4];
int i;

fp = fopen("seiseki.dat", "r");
if (!fp) return printf("file open error\n"), 1;
printf(" 1学期 2学期 3学期\n");
printf(" 英語 数学 英語 数学 英語 数学\n");
for (i = 0; i < 8; ++i) {
fscanf(fp, "%s%s%s%s%s%s%s", name, a, b, c, d, e, f);
printf("%-9s%5s%5s%5s%5s%5s%5s\n", name, a, b, c, d, e, f);
}
fclose(fp);
return 0;
}




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

Name: しょしょしょしんしゃ  ..入門者(4,318ポイント)   Date: 2008/11/15(土) 01:09   No:24100 解決!     
Title: Re:ファイル操作    
大変 遅くなりましたが

管理人さんのような練習問題と初級者さんの答えのおかげで、
うまくまとまることができました。
ありがとうございます。

思ったよりは、 uouさんが言っていた通り、用意なプログラムであったので、
私のレヴェルが 低く 申し訳ありませんでした。

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

int main(void)
{
FILE *fp;
int ten1,ten2,ten3,ten4,ten5,ten6,i;
char name[10];

printf(" 1学期 2学期 3学期\n");
printf(" 英語 数学 英語 数学 英語 数学\n");

if((fp=fopen("seiseki.dat","r"))==NULL){
printf("no flile data\n");
exit(1);
}
for(i=0;i<8;++i){
fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
}
fclose(fp);
return 0;
}


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

Name: non  ..初心者(5,766ポイント)   Date: 2008/11/15(土) 07:41   No:24105     
Title: Re:ファイル操作    
>if (!fp) return printf("file open error\n"), 1;
これをこのまま書かなかったのは賢明です。人のを写したとおもわれますもんね。

>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
これは恐らく警告がでるのでは。条件式ですよ。
8回繰り返すことが決まっているのだから、EOFか見る必要がないし、万が一チェックするのなら
if文にしましょう。



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

Name: しょしょしょしんしゃ  ..入門者(4,913ポイント)   Date: 2008/11/16(日) 17:02   No:24164     
Title: Re:ファイル操作    
大変 申し訳ないのですが
また 私の力不足で 詰まってしまいました。
同じような質問 で 悪いのですが
seiseki.dat のファイルに seiseki2.dat というファイル
を読み込んで
seiseki.dat の中身に seiseki2.dat
を追加するプログラムの作成するということなのですが、
上手くいきませんでした。 seiseki2.datはこのようになります。

Eisuke 75 68 74 82 80 77
Hajime 55 68 68 75 82 70
Junko 89 65 83 71 77 58
Kumi 73 90 75 93 65 82
Muneo 66 62 54 70 75 75
Ryota 80 75 72 79 60 66
Sonoko 50 86 45 85 61 89



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

int main(void)
{

FILE *fp,*fp2;
int ten1,ten2,ten3,ten4,ten5,ten6,i;
char name[10];
char ch;


printf("seiseki.datの中身を表示します。\n");
printf("        1学期 2学期 3学期\n");
printf("名前     英語 数学 英語 数学 英語 数学\n");

if((fp=fopen("seiseki.dat","r"))==NULL){
printf("no flile data\n");
exit(1);
}
for(i=0;i<8;++i){
fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
}

if((fp2=fopen("seiseki2.dat","r"))==NULL){
printf("no flile data\n");
exit(1);
}
for(i=0;i<7;++i){
fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
}
while((ch=fgetc(fp2))!=EOF){
fputc(ch,fp);
}
fclose(fp);
fclose(fp2);
return 0;
}


>if((fp=fopen("seiseki.dat","r"))==NULL){
 というところは'r'より'a'のほうが よいのでしょうか?
 ご検討 お願いします。
 
 


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

Name: non  ..初心者(6,481ポイント)   Date: 2008/11/16(日) 17:28   No:24167     
Title: Re:ファイル操作    
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?




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

Name: しょしょしょしんしゃ  ..初心者(5,055ポイント)   Date: 2008/11/16(日) 17:33   No:24169     
Title: Re:ファイル操作    
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
は、警告が出るって言ったでしょ。無視ですか?

すいません、
どうやって if文にするのか
分からなかったので、そのままでした。
よろしかったら それも教えてもらえませんか?


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

Name: non  ..初心者(6,530ポイント)   Date: 2008/11/16(日) 17:35   No:24172     
Title: Re:ファイル操作    
!=EOF
を消して下さい


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

Name: しょしょしょしんしゃ  ..初心者(5,121ポイント)   Date: 2008/11/16(日) 17:42   No:24173     
Title: Re:ファイル操作    
はい 消しました
これだと ちゃんと 実行できました
どうしてでしょうか



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

Name: non  ..初心者(6,601ポイント)   Date: 2008/11/16(日) 17:51   No:24175     
Title: Re:ファイル操作    
>これは恐らく警告がでるのでは。条件式ですよ。
インターネットの検索で条件式っていれて検索すれば出てきますよ。

ファイルの追加については、例えば、
http://rina.jpn.ph/~rance/c_language/p15.html
ここを読んでから分からないところを尋ねてください。


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

Name: non  ..初心者(6,633ポイント)   Date: 2008/11/16(日) 18:09   No:24177     
Title: Re:ファイル操作    
rかaかa+かはここの方がわかりやすいかも。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,281ポイント)   Date: 2008/11/16(日) 18:09   No:24178     
Title: Re:ファイル操作    
>> fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> は、警告が出るって言ったでしょ。無視ですか?

まあ、文法的には間違っていないので、警告は出るかもしれませんし、出ないかもしれませんね。


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

Name: non  ..初心者(6,702ポイント)   Date: 2008/11/16(日) 18:13   No:24179     
Title: Re:ファイル操作    
>まあ、文法的には間違っていないので、警告は出るかもしれませんし、出ないかもしれませんね。
でも、レポートなら恐らく減点ですよ。



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

Name: しょしょしょしんしゃ  ..初心者(5,377ポイント)   Date: 2008/11/16(日) 18:22   No:24181     
Title: Re:ファイル操作    
すいません

このことを 読んでも ほとんど、分かりませんでした・・・

”w” ライト(書き込み)・モード
ファイルがなければ作成され、あれば中身が空になる。
 これを使うのでしょうか? 使ったらただ中身が空になるだけなのでは・・・?

”a” アペンド(追加書き込み)・モード
ファイルがなければ作成され、あればファイルの現在位置をファイル・エンドにセットする。
 これを使うと、実行は うまくいきますが、
         seiseki.dat にうまく seiseki2.dat の中身が入りません。

6 アペンド・モードの使用例 を 使用するのですか・・・。



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

Name: non  ..初心者(6,997ポイント)   Date: 2008/11/16(日) 19:07   No:24184     
Title: Re:ファイル操作    
HPに書いてあることを要約すると・・・
aは追加ですから、今回の課題はaでしょう。しかし、aはファイルポインタはファイルの終わりを指します。したがって、最後に追加をすることはできますが、ファイルを先頭から読めません。
ファイルを読みたいならa+を使うか、rで開いてデータを読んだ後、一度閉じ、再度aで開いて追加します。


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

Name: しょしょしょしんしゃ  ..初心者(5,440ポイント)   Date: 2008/11/16(日) 19:16   No:24185     
Title: Re:ファイル操作    
>if((fp2=fopen("seiseki2.dat","r"))==NULL)
この部分を

if((fp2=fopen("seiseki2.dat","a+"))==NULL)

でしましたが
  できませんでした。
 他に 悪いところ はありませんかね・・・・。


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

Name: non  ..初心者(6,877ポイント)   Date: 2008/11/16(日) 20:02   No:24186     
Title: Re:ファイル操作    

> for(i=0;i<7;++i){
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
> while((ch=fgetc(fp2))!=EOF){
> fputc(ch,fp);
> }

ファイルポインタは、データを読んだら自動的に移動してます。




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

Name: しょしょしょしんしゃ  ..初心者(5,297ポイント)   Date: 2008/11/16(日) 20:23   No:24188     
Title: Re:ファイル操作    
> for(i=0;i<7;++i){
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
> while((ch=fgetc(fp2))!=EOF){
> fputc(ch,fp);
> }
この部分をなくして

if((fp2=fopen("seiseki2.dat","a+"))==NULL){
printf("no flile data\n");
exit(1);
}

だけ でよろしいのですか?
これでは うまくいきませんでしたが・・・・。
他の部分 も 間違えている可能性が あるので 調べてみます。



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

Name: non  ..初心者(6,912ポイント)   Date: 2008/11/16(日) 20:38   No:24189     
Title: Re:ファイル操作    
>この部分をなくして
全部なくしてどうするの?




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

Name: しょしょしょしんしゃ  ..初心者(5,346ポイント)   Date: 2008/11/16(日) 20:52   No:24190     
Title: Re:ファイル操作    
> while((ch=fgetc(fp2))!=EOF){
> fputc(ch,fp);
> }
 この部分だと
 効果がないのですけど どうですか?

> for(i=0;i<7;++i){
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
 この部分を消すと 上手く実行できませんでした
 全然 3時間考えましたが、わかりません・・・。
 ヒントを もらえませんか・・・




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

Name: non  ..初心者(7,042ポイント)   Date: 2008/11/16(日) 21:07   No:24194     
Title: Re:ファイル操作    
> for(i=0;i<7;++i){
データが7人分だから7回繰り返している。
> fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 )!=EOF;
ファイル2を読み込んでいる。このとき読んだ分だけ、ファイルポインタは移動している。
> printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
> }
読み込んだデータをディスプレイに表示している。
7回繰り返したのでファイルポインタはファイルの終わり(EOF)を指している。
> while((ch=fgetc(fp2))!=EOF){
ファイルがEOFになるまで繰り返そうとしているが、すでにEOFである。
> fputc(ch,fp);
> }





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

Name: しょしょしょしんしゃ  ..初心者(5,436ポイント)   Date: 2008/11/16(日) 21:29   No:24197     
Title: Re:ファイル操作    
>fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
>fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
 とおいて、
> while((ch=fgetc(fp2))!=EOF){
のEOFが邪魔なのですか・・・?


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

Name: しょしょしょしんしゃ  ..初心者(5,604ポイント)   Date: 2008/11/16(日) 22:11   No:24203     
Title: Re:ファイル操作    

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

int main(void)
{

FILE *fp,*fp2;
int ten1,ten2,ten3,ten4,ten5,ten6,i;
char name[10];
char ch;


printf("seiseki.datの中身を表示します。\n");
printf("        1学期 2学期 3学期\n");
printf("名前     英語 数学 英語 数学 英語 数学\n");

if((fp=fopen("seiseki.dat","r"))==NULL){
printf("no flile data\n");
exit(1);
}
for(i=0;i<8;++i){
fscanf(fp,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
}
if((fp2=fopen("seiseki2.dat","a+"))==NULL){
printf("no flile data\n");
exit(1);
}
for(i=0;i<7;++i){
fscanf(fp2,"%s%d%d%d%d%d%d",name,&ten1,&ten2,&ten3,&ten4,&ten5,&ten6 );
printf("%-11s%5d%5d%5d%5d%5d%5d\n",name,ten1,ten2,ten3,ten4,ten5,ten6);
}

fclose(fp);
fclose(fp2);
return 0;
}


このようになりましたが
 まだ上手くできません 修正箇所を あげてください
 自分の限界です。
 解決はまだしていません
 ご協力 お願いします。


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

Name: しょしょしょしんしゃ  ..初心者(5,641ポイント)   Date: 2008/11/16(日) 23:26   No:24211     
Title: Re:ファイル操作    
あと
この問題には 続きがありまして
この15人の点数を読み込んで、
各々 平均点を出すというのもわからないので、
そちらも
お願いします。


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

Name: しょしょしょしんしゃ  ..初心者(5,661ポイント)   Date: 2008/11/17(月) 21:44   No:24254     
Title: Re:ファイル操作    
すいません
まだ 解決していません
お願いします


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(66,022ポイント)   Date: 2008/11/17(月) 23:30   No:24259     
Title: Re:ファイル操作    
ソースコードだけみて考えていませんか?
まずは自分がやりたいことを日本語で書く。
次に出来るだけ詳しく(C言語の雰囲気で)日本語で書く
コードを書くのはそれからです。

続きの部分はおいといて、本気で最初の課題を考えてください。
ヒントは今までのコメントにあります。



#どんな参考書を使っているか分かりませんし、どのようにC言語を勉強しているのか知りませんが、
#分からないならどこが分からないかを明確にしてください。
#あと、書かれたコメントはきちんと読んで理解しましょう。
#今のままだと永久にC言語を使えるようになるとは思えません。


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

Name: kazuoni  ..プログラマー(37,469ポイント)   Date: 2008/11/17(月) 23:48   No:24260     
Title: Re:ファイル操作    
組木紙織さんのおっしゃる通り、おそらくまだ考えが浅いと思います。

nonさんが挙げられたページをしっかり読むとNo.24203でおかしな点がすぐ出ると思います。

今から行うことは
>seiseki.dat のファイルに seiseki2.dat というファイル
>を読み込んで
>seiseki.dat の中身に seiseki2.dat
>を追加するプログラムの作成する

ですよね?
以下の点を考えてみてください。

1、seiseki.datに「書き込む」(今自分のseiseki.datのファイル処理はどうなっていますか?)
2、seiseki2.datを読み込む際、自分の用意した変数ですべてのデータを保存する

2、においては、No.24098初級者さんのご回答がヒントになると思います。
これができたら書き込みですね。これもnonさんの挙げられたサイト内にちゃんと書いてあります。


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



Name: 774  ..ぴよぴよ(665ポイント)   Date: 2008/11/16(日) 00:21   No:24151       
Title: 課題    
こんばんわ、前回学校の課題で質問をしに来たものです。

今回も課題が詰まってしまい、悩んでおります。
今回の課題の内容は、構造体を使っての双方向の連結リストです。
0〜9までの乱数を30個入れて、出来上がった連結リストを昇順でソートして表示、逆表示もする。
ソートにかかった時間も表示する事。
ただし、ソートはなるべく早くソートする。
という内容でした。

今回使うプログラムのソースファイルは3つに分かれています。

4-1.c・・・乱数生成、ソート前とソート後の表示、ソート後の逆表示、かかった時間の表示に使う。書き換えはしない。
4-2.c・・・ソートをするプログラムを書くところ。
ex4.h・・・構造体作って、関数の前宣言書いている。書き換えはしない。

という風になっております。

ソートを検索してバブルソートでソートしようとプログラムを書き込んだのですが、動かなくなってしまいました。
どうすればソートができるのかがわかりません、どうか教えてください・・・


今回3つのファイルになっているのでソートをする4-2.cを乗せて後は圧縮ファイルで付属させようと思います。
下が4-2.cのプログラムです。


#include <stdio.h>
#include <stdlib.h> /* NULLポインタ */
#include "ex4.h"
void sort(struct node **start, struct node **end)
{
/* 変数宣言(必要に応じて増やす) */
struct node *s, *e, *p, *q, *tmp;

/* 初期値代入 */
s = *start;
e = *end;

/* TO DO ここに必要な処理を記述する */
for(p=s; p->next!=NULL; p = p->next)
{
for(q=e; q->prev!=NULL; q = q->prev)
{
if(p->data >= q->data) //p->data が q->data以上の時
{
tmp = p;
p->data = q->data;
p->next = q->next;
p->prev = q->prev;
q = tmp;
}
}
}
/* 結果代入 */
*start = s;
*end = e;
}




あと・・・課題には関係ありませんが、前回の課題で色々と解説をしてくださったのに返信ができずに過去ログという形で終わらせてしまってすみませんでした・・・
この場をかりてお詫び申し上げます・・・OTL


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


Name: box  ..ハッカー(129,115ポイント)   Date: 2008/11/16(日) 00:36   No:24154     
Title: Re:課題    
双方向リストに格納する際に昇順(または降順)に並んでいる状態にしておいて、
先頭から出力すれば昇順(または降順)に並んでいますし、
最後から出力すれば降順(または昇順)に並んでいます。

乱数の発生順(未ソートの状態)で双方向リストに格納したデータを後からソートするのは、
できなくはないと思いますがそれなりに手間がかかりそうです。


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

Name: Sleepy  ..入門者(2,717ポイント)   Date: 2008/11/16(日) 00:47   No:24155     
Title: Re:課題    
ポインタと実体について復習が必要かと思われます。

それとデータ量30個程度であれば処理時間を図るのはかなり困難でしょう。


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

Name: non  ..初心者(6,372ポイント)   Date: 2008/11/16(日) 11:35   No:24161     
Title: Re:課題    
boxさんが言われるように、リスト作成時に並べ替えなければ、リスト構造の意味がないと思いますが、
これが、課題ならしょうがない。
まずは、通常のソートを考えるのではなく、既にあるリストを先頭から1つずつノードを読んで、別のリストに昇順にリスト構造を作成していくのを考えた方が良いと思います。(挿入場所を探してノードを入れる)
それが、出来てからもっとはやい方法を考えるのでしょうね。
この場合、リスト構造に番兵を付けた方が簡単だと思います。ないと、特別解が増えます。


>それとデータ量30個程度であれば処理時間を図るのはかなり困難でしょう。

プログラムを読むと実際は5000個のようです。
ちなみに私のボロノートでは55.11秒かかりました。

なお、clock()の使い方として1回目の時間も記憶しておいて、2回目との差を求めなくてはいけないと思うのですが私の勘違いかな?


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

Name: non  ..初心者(6,405ポイント)   Date: 2008/11/16(日) 11:37   No:24162     
Title: Re:課題    
>プログラムを読むと実際は5000個のようです。
50000個の間違いです。


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

Name: 774  ..ぴよぴよ(257ポイント)   Date: 2008/11/17(月) 12:15   No:24224     
Title: Re:課題    
返信ありがとうございます!

未ソートによる双方向のソートはそれくらい難しいのですか・・・
あといろいろとプログラムに沢山のミスがあったこともこのレスでわかりました。

アドバイスと説明をありがとうございました!

あと、non様の
clock()の使い方として1回目の時間も記憶しておいて、2回目との差を求めなくてはいけないと思うのですが私の勘違いかな?

ですが、聞いた話ですと

time(&t1); //スタート
〜間〜
time(&t2); //ストップ

printf("%d", t2-t1); //経過時間表示

というのが

/*結果出力*/
ct = clock();
printf("\nResult of sorting:\n"); //昇順に並べるソート表示開始
print_list(start);
〜間〜
printf("Verify a reverse:\n"); //降順に表示開始
print_reverse(end); //表示終了

printf("program costs %4.2f sec.\n", (double)ct/CLOCKS_PER_SEC); //経過時間表示

(double)ct/CLOCKS_PER_SEC が 上の t2-t1 と同じで時間を表示している。

という風にex4-1.cに作られているのでソートだけを考えればいいといわれました。

説明不足でしたらすいません・・・


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

Name: non  ..初心者(6,849ポイント)   Date: 2008/11/17(月) 12:41   No:24225     
Title: Re:課題    

/* ソート */
clock();
sort(&start, &end);

/* 結果出力 */
ct = clock();
printf("\nResult of sorting:\n");
print_list(start);

printf("Verify a reverse:\n");
print_reverse(end);

printf("Program costs %4.2f sec.\n", <font color="Red">(double)ct/CLOCKS_PER_SEC);

1回目のclockでの戻り値を変数にいれなくていいのかなと思ったんです。
いつも私は、一度目も変数に入れて、(ct-ct1)/CLOCKS_PER_SEC してるものですから。
確か、clockは起動してからの経過時間だったと(確認してないけど)思うので、実行後の時間が表示されないのかなって。



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

Name: 774  ..ぴよぴよ(832ポイント)   Date: 2008/11/17(月) 17:05   No:24239     
Title: Re:課題    
えーっと・・・これは学校の先生が用意した課題のソースで、この内容は書き換えないといわれているだけで説明は受けてないので確実にはいえないのですが・・・多分clock();でソートする時間を数えるのでスタートさせてソートが終了したらそれまでの値をctに入れて printf()で(double)ct/CLOCKS_PER_SECとするとスタートしてからソート終了までの時間をCLOCKS_PER_SECが割って秒単位にしてくれている。
・・・ということだと思っていたのですが・・・間違ってるかもしれません、これはわからないので、すいません・・・
とりあえず課題が完成した友達によるとちゃんと表示してくれているそうです。


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

Name: non  ..初心者(7,093ポイント)   Date: 2008/11/17(月) 17:23   No:24240     
Title: Re:課題    
まぁ、clockの方は置いといて、課題の方は出来ましたか?


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

Name: 774  ..かけだし(1,218ポイント)   Date: 2008/11/17(月) 19:54   No:24247     
Title: Re:課題    
えっと・・・自分なりに考えてfor文のまわし方を直したりもしソートをする時の条件分岐も作って見たのですが、まだどこかでダメのようです

一応、こんな風になっております。

#include <stdio.h>
#include <stdlib.h> /* NULLポインタ */
#include "ex4.h"
void sort(struct node **start, struct node **end)
{
/* 変数宣言(必要に応じて増やす) */
struct node *s, *e, *tmp, *p, *q, *r, *t, *u;

/* 初期値代入 */
s = *start;
e = *end;

printf("ソートはりいます\n");
/* TO DO ここに必要な処理を記述する */
for(p=s; p!=NULL; p=p->next)
{
for(q=p->next; q!=NULL; q=q->next)
{
if(p->data >= q->data)
{
if(p->prev == NULL) //もし先頭だったら
{
printf("先頭いきマス\t");

tmp = p;
p->next = q->next;
p->prev = q->prev;
q->next = tmp->next;
q->prev = tmp->prev;

t = q->prev;
r = q->next;

t->next = q;
t->prev = p;
t->prev = q;

printf("先頭おわり\n");
}
else if(p->next == q) //隣同士だったら
{
printf("となり\t");
tmp = p;
p->next = q->next;
p->prev = q;
q->next = p;
q->prev = tmp -> prev;

t = q->prev;
r = p->next;

tmp = t->next;
t->next = p->prev;
r->prev = tmp->prev;

printf("おわり\n");
}
else //間の開いた列だったら
{
printf("ソート\n");
tmp = p;
p->next = q->next;
p->prev = q->prev;
q->next = tmp->next;
q->prev = tmp->prev;

t = q->prev;
r = q->prev;
u = p->next;

t->next = q;
r->next = p;
r->prev = q;
u->prev = q;
printf("ソートおわります\n");

}
}
}
}


/* 結果代入 */
*start = s;
*end = e;
}


ところどころにあるprintfはどこを回っているかのチェックのためのものです。
隣同士とソートの所で無限ループには言っていると思うのですが・・・まだわかってないです・・・


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

Name: non  ..初心者(7,598ポイント)   Date: 2008/11/17(月) 20:23   No:24248     
Title: Re:課題    
本当にこのように繋ぎ変えなければいけない問題なのでしょうか?
中のデータだけ交換すればいいのではないでしょうか?繋ぎ変えずに。
その方が、遙かに簡単で早い。

それよりも、前に言ったように、リスト構造を作り直す方法がいいと思いますが。。。。
参考までに。

void sort(struct node **start,struct node **end)
{
struct node *s,*e,*p,*q,*r;
s=e=NULL;
while(*start!=NULL){
q=*start;
*start=(*start)->next;
if(s==NULL){
q->next=NULL;
s=e=q;
}else{
for(p=s;p!=NULL;p=p->next){
if((p->data)>=(q->data)) break;
}
if(s==p){//先頭追加
q->prev=NULL;
q->next=s;
s->prev=q;
s=q;
}
else if(p==NULL){//最後尾追加
q->next=NULL;
q->prev=e;
e->next=q;
e=q;
}
else{ //途中追加
q->next=p;
q->prev=p->prev;
p->prev->next=q;
p->prev=q;
}
}
}
*start=s;
*end=e;
}



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

Name: non  ..初心者(7,947ポイント)   Date: 2008/11/17(月) 20:42   No:24252     
Title: Re:課題    
中のデータだけ交換し繋ぎ換えをしない場合のプログラムはこうなります。

void sort(struct node **start, struct node **end)
{
/* 変数宣言(必要に応じて増やす) */
struct node *p, *q;
int tmp;
/* TO DO ここに必要な処理を記述する */
for(p=*start; p->next!=NULL; p=p->next){
for(q=p->next; q!=NULL; q=q->next){
if((p->data)>(q->data)){
tmp=p->data;
p->data=q->data;
q->data=tmp;
}
}
}
}

ほら、遙かに簡単でしょ。
でも、これなら、void sort(struct node **start, struct node **end)にしなくていいですね。
void sort(struct node *start) これでいい。
だから、先生の意図と違います。
でも、ノードを繋ぎ変えてソートしたら、50000個やると、ものすごく時間がかかりますし、現実的でないのでいくら課題とはいえ、そんな問題出しますか?
僕が先生なら、リスト構造から2分木構造を作成して並び替えさせ、それを再び、リスト構造にする課題にしますけどね。
どうしても、今やってる方法でやるのならお手伝いしますけど、かなり無駄があるプログラムのようでしたよ。



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

Name: 774  ..かけだし(1,218ポイント)   Date: 2008/11/17(月) 23:27   No:24258 解決!     
Title: Re:課題    
こういうやり方もあったのですね・・・参考になりました!
えっと、この課題は双方向のリストは前と後ろからつなげるって言う考え方があると言う事を理解すると言うことらしいです。




Name: 入門レベル  ..ぴよぴよ(451ポイント)   Date: 2008/11/13(木) 17:27   No:23968       
Title: C言語 文字列判別    
文字列の中の判別がよくわからなくて困っております。例えば一文字入力しそれが数字ならば「数字です」と表示する

ような一文字を判別するプログラムならば容易くできます。これが一行になると端から1つ1つ見ていくプログラムが

必要になり、ファイルの中の数字を判別するとなるとさらにファイルから読み込む作業は必要になりますよね。


質問はお2つです。
@私は22日にその2冊の本を200円で買ったという文字列があったとしますと、

例えばこの文字列から数字だけ取り出すとして、
順に一文字ずつ読み込んでいって数字があればそこから次に数字以外の文字が現れるまでを範囲とし
取り出すという方法が思いつきますがどのようなプログラムになるのでしょうか。

※1文字ずつ読み込んで1つ1つ分けていくという方法を過去スレでも拝見しましたがそれではなく
範囲で取り出す方法を知りたいと思います。
表示の仕方は
22
2
200でも
22,2,200でも構いません。


Aこれをファイル全体で行うとするとどういうプログラムになるのか

です。教えてください。

※使用言語はC言語です。


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


Name: たかぎ [URL]  ..比類無きプログラマー(71,925ポイント)   Date: 2008/11/13(木) 17:51   No:23970     
Title: Re:C言語 文字列判別    
> @私は22日にその2冊の本を200円で買ったという文字列があったとしますと、
> 例えばこの文字列から数字だけ取り出すとして、

拡張文字集合が混在している文字列に対する判別は規格厳密合致プログラムでは不可能です。
処理系とロケールの特定が必要になります。

まずは、規約を熟読して、必要な情報を提供してください。


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

Name: 入門レベル  ..ぴよぴよ(504ポイント)   Date: 2008/11/13(木) 17:59   No:23971     
Title: Re:C言語 文字列判別    
>> @私は22日にその2冊の本を200円で買ったという文字列があったとしますと、
> 例えばこの文字列から数字だけ取り出すとして、

拡張文字集合が混在している文字列に対する判別は規格厳密合致プログラムでは不可能です。
処理系とロケールの特定が必要になります。

したらば
ABCDE22HIJK2LKJMJG200GHBという文字列を考えます。


>>まずは、規約を熟読して、必要な情報を提供してください。
書く前に2,3回は目を通しております。



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

Name: Mist  ..プログラマー(31,848ポイント)   Date: 2008/11/13(木) 18:04   No:23974     
Title: Re:C言語 文字列判別    
> 書く前に2,3回は目を通しております。

だったら、テンプレにある項目ぐらい記載してもらえませんか?


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

Name: non  ..入門者(3,259ポイント)   Date: 2008/11/13(木) 18:12   No:23977     
Title: Re:C言語 文字列判別    
範囲で取り出す方法という意味がわかりませんが、1文字ずつチェックしたらなぜいけないのですか?


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

Name: 入門レベル  ..ぴよぴよ(686ポイント)   Date: 2008/11/13(木) 18:15   No:23978     
Title: Re:C言語 文字列判別    
どの項目でしょうか?
規約に書かれている順番どおりに書くと
1:記載済み
2,3:構成すらわからないのでまだ未製作、考え方のみイメージした所です。
4,質問@、Aに当たります。
5,習いたてです。文法を一通り習った程度です。

環境はC言語
VisualC+2008です。

5と使用コンパイラ以外は記載していると思います。
ご不明な点があれば何がわからないのかをご指摘ください


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

Name: 入門レベル  ..ぴよぴよ(775ポイント)   Date: 2008/11/13(木) 18:19   No:23979     
Title: Re:C言語 文字列判別    
例えば最初の22を取り出すときに2,2と取り出して隣合わせて置いたとしても22なのはそう見えるだけで
機械は2を2個と判断してしまうと思います。このプログラムは次の図形描写に使うのです。1文字ずつチェックなのは
いいのですが取り出し方がまずいんじゃないかなと思います。


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

Name: たかぎ [URL]  ..比類無きプログラマー(71,950ポイント)   Date: 2008/11/13(木) 18:28   No:23980     
Title: Re:C言語 文字列判別    
> ABCDE22HIJK2LKJMJG200GHBという文字列を考えます。

それなら、strcspnとstrspnを組み合わせればよいだけかと思います。
全角数字など、拡張文字集合は扱わないんですよね?
拡張文字集合を扱うのであれば、ワイド文字列として入力して、wcscspnとwcsspnを使ってください。
ロケールの設定をお忘れなく。


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

Name: Mist  ..プログラマー(32,031ポイント)   Date: 2008/11/13(木) 18:30   No:23981     
Title: Re:C言語 文字列判別    

int main(void){
printf("2");
printf("2");
printf("\n");

return 0;
}

int main(void){
printf("22");
printf("\n");

return 0;
}


実際はファイルにでも書きだすべきでしょうが、あなたのいうところの機械とやらは上のプログラムで
出力される「22」と下のプログラムで出力される「22」が違うものと判断できるということでしょうか?


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

Name: Dixq (管理人)  ..伝説なるハッカー(888,005ポイント)   Date: 2008/11/13(木) 18:32   No:23982     
Title: Re:C言語 文字列判別    
「200冊ありますよ」という文字列を対象にしているのであって
「200冊ありますよ」という文字列からは200を数字として取り出さなくていいのですね?



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

Name: 入門レベル  ..ぴよぴよ(822ポイント)   Date: 2008/11/13(木) 18:35   No:23983     
Title: Re:C言語 文字列判別    
半角と全角では大幅にやり方が異なるということをさっきしりましたので数字は半角限定にしてください。
申し訳ありません。


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

Name: 入門レベル  ..ぴよぴよ(842ポイント)   Date: 2008/11/13(木) 18:37   No:23985     
Title: Re:C言語 文字列判別    
そのように聞いています。>Mistさん

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

Name: non  ..入門者(3,557ポイント)   Date: 2008/11/13(木) 18:40   No:23986     
Title: Re:C言語 文字列判別    
使い方が限定されますが、このようなことでしょうか?


#include <stdio.h>
#include<stdlib.h>
#include <ctype.h>
int main(void)
{
char *str="ABCDE22HIJK2LKJMJG200GHB";
char s[10],*s1;
while(*str!='\0'){
if(isdigit(*str)){
s1=s;
while(*str!='\0' && isdigit(*str))
*s1++=*str++;
*s1='\0';
printf("%d\n",atoi(s));
}
else
str++;
}
return 0;
}


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

Name: Mist  ..プログラマー(32,092ポイント)   Date: 2008/11/13(木) 19:01   No:23988     
Title: Re:C言語 文字列判別    
一文字ずつ処理してみました。


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

int main(void)
{
char *str="ABCDE22HIJK2LKJMJG200GHB";
long tmp;
int flg;

tmp = 0;
flg = 0;
while (*str != '\0') {
if (isdigit(*str)) {
tmp = tmp * 10;
tmp += (*str - '0');
flg = 1;
} else {
if (flg) {
printf("%d\n", tmp);
tmp = 0;
flg = 0;
}
}

str++;
}
return 0;
}




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

Name: Mist  ..プログラマー(32,386ポイント)   Date: 2008/11/13(木) 19:05   No:23989     
Title: Re:C言語 文字列判別    
最後が数字で終わってると出力されないバグがあったのでちょっと修正。


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

int main(void)
{
char *str="ABCDE22HIJK2LKJMJG200";
long tmp;
int flg;

tmp = 0;
flg = 0;
while (*str != '\0') {
if (isdigit(*str)) {
tmp = tmp * 10;
tmp += (*str - '0');
flg = 1;
} else {
if (flg) {
printf("%d\n", tmp);
tmp = 0;
flg = 0;
}
}

str++;
}
if (flg) {
printf("%d\n", tmp);
}
return 0;
}


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

Name: 入門レベル  ..ぴよぴよ(835ポイント)   Date: 2008/11/13(木) 19:08   No:23990     
Title: Re:C言語 文字列判別    
少し時間かけて分析してみます。よろしければAの方も教えていただけませんか?
行のみだと
char *str="ABCDE22HIJK2LKJMJG200GHB";とできますがファイルからだと使えないですよね。
その辺がまだよくわからなくて・・・



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

Name: たかぎ [URL]  ..比類無きプログラマー(72,177ポイント)   Date: 2008/11/13(木) 19:15   No:23991     
Title: Re:C言語 文字列判別    

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

int main(void)
{
const char str[] ="ABCDE22HIJK2LKJMJG200GHB";
const char d[] = "0123456789";
size_t i;
for (i = strcspn(str, d); i < sizeof(str)-1; i += strcspn(str + i, d))
{
size_t j = strspn(str + i, d);
printf("%.*s\n", j, str + i);
i += j;
}
return 0;
}

↑で済む話だと思いますが...


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

Name: Mist  ..プログラマー(32,453ポイント)   Date: 2008/11/13(木) 19:28   No:23993     
Title: Re:C言語 文字列判別    
ファイルの場合、char *strがFILE *fpになって、終了判定をEOFでチェックしましょう。
自分で作ってみてうまくいかなかったらまた質問してください。


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

Name: たかぎ [URL]  ..比類無きプログラマー(72,225ポイント)   Date: 2008/11/13(木) 19:34   No:23994     
Title: Re:C言語 文字列判別    
> ファイルの場合、char *strがFILE *fpになって、終了判定をEOFでチェックしましょう。

それほど大きくない(メモリに収まりきる程度の)ファイルであれば、いったん配列に読み込んでしまえば、あとは文字列として扱えますね。


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

Name: non  ..入門者(3,563ポイント)   Date: 2008/11/13(木) 20:18   No:23997     
Title: Re:C言語 文字列判別    
行単位で読めば、同じですが。
ただし、1行を100文字以内にしました。


FILE *fp;
char *str,str1[100];
char s[10],*s1;
ファイルオープン
while(fgets(str1,100,fp)!=NULL){ 行単位で読む
str=str1;
         前のプログラムをそのままここに書く

}



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

Name: 入門レベル  ..ぴよぴよ(861ポイント)   Date: 2008/11/13(木) 20:42   No:23999     
Title: Re:C言語 文字列判別    
ありがとうございました。考えてわからなかったらまたご質問します

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

Name: 入門レベル  ..かけだし(1,075ポイント)   Date: 2008/11/14(金) 09:39   No:24017     
Title: Re:C言語 文字列判別    

include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char *str,str1[100];
char s[10],*s1;



if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
if(isdigit(*str)){
s1=s;
while(*str!='\0' && isdigit(*str))
*s1++=*str++;
*s1='\0';
printf("%d\n",atoi(s));
}
else
str++;
}
fclose(fp);
}
return 0;
}


とすると
ビルドエラーはでないのですが
Debug Assertion Failed
File:fgets.c
Line:60
Expression:str!=NULL


と出て実行できません。
どこが間違ってるのでしょうか



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

Name: non  ..入門者(3,624ポイント)   Date: 2008/11/14(金) 10:03   No:24018     
Title: Re:C言語 文字列判別    
段下げを、正確にする癖をつけましょう。
1行目、#がない。これは、おそらくコピーミス。
fcloseの場所が悪い。
段下げを正確にしないから、場所を間違えます。


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

Name: 入門レベル  ..かけだし(1,521ポイント)   Date: 2008/11/14(金) 10:55   No:24019     
Title: Re:C言語 文字列判別    

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char *str,str1[100];
char s[10],*s1;



if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
if(isdigit(*str)){
s1=s;
while(*str!='\0' && isdigit(*str))
*s1++=*str++;
*s1='\0';
printf("%d\n",atoi(s));
}
else
str++;
}
}
fclose(fp);

return 0;
}



うーん、これだと思ったのですが同じ結果です。
段下げは今始めて聞いたので・・
勉強しておきます


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

Name: やそ  ..比類無きプログラマー(85,091ポイント)   Date: 2008/11/14(金) 11:13   No:24020     
Title: Re:C言語 文字列判別    
字下げ(インデント)だけ空白2文字でそろえてみたつもり・・・


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char *str,str1[100];
char s[10],*s1;



if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
if(isdigit(*str)){
s1=s;
while(*str!='\0' && isdigit(*str))
*s1++=*str++;
*s1='\0';
printf("%d\n",atoi(s));
}
else
str++;
}
}
fclose(fp);
return 0;
}


さあ、考えてみよう^^


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

Name: non  ..入門者(3,661ポイント)   Date: 2008/11/14(金) 11:22   No:24021     
Title: Re:C言語 文字列判別    
入門レベルさんへ
fcloseの位置はよくなりました。動くはずですが・・・?
前と、同じエラーですか?



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

Name: 入門レベル  ..かけだし(1,527ポイント)   Date: 2008/11/14(金) 11:33   No:24022     
Title: Re:C言語 文字列判別    
同じエラーです。

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

Name: non  ..入門者(3,723ポイント)   Date: 2008/11/14(金) 11:47   No:24023     
Title: Re:C言語 文字列判別    
私の環境では動きます。(Borland C++)
Visual C++2008 は使ったことがないのでわかりません。
どなたかVisualC++2008で確認願えますか?

ところで、ファイル(memo.txt)はどんなんですか?


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

Name: Mist  ..プログラマー(32,461ポイント)   Date: 2008/11/14(金) 11:47   No:24024     
Title: Re:C言語 文字列判別    
入門レベルさんのソースをVC++2008EEで実行してみましたが、正常に動作しますよ。
一度リビルドしてみてはいかがでしょうか。


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

Name: 入門レベル  ..かけだし(1,635ポイント)   Date: 2008/11/14(金) 11:53   No:24025     
Title: Re:C言語 文字列判別    
メモ帳でABCDE22HIJK2LKJMJG200みたいな文をコピペで30行ぐらい貼り付けたものです。
少しいじくってみますね


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

Name: 入門レベル  ..かけだし(1,689ポイント)   Date: 2008/11/14(金) 11:59   No:24026     
Title: Re:C言語 文字列判別    
すいません。

>>if ((fp = fopen("memo.txt", "r")) == NULL) {



if ((fp = fopen("memo.txt", "r")) = NULL) {

になっていました・・
無事できましたありがとうございました。


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

Name: GPGA  ..熟練のプログラマー(53,297ポイント)   Date: 2008/11/14(金) 12:00   No:24027     
Title: Re:C言語 文字列判別    
一行の文の中にある数字の数が9個を超えると、
バッファオーバーフローが発生しますが、それが原因の可能性はありますか?


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

Name: non  ..入門者(3,761ポイント)   Date: 2008/11/14(金) 12:20   No:24028     
Title: Re:C言語 文字列判別    
コピペだろうになんで?

1行の数字の数ではなく、桁数が9桁を超えた場合はおかしくなります。


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

Name: 入門レベル  ..かけだし(1,711ポイント)   Date: 2008/11/14(金) 13:17   No:24029     
Title: Re:C言語 文字列判別    
以前エラー原因しらべてたときにコピペで貼り付けたのをそのままコンパイルするなとかあったのみたので手動で・・

ところですっかり忘れていたのですがこのプログラムだと小数点の数字が表示されないですよね。
%dの所を%fとかにしてみましたが動かず。どうすれば小数点数字も表示されますか?


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

Name: non  ..入門者(3,803ポイント)   Date: 2008/11/14(金) 13:45   No:24031     
Title: Re:C言語 文字列判別    
小数点は数字じゃないですからね。
isdigitとatoiの所も変更が必要ですね。


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

Name: たかぎ [URL]  ..比類無きプログラマー(72,350ポイント)   Date: 2008/11/14(金) 14:05   No:24032     
Title: Re:C言語 文字列判別    
> どうすれば小数点数字も表示されますか?

あとから、符号や指数部も表示されないとか言い出しそうですね。


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

Name: 入門レベル  ..かけだし(1,769ポイント)   Date: 2008/11/14(金) 14:20   No:24033     
Title: Re:C言語 文字列判別    
数字は整数と小数点数字の両方表示できる気でいたんですがプログラム見る限り無理ということに気づきました。
符号と指数部はまた別物でしょう。大変失礼ですが何のアドバイスもなく嫌味としかとれない書き込みは控えていただきたい。


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

Name: たかぎ [URL]  ..比類無きプログラマー(72,412ポイント)   Date: 2008/11/14(金) 14:36   No:24034     
Title: Re:C言語 文字列判別    
> 数字は整数と小数点数字の両方表示できる気でいたんですが

結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
だとすると、ぜんぜん話が違います。

> 符号と指数部はまた別物でしょう。

少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...

> 何のアドバイスもなく

(スルーされているようですが)何度もアドバイスしていますよ。


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

Name: 入門レベル  ..かけだし(2,020ポイント)   Date: 2008/11/14(金) 14:44   No:24035     
Title: Re:C言語 文字列判別    
>>結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
だとすると、ぜんぜん話が違います。

そういうことになります。まだ習いたてなので即思いつきませんでした。


>>少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...

その辺はまだなんとも・・。

>>(スルーされているようですが)何度もアドバイスしていますよ。

失礼ですがNo:24032 の書き込みに対してのみ言っています。
まだ理解できない単語があって難しいということもあり、知っている単語が書いてあるnonさんの書き込みに目がいきました。たかぎさんのアドバイスは後々参考にさせていただきます。


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

Name: non  ..入門者(4,025ポイント)   Date: 2008/11/14(金) 15:06   No:24036     
Title: Re:C言語 文字列判別    
NCコードのような数値のみ取り出したいと思っていました。
数値としてどこまで必要か、正確にお知らせください。
すべてを満足するようにすると、かなり面倒なことになりますので、必要でない条件は加えないでください。
例えば 数字の間にスペースが入る場合とか、2行に数字が渡っているとか・・・
指数表示とか、まして、式が入るとか。有効数字は何桁かなどなど・・・

なお、小数点が含まれた場合は、先のヒントで解けたでしょうか?




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

Name: 入門レベル  ..かけだし(2,063ポイント)   Date: 2008/11/14(金) 15:15   No:24038     
Title: Re:C言語 文字列判別    
まだisdigitやatoiなど本見ながらじゃないとできないレベルですので当分時間がかかると思います。


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,018ポイント)   Date: 2008/11/14(金) 16:13   No:24050     
Title: Re:C言語 文字列判別    
>> 結局、「数字」ではなく「整数」や「浮動小数点数」を扱いたいということでしょうか?
>> だとすると、ぜんぜん話が違います。
> そういうことになります。まだ習いたてなので即思いつきませんでした。

No:23978では、規約の「自分が今行いたい事は何か」に関して

> 1:記載済み

とのことでしたので、最初の質問内容のみを条件と考えていましたが、どうやらいったん振り出しに戻ったほうがよさそうです。
結局やりたいことは何なのか、改めて定義してみてください。
仮にC言語のレベルが低くても、必要なことを普通に日本語で説明していただければ、それなりの対応ができるはずです。

>> 少なくとも符号が扱えなければ整数も浮動御小数点数も表現できないと思うのですが...
> その辺はまだなんとも・・。

例えば、- という符号が使えなければ、-123のような負の値を表現できませんよね。
-123ではなく、▲123とか、(123)でマイナス(というか赤字)を表現するにしても、何らかの形で符号が必要なはずです。
負の値を扱う必要がないのないのであれば、それを明確にしてください。扱うのであればどうすればよいのか明確にしてください。3桁ごとの区切りが必要とか、漢数字やローマ数字を使うとか、そういったこともあるなら明確にしてください。

また、「整数」というのは、一般的には(数学的には)絶対値の上限が制約されません。制約があるなら、あるいは制約を課してもよいなら、それを明確にしてください。
浮動小数点数の精度についても同様です。C言語では、浮動小数点数というのは複素数も含みますが、複素数を扱う必要がないならそのことも明確にしてください。非数や無限大についてもお願いします。

後だし条件を極力排除するように、くどい補足要求になっていますが、ご協力お願いします。

> 失礼ですがNo:24032 の書き込みに対してのみ言っています。

その一点だけをとらえて、アドバイスがないことを非難されても...



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

Name: 入門レベル  ..入門者(2,579ポイント)   Date: 2008/11/14(金) 17:16   No:24061     
Title: Re:C言語 文字列判別    
完全に私のミスで申し訳ないです。これ以上追加はありません。ですので1つにまとめます。



>>とのことでしたので、最初の質問内容のみを条件と考えていましたが、どうやらいったん振り出しに戻ったほうがよさそうです。
結局やりたいことは何なのか、改めて定義してみてください。
仮にC言語のレベルが低くても、必要なことを普通に日本語で説明していただければ、それなりの対応ができるはずです。


※整数に絶対値の上限の制約はつけても大丈夫です浮動少数もファイルを見た所小数点以下5桁が最高のようです。
無限大、複素数なし。

私の作ったファイル(memo.txt)では符号(-)はないですが今後のことも考え符号付の整数も入れれるようにしたいと思います。

ですのでX86.191Y-0.022など書かれた文字列から符号付の数字を取り出す

ex)X84.534Y0.351
X101.25Y-0.934


結果
84.534
0.351
101.25
-0.222

となればokです


>>その一点だけをとらえて、アドバイスがないことを非難されても

もうこの話題はよしましょう。ただ文章には書き手と読み手が存在します。書き手が書いたことを読み手がどう思うか
は人それぞれです。貴方の私に対する回答に私が不満を覚えた。それだけです。世間的にどちらが悪いとかいうのは
ありません。それさえ肝に銘じておいていただければいいです。もちろん私の反論で貴方が気分を害してるのも承知しています。読み手がどう思うかはある程度予測がつくと思うので私も貴方も今後気をつければいいでしょう。


度重なる追加真に申し訳ありません。今後このようなことはないように心がけます。




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

Name: non  ..入門者(4,782ポイント)   Date: 2008/11/14(金) 17:33   No:24062     
Title: Re:C言語 文字列判別    
前回の小数点にチャレンジしてもらえれば、その後は−符号だけですから、そんなに難しくないでしょう。
小数点以下6桁ですから、atofでいいと思います。

変更するのは下の3行だけです。

if(isdigit(*str)){

while(*str!='\0' && isdigit(*str))

printf("%d\n",atoi(s));

符号に−をつかえるようにするのは、上の2行を工夫してください。
桁数のための配列は安全のため、もうすこし大きくした方がいいかもしれません。小数点より上の桁数がわかりませんので。




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

Name: 通りすがり  ..中級者(11,684ポイント)   Date: 2008/11/14(金) 17:51   No:24063     
Title: Re:C言語 文字列判別    
教えてくれしか言ってないくせに何この態度。
たかぎさんの指摘は正しかったのにもうその話題はよしましょう?
偉そうにしても答えてくれる人がいるからっていい気になってるとしか思えませんね。
もう少し態度改めたらどうです?


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,024ポイント)   Date: 2008/11/14(金) 18:05   No:24064     
Title: Re:C言語 文字列判別    
こんな感じでどうでしょうか?

void func(FILE *stream)
{
while (fscanf(stream, "%*[^0-9.+-]") != EOF)
{
int c = getc(stream);
int minus = 0;
double x = 0, f = 1;

switch (c)
{
case '+':
break;
case '-':
minus = 1;
c = getc(stream);
break;
}

while (isdigit(c))
{
x = x * 10 + c - '0';
c = getc(stream);
}

if (c == '.')
{
c = getc(stream);

while (isdigit(c))
{
f /= 10;
x = x + f * (c - '0');
c = getc(stream);
}
}
if (minus)
{
x = -x;
}
printf("%#g\n", x);
}
}

元の桁数を維持したいのであれば、いったんxに格納するのではなく、文字列として管理する必要があるでしょう。


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

Name: non  ..入門者(4,799ポイント)   Date: 2008/11/14(金) 18:31   No:24065     
Title: Re:C言語 文字列判別    
たかぎさん
printf("%#g\n", x);
この#フォーマット指定子は初めて知りました。入門レベルさんの小数点以下表示をどうしようかと
思ってました。たぶんどうでもいいとは思いましたが。
fscanf(stream, "%*[^0-9.+-]") != EOF といい、こういうの得意ですね。
私は、相手がマイコンなので、ほとんど使ったことがありません。




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

Name: non  ..入門者(4,722ポイント)   Date: 2008/11/14(金) 18:39   No:24066     
Title: Re:C言語 文字列判別    
あれ、勘違いか。
小数点以下の不要な0の非表示じゃ、ないんですね。
整数値の0表示みたいですね。
実行せずに、申し訳ありません。

小数点以下の0の非表示をするフォーマット指定子ってあるんですか?
(自分で調べろっていわれそう)m(_ _)m





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

Name: バグ  ..ハッカー(124,929ポイント)   Date: 2008/11/14(金) 18:47   No:24067     
Title: Re:C言語 文字列判別    
何日か前に非常によく似た質問に回答したような気がするのは私だけでしょうか…
あの時はMFCを使いましたが、考え方自体は同じなんで、過去スレを検索するのも良いかもしれませんよ(・ω・)ノ


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

Name: Mist  ..プログラマー(32,539ポイント)   Date: 2008/11/14(金) 18:52   No:24068     
Title: Re:C言語 文字列判別    
あれは見たけど質問主さんのやりたいこととはなんか違うっていうのが話の始まりだったかと。

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

Name: バグ  ..ハッカー(124,984ポイント)   Date: 2008/11/14(金) 19:07   No:24070     
Title: Re:C言語 文字列判別    
そうでしたか(^_^;)

現状を見ると、そっくりに見えたもので、つい口をはさんでしまいました。失礼しました…m(_ _)m


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,051ポイント)   Date: 2008/11/14(金) 19:18   No:24071     
Title: Re:C言語 文字列判別    
> printf("%#g\n", x);

これは、最初 "%#.*g\n" にしようと思って付けていたもので、単なる消し忘れです。


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

Name: non  ..入門者(4,795ポイント)   Date: 2008/11/14(金) 20:17   No:24072     
Title: Re:C言語 文字列判別    
あっちこっち調べてみましたけど、小数点以下の不要な0を表示しない指定子は見つかりませんでした。
なさそうですね。作った方がはやそう。



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

Name: たかぎ [URL]  ..比類無きプログラマー(73,077ポイント)   Date: 2008/11/14(金) 20:50   No:24075     
Title: Re:C言語 文字列判別    
> あっちこっち調べてみましたけど、小数点以下の不要な0を表示しない指定子は見つかりませんでした。

小数点以下の桁数は分かっているわけですから、指数部が不要なのであれば、

fprintf(stream, "%.*f\n", 小数点以下の桁数, x);

とすれば実現できます。
この場合、小数点以下の桁数が0であれば、小数点以下の0や小数点は出力されません。


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

Name: non  ..入門者(4,886ポイント)   Date: 2008/11/14(金) 21:30   No:24081     
Title: Re:C言語 文字列判別    
小数点以下の桁数は分かっていないと思いますが、
>結果
>84.534
>0.351
>101.25
>-0.222

このように、2桁の場合と3桁の場合があります。
でも、これも始めて知りました。*がミソですか。ワイルドカードですね。
fprintf(stream, "%.*f\n", 小数点以下の桁数, x);


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(65,617ポイント)   Date: 2008/11/15(土) 07:45   No:24106     
Title: Re:C言語 文字列判別    
今までの流れを全否定するようなことかもしれませんが、
ひとつ気になっていることがあるので書き込みをします。

次の図形描写に使いたいという意図が入門レベルにあるようなので、
任意の文字列から数値列を取り出すのではなくて、
入力するファイルのフォーマットは決まっているんじゃないでしょうか。



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

Name: たかぎ [URL]  ..比類無きプログラマー(73,288ポイント)   Date: 2008/11/15(土) 08:01   No:24107     
Title: Re:C言語 文字列判別    
> 次の図形描写に使いたいという意図が入門レベルにあるようなので、
> 任意の文字列から数値列を取り出すのではなくて、
> 入力するファイルのフォーマットは決まっているんじゃないでしょうか。

多分そうだと思いますが、そのような質問の仕方ではないですよね。
図形描写といっても、具体的には何のことかさっぱりわかりませんし。



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

Name: non  ..初心者(5,856ポイント)   Date: 2008/11/15(土) 17:38   No:24124     
Title: Re:C言語 文字列判別    
たぶん、こんなんでしょうね。
>X84.534Y0.351
>X101.25Y-0.934

昔、デジタイザでクリックした座標を上のように取り込んで、XYプロッタで書かせるプログラムを作ったことがあります。25年ぐらい前でしたか・・・。年がばれますね。






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

Name: 入門レベル  ..入門者(2,860ポイント)   Date: 2008/11/17(月) 16:33   No:24234     
Title: Re:C言語 文字列判別    
>>教えてくれしか言ってないくせに何この態度。
たかぎさんの指摘は正しかったのにもうその話題はよしましょう?
偉そうにしても答えてくれる人がいるからっていい気になってるとしか思えませんね。
もう少し態度改めたらどうです?


教えてもらう側が教える側に敬意を評するのは当然ですが、貴方のように教えてもらう人を見下す人がいるのもまた事実。さらに言うならばたかぎさんにはアドバイスをいただき感謝をいているからこそ不毛な論争を避けるべく、発言しましたが本来はあなたのような人に言うべきでしょうね。アドバイスも出さないで煽ることしかしない人は黙っててもらえませんか?たかぎさんに文句をいわれるならともかくね・・。
以前も書きましたがどちらが悪いとも言っていません。ただ私が若干気分を害しただけのこと。
態度を改めろと言われると少し納得しますがそれ以上にそっくりそのまま貴方にお返ししますよ。



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

Name: 入門レベル  ..入門者(2,865ポイント)   Date: 2008/11/17(月) 16:36   No:24235     
Title: Re:C言語 文字列判別    
類似スレは見ましたが区別と取り出しはまた違うプログラムかなと思いましたので質問させていただきました

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

Name: 入門レベル  ..入門者(2,889ポイント)   Date: 2008/11/17(月) 16:37   No:24236 解決!     
Title: Re:C言語 文字列判別    
最後に貴重な意見ありがとうございました。

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

Name: non  ..初心者(7,063ポイント)   Date: 2008/11/17(月) 16:58   No:24237     
Title: Re:C言語 文字列判別    
参考までに解答例

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char *str,str1[100];
char s[10],*s1;

if ((fp = fopen("memo.txt", "r")) == NULL) {
printf("file open error!!\n");
return EXIT_SUCCESS;
}

while (fgets(str1, 100, fp) != NULL) {
str=str1;
while(*str!='\0'){
if(isdigit(*str) || *str=='-' || *str=='.'){
s1=s;
while(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.'))
*s1++=*str++;
*s1='\0';
printf("%f\n",atof(s));
}
else
str++;
}
}
fclose(fp);
return 0;
}


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

Name: 入門レベル  ..入門者(2,910ポイント)   Date: 2008/11/17(月) 17:00   No:24238     
Title: Re:C言語 文字列判別    
親切にどうもありがとうございました。

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



Name: Haru  ..上級者(20,480ポイント)   Date: 2008/11/17(月) 13:03   No:24226 解決!       
Title: 親子間でプロセス間通信    
下のソースは勉強の為にサンプルであったプログラムをそのままコピペしたものなのですが、
このままだと、コンパイルエラーを起こしてしまいます。


#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
pid_t pid ;
char buffer[10],result[10];
int pp[2] , qq[2];
int a , b , c ;

pipe(pp); /* 親へデータを送るためのパイプ */
pipe(qq); /* 計算結果を子に送るためのパイプ */

pid = fork(); /* 親子のプロセスの生成 */

/* 子プロセスの動き */
if ( pid == 0 )
{
close(pp[0]);
close(qq[1]);

/* 1つ目の変数の代入とパイプへの書き込み */
printf("a = ");
fgets(buffer,10,stdin);
write(pp[1],buffer,strlen(buffer)+1);

/* 2つ目の変数の代入とパイプへの書き込み */
printf("b = ");
fgets(buffer,10,stdin);
write(pp[1],buffer,strlen(buffer)+1);

/* 計算結果を読み込む */
read(qq[0],result,10);

printf("a + b = %s\n",result);
close(qq[0]);
close(pp[1]);
}
/* 親プロセスの動き */
else
{
close(qq[0]);
close(pp[1]);

/* 1つ目の変数の読み込み */
read(pp1[0],buffer,256);
a = atoi(buffer);

/* 2つ目の変数の読み込み */
read(pp2[0],buffer,256);
b = atoi(buffer);

c = a + b ; /* 計算 */
sprintf(buffer,"%d",c);

/* 計算結果をパイプへ書き込む */
write(qq[1],buffer,strlen(buffer)+1);

close(pp[0]);
close(qq[1]);
}

return(0);
}

原因はここで、pp1、pp2の変数が定義されてないからなのですが、
>read(pp1[0],buffer,256);
>read(pp2[0],buffer,256);


read(pp[0],buffer,256);
read(pp[1],buffer,256);

このように設定しても、期待通りの動作(足し算)をしません。
どのようにしたら、よいでしょうか?
参考サイト

http://www.geocities.jp/sugachan1973/doc/funto45.html







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


Name: toyo  ..上級者(20,455ポイント)   Date: 2008/11/17(月) 13:49   No:24227     
Title: Re:親子間でプロセス間通信    

read(pp[0],buffer,256);
read(pp[1],buffer,256);

pp[1] は書き込み用なので read できませんよ
両方とも pp[0] ではないでしょうか


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

Name: Haru  ..上級者(20,433ポイント)   Date: 2008/11/17(月) 14:02   No:24228     
Title: Re:親子間でプロセス間通信    
>toyoさん

ありがとうございます。
おかげで解決しました!!
勉強に丁度良いサンプルがコンパイルできなくて、困ってたので助かりました!


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



Name: neco  ..ぴよぴよ(62ポイント)   Date: 2008/11/16(日) 21:37   No:24199       
Title: アルゴリズムのソースコード    
[整数aに値を入力する]⇒[aが正の場合、aの値の回数”(a×ループ回数)の値”を表示する]
というアルゴリズムのソースコードはどうなるか、教えてください!


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


Name: たかぎ [URL]  ..比類無きプログラマー(73,295ポイント)   Date: 2008/11/16(日) 21:54   No:24200     
Title: Re:アルゴリズムのソースコード    
> [整数aに値を入力する]

整数aとのことですが、整数型のオブジェクトではなく「整数」なんですよね。
列挙定数か何かでしょうか?
それに入力するとは?

可能な限り好意的に解釈すると...

template <int a>
void f()
{
for (int i = 0; i < a; i++)
{
std::cout << "(a×ループ回数)の値" << std::endl;
}
}

といったところでしょうか?

追記:
ソースコードが間違っていたので修正しました。


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

Name: non  ..初心者(7,138ポイント)   Date: 2008/11/16(日) 22:03   No:24202     
Title: Re:アルゴリズムのソースコード    
>aの値の回数”(a×ループ回数)の値”を表示
ってのが、どういうことなのか理解できません。環境はもちろんのこと。
a=3のときの実行結果は

(a×ループ回数)の値
(a×ループ回数)の値
(a×ループ回数)の値

ってことですか?


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

Name: neco  ..ぴよぴよ(183ポイント)   Date: 2008/11/16(日) 22:38   No:24206     
Title: Re:アルゴリズムのソースコード    
日本語の意味がよくわからないので、


int main(){
int a,i;
for(i=0; i<a && a>0; i++){
printf("%d\n",a*i)
}
}

というような解釈をして、ソースコードで表してみたんですが、これでいいんですか?


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(65,689ポイント)   Date: 2008/11/16(日) 22:45   No:24207     
Title: Re:アルゴリズムのソースコード    
>日本語の意味がよく分からない
というのは自分自身で書かれた質問文の日本語の意味がよく分からないという意味ですか?
多分書かれたnecoさん以外に分かる人はいないと思います。

もし、この問題が与えられたものならば、問題を出した人に聞くのがベストだと思います。


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

Name: conio  ..入門者(3,521ポイント)   Date: 2008/11/17(月) 02:41   No:24221     
Title: Re:アルゴリズムのソースコード    

--------------------------------------------------------------------------------
日本語の意味がよくわからないので、
int main(){
int a,i;
for(i=0; i<a && a>0; i++){
printf("%d\n",a*i)
}
}


というような解釈をして、ソースコードで表してみたんですが、これでいいんですか?
-------------------------------------------------------------------------------

このプログラムは実行できましたか?恐らくエラーが出ると思います。
@aが初期化されていない
A何もincludeされていない(省略したのかもしれませんが)
Bprintf文の後に";"が無い


後、問題を勝手に解釈してみました。
【問】入力した整数をaに代入し、a > 0なら、"ループの回数 × a"の値を表示する。

#include<stdio.h>

int main(void)
{
int a,i;

printf("aの値を入力してください:");
scanf("%d",&a);

if(a > 0){
for(i = 1; i <= a; i++){
printf("%d *(%d回目のループ)= %dです。\n", a, i, a * i);
}
}
return(0);
}




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

Name: neco  ..ぴよぴよ(195ポイント)   Date: 2008/11/17(月) 12:07   No:24223 解決!     
Title: Re:アルゴリズムのソースコード    
わかりました!ありがとうございました!

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



Name: たっくん  ..ぴよぴよ(410ポイント)   Date: 2008/11/14(金) 15:41   No:24044       
Title: 教えてください(文字と文字列について)    
お初ですが質問させてください。
今作っているコードで
標準入力から文字列を読み込み、その中のアルファベットの出現回数(文字「a」が何回、文字「b」が何回、…)を計算し、出現回数が1以上の文字について次のように表示(文字・出現回数・グラフ)するプログラムを書け。
結果
input string: Tokyo Osaka Nagoya
N --1 *
O --1 *
T --1 *
a --4 ****
g --1 *
k --2 **
o --3 ***
s --1 *
y --2 **
というコードを作って
#include<stdio.h>
int main(void)
{
int kmozi[301];
int cnt = 0, mcnt, aknt;
char buff[256];
printf("文字列入力:");
gets(buff);
while(kmozi[cnt] <= 299)
{
kmozi[cnt] = 0;
cnt++;
}
//scanf("%s", buff);
for(cnt = 0;kmozi[cnt] <= 126;++cnt)
{
//kmozi[cnt] = 0;
for(mcnt = 0;buff[mcnt] != '\0';++mcnt)
{
if (buff[mcnt] == cnt)
{
kmozi[cnt] += 1;
}
}
if (kmozi[cnt] > 0)
{
printf("%c -- %d\t", cnt, kmozi[cnt]);
aknt = 0;
while(kmozi[cnt] > aknt)
{
printf("* ");
++aknt;
}
printf("\n");
}
}
return(0);
}

という感じで作ったのですが
これを実行すると

Run-Time Check Failure #2 - Stack around the variable 'kmozi' was corrupted.
(Press Retry to debug the application)

というデバックエラーが起こるのですがどうすればこのエラーが出なくなるのか教えてもらえませんでしょうか?
よろしくお願いします。


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


Name: GPGA  ..熟練のプログラマー(53,314ポイント)   Date: 2008/11/14(金) 15:47   No:24046     
Title: Re:教えてください(文字と文字列について)    
>while(kmozi[cnt] <= 299)
判定するのはcntが299以下のときではないですかね?


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

Name: non  ..入門者(4,423ポイント)   Date: 2008/11/14(金) 16:14   No:24051     
Title: Re:教えてください(文字と文字列について)    
出現回数をカウントする部分と、表示する部分は、分けて考えましょう。

カウントはこんなんかな。

for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
kmozi[buf[mcnt]]++;



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

Name: GPGA  ..熟練のプログラマー(53,665ポイント)   Date: 2008/11/14(金) 16:43   No:24054     
Title: Re:教えてください(文字と文字列について)    
おまけでC++バージョン。
全角と半角を混ぜた場合に、グラフがずれるのは仕様

#include <iostream>
#include <map>
#include <string>

int main()
{
setlocale(LC_CTYPE, "");
std::map<wchar_t, int> check;

// 文字列取得
std::wstring str;
std::cout << "文字列入力:";
std::wcin >> str;

// 文字数を数える
{
std::wstring::const_iterator it = str.begin();
for (; it != str.end(); ++it) {
++check[*it];
}
}

// 結果を出力
{
std::map<wchar_t, int>::const_iterator it = check.begin();
for (; it != check.end(); ++it) {
std::wcout << it->first << L"--" << it->second;
for (int i = 0; i < it->second; ++i) {
std::cout << "*";
}
std::cout << std::endl;
}
}
return 0;
}
 


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

Name: たっくん  ..ぴよぴよ(566ポイント)   Date: 2008/11/17(月) 09:55   No:24222 解決!     
Title: Re:教えてください(文字と文字列について)    
返信遅くなって申し訳ないです。
GPGAさんnonさん、返信ありがとうございます。
言われた通りに
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
kmozi[buf[mcnt]]++;
を入れてみたらエラーが出なくなりました。
どうもありがとうございました。
また何かわからないことがありましたら聞くことがあるかと思いますが、
その時はまたよろしくお願いします。


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



Name: J  ..上級者(15,979ポイント)   Date: 2008/11/15(土) 21:37   No:24143       
Title: 二重定義・・・?    
なんどもすみません
先ほどの所にも書き込んだのですが、解決マークがついたままなので新スレ立てました。。
エラーが大量出てきました・・・

コンパイルしています...
1>main.cpp
1>リンクしています...
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(vsprintf.obj) : error LNK2005: _vsprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dbgrptw.obj) : error LNK2005: __CrtDbgReportW は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "public: void __thiscall type_info::_type_info_dtor_internal_method(void)" (?_type_info_dtor_internal_method@type_info@@QAEXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
1>LIBCMTD.lib(getenv.obj) : error LNK2005: _getenv は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(abort.obj) : error LNK2005: _abort は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。
1>D:\Program1\gtest\Debug\gtest.exe : fatal error LNK1120: 外部参照 9 が未解決です。
1>ビルドログは "file://d:\Program1\gtest\Debug\BuildLog.htm" に保存されました。
1>gtest - エラー 40、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

どれもこれも大量すぎて意味が分かりません。。
どうやらマクロあたりがいけないのかなあ・・・


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


Name: 御津凪 [URL]  ..プログラマー(36,151ポイント)   Date: 2008/11/16(日) 05:37   No:24158     
Title: Re:二重定義・・・?    
恐らく、ビルドするプロジェクトの設定が問題でしょう。

エラーのほとんどは、コンパイルする際に指定するランタイムライブラリが原因です。

ビルドするプロジェクトのプロパティから、

C/C++ → コード生成 → ランタイムライブラリ

の値を

"マルチスレッド デバッグ (/MTd)"

に変更してください。

それで大量のリンカエラーは激減するはずです。


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

Name: J  ..上級者(16,048ポイント)   Date: 2008/11/16(日) 22:02   No:24201 解決!     
Title: Re:二重定義・・・?    
うわーお
すごいです、全て無くなりました!
ありがとうございます!

うーん、VC2008って面倒ですねぇ。
BCCの方が楽でした。


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



Name: girisya  ..ぴよぴよ(243ポイント)   Date: 2008/11/15(土) 17:21   No:24118       
Title: プログラムの構造と誤り    
struct world{
float x,float y,float z
};
struct list
{
struct world w;
struct list *ptr;
};

mai(){
struct listl[4];
unsigned char c=1,mx=4,my=2,mz=1;
for(i=0;i<4;i++,c<<1)
{
l[i].w.x=float(c&mx);
l[i].w.y=float(c&my);
l[i].w.z=float(c&mz);
l[i].ptr=&l[i+1];
}
}

というプログラムがあるんですが2つ質問したいんです。
@このプログラムで作成されるデータ構造の名称
Aプログラム中に、ある誤りが含まれている。どう直せばいいか。
です。

このプログラムが何を意味しているのかもわかりません。
よろしくお願いします!


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,263ポイント)   Date: 2008/11/15(土) 17:39   No:24126     
Title: Re:プログラムの構造と誤り    
こんにちは。
プログラムコードはタグを使って投稿して下さいね。
詳しくは規約をご覧下さい。

あと、このコードは自分でコンパイルしてみましたか?

mai()

という関数は、main()関数のことですか?
変数がどこで宣言されているかもわかりませんし、
まずはコンパイルの通る形にして見ましょう。

コンパイルの通る形に出来ないなら、コンパイルした時に表示されるエラーメッセージを投稿して下さい。

これは誰かから渡されたコードですか?


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

Name: non  ..初心者(6,007ポイント)   Date: 2008/11/15(土) 17:57   No:24130     
Title: Re:プログラムの構造と誤り    
とりあえずエラーはなくしてみました。
ついでに格納したものを表示しました。

#include <stdio.h>
struct world{
float x;
float y;
float z;
};
struct list{
struct world w;
struct list *ptr;
};

int main(void)
{
struct list l[4];
unsigned char c=1,mx=4,my=2,mz=1;
int i;
for(i=0;i<4;i++,c<<=1) {
l[i].w.x=(float)(c & mx);
l[i].w.y=(float)(c & my);
l[i].w.z=(float)(c & mz);
l[i].ptr=&l[i+1];
}
for(i=0;i<4;i++)
printf("%f %f %f %p\n",l[i].w.x,l[i].w.y,l[i].w.z,l[i].ptr);
return 0;
}

で、これは何か・・・?って、それってクイズ?
バイト型のものをfloatに入れて配列なのにリスト構造にしてます。
意味があるとは思えません。



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

Name: box  ..ハッカー(129,150ポイント)   Date: 2008/11/15(土) 18:37   No:24132     
Title: Re:プログラムの構造と誤り    
最初の for ループで、i が 3 のときに l[4] という配列定義外の領域にアクセスしている点が問題かもしれません。
リスト構造を使った下手な実例である、というのは、non さんのご指摘と同じです。


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

Name: conio  ..入門者(2,503ポイント)   Date: 2008/11/15(土) 21:48   No:24144     
Title: Re:プログラムの構造と誤り    
@このプログラムで作成されるデータ構造の名称
⇒"構造体"ではないでしょうか?

Aプログラム中に、ある誤りが含まれている。どう直せばいいか。
パッと見ただけでも、つづりの間違い等が見受けられます。
 mai()
listl[4];
など。

C言語歴、C言語の理解がどのくらいなのか分からないので何ともいえませんが、
コンパイルはしてみましたか?
とりあえずコンパイルしてみて、エラーが出たら修正し、エラーがどうしても
取れなかった場合、その時に詳しいエラーの内容などについて質問してみてはどうでしょう?

>>このプログラムが何を意味しているのかもわかりません。
もし、"構造体"、"ポインタ"、"配列"自体が何なのか分からない場合、
まず参考書で学習してからの方がいいと思います。
全く理解して無いのに、答えだけ聞いても意味が無い(全然理解出来ない)かと思います。


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

Name: girisya  ..ぴよぴよ(508ポイント)   Date: 2008/11/16(日) 17:17   No:24166     
Title: Re:プログラムの構造と誤り    
タグを使わずに投稿してしまいすみませんでした。
回答ありがとうございます。

では1番の答えとしては「構造体」でいいのでしょうか?
コンパイルしてみると、
: 関数 `main' 内:
: `i' が宣言されていません (この関数内で最初に利用)
: (未宣言の各変数については、それが最初に現われたそれぞれの関数
: に対して一度だけ報告されます。)
: 構文解析エラー が "float" の前にあります
: 構文解析エラー が "float" の前にあります
: 構文解析エラー が "float" の前にあります
とでます。

l[4]の部分をどのように変えたらこのエラーはとれるのでしょうか?
何度も質問してしまいすみません。
よろしくお願いします。


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

Name: non  ..初心者(6,516ポイント)   Date: 2008/11/16(日) 17:34   No:24170     
Title: Re:プログラムの構造と誤り    
エラーをなくして、載せているのに、なんで?
後、何をどうして欲しいの?
1番の答えはリスト構造かもね。


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

Name: non  ..初心者(6,894ポイント)   Date: 2008/11/16(日) 18:19   No:24180     
Title: Re:プログラムの構造と誤り    
>l[4]の部分をどのように変えたらこのエラーはとれるのでしょうか?
この部分を忘れてました。失礼しました。

エラーにはならないと思いますので、無理に直さなくても良いというのが私の考えです。
なぜなら、このプログラムの意味(目的)が理解できないからです。
配列のl[4]がないときに、どこをアドレスは指しているのか調べようというプログラムかもしれないじゃないですか。だから、私のプログラムではアドレスを表示しました。


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

Name: girisya  ..ぴよぴよ(670ポイント)   Date: 2008/11/16(日) 18:49   No:24183 解決!     
Title: Re:プログラムの構造と誤り    
目的としては、このプログラムで作成されるデータ構造l[4]に格納される3次元点を結んだ直線群を図示することです。
エラーをなくしていただいたプログラムを実行した結果ということですね!
具体的にどこをどう直せばいいというのがいまいちわからなかったので…
至らない点がたくさんありすみませんでした。
ありがとうございました。


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



Name:  ..ぴよぴよ(55ポイント)   Date: 2008/11/16(日) 17:30   No:24168       
Title: プログラムの意味    
よくプログラムで
if(FAILED(・・・)){
return E_FAIL;
}
と書いてある解説書があるのですが
もし・・・が失敗したら E_FAIL を・・・に返すという意味でいいのでしょか?
また E_FAIL とは -1 みたいなものなのでしょうか?


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


Name: 御津凪 [URL]  ..プログラマー(36,267ポイント)   Date: 2008/11/16(日) 17:45   No:24174     
Title: Re:プログラムの意味    
> もし・・・が失敗したら E_FAIL を・・・に返すという意味でいいのでしょか?

もし・・・が失敗したら E_FAIL を実行している関数から返すという意味です。
(return の意味は理解していますか?)

> また E_FAIL とは -1 みたいなものなのでしょうか?

FAILED() マクロの定義を見ると、
#define FAILED(hr) (((HRESULT)(hr)) < 0)



となっており、また E_FAIL の定義は、
#define E_FAIL                           _HRESULT_TYPEDEF_(0x80004005L)



となっています。
つまり、 FAILED マクロは 値が負数なら失敗(真を返す)となりますが、
E_FAIL は -1 ではありません。(負数ではある)


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,292ポイント)   Date: 2008/11/16(日) 18:05   No:24176     
Title: Re:プログラムの意味    
> もし・・・が失敗したら E_FAIL を・・・に返すという意味でいいのでしょか?
> また E_FAIL とは -1 みたいなものなのでしょうか?

環境不明なので何ともいえません。


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



Name: 麻理  ..ぴよぴよ(36ポイント)   Date: 2008/11/16(日) 17:02   No:24165       
Title: ゲームのシーンをソースごとに管理    
添付してあるソースがあるとします。
これをタイトル、キャラセレクト、ゲーム内のシーンごとにソースを分けるとしたら
どうやればいいのでしょうか?


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


Name: 御津凪 [URL]  ..プログラマー(36,409ポイント)   Date: 2008/11/16(日) 17:34   No:24171     
Title: Re:ゲームのシーンをソースごとに管理    
GameMain 関数内にある"// 処理"の箇所に関数ポインタを用いた関数呼び出しを行えば、
シーンを関数で分けることが出来ます。
この関数をソースごとに分ければOKです。


# ソースに実行の問題があったので追記。
# 添付されているコードそのままで実行すると無限ループにおちいります。
# 下部のコメントを(下端の GameMain 以外)外し、 GameMain のメインループ内のコメントアウトを外すとゼロ除算エラーが発生します。
# GameMain(); を呼び出す前に "FPS = FPS_MAX;" を付け加えると正常に動作しました。



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



Name: ぴーすけ  ..ぴよぴよ(160ポイント)   Date: 2008/11/15(土) 21:02   No:24135       
Title: 画像と音楽ファイルが読み込めません    
C言語〜ゲームプログラミングの館〜でchar.pngを保存してサンプルプログラム実行用フォルダに
入れているのに、ビルドすると"char.pngがありません"と表示されます。
また、音楽再生のプログラムを実行しても、"ミュージックファイル test.mid の読み込みに失敗
しました in LoadMusicMem"と表示されてしまいます。
どなたか解決方法をおしえてください。


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


Name: J  ..中級者(12,249ポイント)   Date: 2008/11/15(土) 21:22   No:24140     
Title: Re:画像と音楽ファイルが読み込めません    
ビルドした実行ファイルと同じ場所に画像と音楽が無くては読み込むことはできません。
いま一度パスを確かめてみてください。
それと、できれば、ソースを載せてみてください。他のみなさんが的確に指示できると思います。


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

Name: 御津凪 [URL]  ..プログラマー(36,034ポイント)   Date: 2008/11/16(日) 05:25   No:24157     
Title: Re:画像と音楽ファイルが読み込めません    
> それと、できれば、ソースを載せてみてください。他のみなさんが的確に指示できると思います。

規約からすればそうするべきです。
しかし、この問題は実行方法にも問題があるので、
開発環境(VC++ なのか bcc なのか)なども載せたほうが確実ですね。

VC++ だと、単純に実行ファイルが置かれている場所に画像ファイルなどを置いても、
デバッグ実行では読み込んでくれませんし。


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

Name: ぴーすけ  ..ぴよぴよ(161ポイント)   Date: 2008/11/16(日) 09:43   No:24160 解決!     
Title: Re:画像と音楽ファイルが読み込めません    
質問の仕方が悪くてすみませんでした。
開発環境はVC++2008です。
今までは、サンプルプログラム実行用フォルダに入れていた画像と音楽を、実行した
ファイルと同じ場所にいれたら、画像、音楽ともに再生できました。
初歩的なミスですみません。
親切な回答本当にありがとうございました。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +