C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   無題   
     ・[54887] わふー 
     ・[54891] シエル 
     ・[54892] たかぎ 
     ・[54894] MNS 
     ・[54905] わふー 
     ・[54906] シエル 
     ・[54910] 組木紙織 
     ・[54911] MNS 
     ・[54912] たかぎ 
     ・[54916] 三郎 
     ・[54920] dic 
     ・[54921] ぽこ 
     ・[54922] わふー 
     ・[54924] たかぎ 
     ・[54927] たいちう 
     ・[54949] 三郎 
     ・[55093] わふー 
     ・[55096] たかぎ 
     ・[55129] ookami 
     ・[55130] 組木紙織 
   32bitと16bitの変更   
     ・[55098] Justy 
     ・[55106] あ〜る 
     ・[55110] Justy 
     ・[55125] ookami 
   文字列中の各 文字の出 ....   
     ・[55047] ookami 
     ・[55048] porno 
     ・[55049] ookami 
     ・[55051] porno 
     ・[55052] フリオ 
     ・[55053] フリオ 
     ・[55055] ookami 
     ・[55062] porno 
     ・[55073] mila 
     ・[55082] porno 
     ・[55084] TKOZ 
     ・[55105] porno 
     ・[55120] フリオ 
   透過処理がうまくいき ....   
     ・[55100] シエル 
     ・[55101] Justy 
     ・[55103] Dixq (管理人) 
     ・[55104] KOZAST 
     ・[55108] KOZAST 
     ・[55111] wing 
     ・[55113] KOZAST 
   コンボボックスのソー ....   
     ・[55086] シエル 
     ・[55092] 爺プログラマー 
     ・[55094] シエル 
     ・[55099] 爺プログラマー 
     ・[55102] YuO 
     ・[55107] 爺プログラマー 
   メモリ使用量が増大す ....   
     ・[55074] シエル 
     ・[55076] ABS 
     ・[55077] ムンバ 
     ・[55078] ムンバ 
     ・[55079] シエル 
     ・[55080] ムンバ 
     ・[55081] ABS 
     ・[55083] ABS 
     ・[55087] ムンバ 
     ・[55090] ABS 
   ちょっとした認識を聞 ....   
     ・[55023] DecentLove 
     ・[55028] dic 
     ・[55036] shiro4ao 
     ・[55037] ROM 
     ・[55038] ookami 
     ・[55039] ムンバ 
     ・[55040] ideyan 
     ・[55042] ムンバ 
     ・[55043] たかぎ 
     ・[55044] ムンバ 
     ・[55050] 三郎 
     ・[55054] へろり 
     ・[55056] Dixq (管理人) 
     ・[55057] 山崎 
     ・[55060] dic 
     ・[55064] softya 
     ・[55071] dic 
   オープンアプリでのラ ....   
     ・[54948] YuO 
     ・[54963] kanade 
     ・[54965] へろり 
     ・[54966] 天空橋 
     ・[54972] 天空橋 
     ・[55069] kanade 
     ・[55070] 天空橋 
   ポインタの初歩   
     ・[54953] シエル 
     ・[54967] 初級者 
     ・[54968] Limone 
     ・[55002] シエル 
     ・[55005] Limone 
     ・[55011] シエル 
     ・[55014] Limone 
     ・[55015] MNS 
     ・[55017] ookami 
     ・[55018] Limone 
     ・[55019] box 
     ・[55027] y 
     ・[55029] MNS 
     ・[55030] Limone 
     ・[55031] ムンバ 
     ・[55032] dic 
     ・[55033] ookami 
     ・[55034] ぽこ 
     ・[55035] ムンバ 
     ・[55046] Limone 
   テストの平均値を求め ....   
     ・[54932] パコネコ 
     ・[54933] Apple 
     ・[54936] パコネコ 
     ・[54937] Apple 
     ・[54939] パコネコ 
     ・[54942] fatens 
     ・[54951] Apple 
     ・[54954] シエル 
     ・[54955] fatens 
     ・[54956] シエル 
     ・[54957] toyo 
     ・[54958] シエル 
     ・[55007] Apple 
     ・[55012] シエル 
     ・[55013] フリオ 
     ・[55016] Apple 
     ・[55025] 組木紙織 
   DXライブラリのChange ....   
     ・[54994] シエル 
     ・[55006] ムンバ 
     ・[55008] y 
     ・[55009] シエル 
     ・[55010] シエル 
     ・[55024] ムンバ 
   画面サイズ取得   
     ・[54952] シエル 
     ・[54978] shiro4ao 
     ・[54980] シエル 
     ・[54998] DecentLove 
     ・[55001] シエル 
     ・[55021] DecentLove 
   DirectXでのセーブデー ....   
     ・[54995] TKOZ 
     ・[54996] シエル 
     ・[55004] るー 
   NTPサーバから時刻を取 ....   
     ・[54999] シエル 
   DLLで呼び出し元のウィ ....   
     ・[54855] へろり 
     ・[54859] シエル 
     ・[54925] MUN 
     ・[54930] MUN 
     ・[54935] YuO 
     ・[54989] MUN 
   Cはもう時代遅れなので ....   
     ・[54982] Dixq (管理人) 
     ・[54983] バグ 
     ・[54984] バグ 
     ・[54985] 御津凪 
     ・[54987] shiro4ao 
     ・[54988] 天空橋 
   ボス撃破後クリア画像 ....   
     ・[54975] シエル 
     ・[54979] sun 
   イニシャルによって選 ....   
     ・[54971] へろり 
     ・[54973] toyo 
     ・[54976] toyo 
     ・[54977] toyo 
   コンボボックスについ ....   
     ・[54960] へろり 
     ・[54961] 爺プログラマー 
     ・[54962] へろり 
     ・[54964] 爺プログラマー 
   Dxlibでの3dモデルの表 ....   
     ・[54890] shuto 
     ・[54901] Justy 
     ・[54946] shuto 
   max の出し方   
     ・[54834] パコネコ 
     ・[54835] ookami 
     ・[54837] box 
     ・[54838] パコネコ 
     ・[54840] パコネコ 
     ・[54841] パコネコ 
     ・[54843] シエル 
     ・[54856] team f 
     ・[54923] パコネコ 
     ・[54928] asdf 
     ・[54931] パコネコ 
     ・[54934] asdf 
     ・[54938] パコネコ 
     ・[54940] asdf 
     ・[54941] パコネコ 
     ・[54943] asdf 
     ・[54945] パコネコ 
   PHPとMySQLによるタグ ....   
     ・[54770] たいちう 
     ・[54781] nayo 
     ・[54883] nayo 
     ・[54889] たいちう 
     ・[54893] nayo 
     ・[54909] たいちう 
     ・[54913] nayo 
     ・[54915] ぽこ 
     ・[54917] nayo 
     ・[54918] たいちう 
     ・[54919] ぽこ 
     ・[54926] nayo 
   アルファベット順のソ ....   
     ・[54903] シエル 
     ・[54904] タマ 
     ・[54907] シエル 
     ・[54908] 組木紙織 
     ・[54914] タマ 
   ウィンドウの初期位置   
     ・[54881] シエル 
     ・[54882] atpiza 
     ・[54885] スキマ妖怪 
     ・[54888] シエル 
     ・[54895] MNS 
     ・[54896] atpiza 
     ・[54897] atpiza 
     ・[54898] atpiza 
     ・[54899] シエル 
     ・[54900] atpiza 
   関数の訂正   
     ・[54862] fatens 
     ・[54863] シエル 
     ・[54864] シエル 
     ・[54879] タマ 
   論理積と論理和   
     ・[54776] Dixq (管理人) 
     ・[54777] Dixq (管理人) 
     ・[54780] box 
     ・[54782] Dixq (管理人) 
     ・[54786] DecentLove 
     ・[54787] ムンバ 
     ・[54791] DecentLove 
     ・[54792] Dixq (管理人) 
     ・[54793] DecentLove 
     ・[54795] Dixq (管理人) 
     ・[54796] DecentLove 
     ・[54798] たかぎ 
     ・[54800] Dixq (管理人) 
     ・[54801] たかぎ 
     ・[54803] DecentLove 
     ・[54804] Dixq (管理人) 
     ・[54807] DecentLove 
     ・[54810] Dixq (管理人) 
     ・[54811] たかぎ 
     ・[54814] DecentLove 
     ・[54817] たかぎ 
     ・[54819] 組木紙織 
     ・[54820] たいちう 
     ・[54821] たかぎ 
     ・[54839] ムンバ 
     ・[54844] Dixq (管理人) 
     ・[54845] ムンバ 
     ・[54847] シエル 
     ・[54848] ムンバ 
     ・[54850] pie 
     ・[54851] Dixq (管理人) 
     ・[54852] Dixq (管理人) 
     ・[54867] DecentLove 
     ・[54869] Dixq (管理人) 
     ・[54870] たかぎ 
     ・[54871] DecentLove 
     ・[54872] DecentLove 
     ・[54878] Dixq (管理人) 
   【雑談】丸囲み数字の ....   
     ・[54873] たかぎ 
     ・[54874] DecentLove 
     ・[54875] Dixq (管理人) 
     ・[54877] たかぎ 
   画面に雪を降らせたい ....   
     ・[54808] ookami 
     ・[54816] シエル 
     ・[54846] シエル 
     ・[54876] taketoshi 
   穴掘り法による迷路作 ....   
     ・[54813] たいちう 
     ・[54823] パコネコ 
     ・[54826] たいちう 
     ・[54830] パコネコ 
     ・[54833] ookami 
     ・[54865] 五反田 
     ・[54866] たいちう 
     ・[54868] 五反田 
   配列   
     ・[54739] ぽこ 
     ・[54741] ふがふが 
     ・[54742] 組木紙織 
     ・[54743] dic 
     ・[54744] フリオ 
     ・[54751] dic 
     ・[54857] へろり 
   奇数のみを出力するプ ....   
     ・[54802] パコネコ 
     ・[54805] パコネコ 
     ・[54806] fatens 
     ・[54809] パコネコ 
     ・[54812] パコネコ 
     ・[54815] fatens 
     ・[54818] パコネコ 
     ・[54822] タマ 
     ・[54824] fatens 
     ・[54825] パコネコ 
     ・[54827] fatens 
     ・[54828] パコネコ 
     ・[54829] タマ 
     ・[54832] パコネコ 
     ・[54842] タマ 
   GetHitKeyStateAll_2関 ....   
     ・[54767] Dixq (管理人) 
     ・[54769] Dixq (管理人) 
     ・[54771] しろ 
     ・[54772] Dixq (管理人) 
     ・[54774] しろ 
     ・[54778] Dixq (管理人) 
     ・[54790] しろ 

Name: わふー  ..ぴよぴよ(74ポイント)   Date: 2010/06/20(日) 16:15   No:54886       
Title: 無題    
こんにちは。
プログラムの理解を深めようと思っている者です。

色々と悩んでいるのですが、悩みすぎなのか、もう何が何やら分からない状態です。
クラスを勉強して、オブジェクト指向ですとか隠蔽ですとかデザインパターンですとか拡張性ですとか……色々な話がポンポン出てきて、うにゃーってなってます。
実際にゲームを作りつつ少しずつ新しいものを取り入れていったらいいんじゃないかとも思ったのですが、ちょっと勉強らしく勉強もしてみたいと思った次第です。

そこで、C++でクラスを扱い出した程度の私にとって、良い感じの勉強方法はないでしょうか。
ゲーム向き……と言っても、別にゲームだからといって特段何かあることでもないかもしれませんが。
(ココ見ろーですとか、このオープンソースを1から全部見ろーとかになるんですかね……?)
すごい曖昧な質問で申し訳ないのですが、どういう風に質問に具体性を持たせたら良いのかも分からなくなってしまいました。
でも、これからもゲームを作っていきたいので、是非ご助力いただければ嬉しいです。

よろしくお願いいたします。


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


Name: わふー  ..ぴよぴよ(85ポイント)   Date: 2010/06/20(日) 16:16   No:54887     
Title: Re:無題    
タイトル忘れてますね……
すいません。。。


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

Name: シエル  ..中級者(11,621ポイント)   Date: 2010/06/20(日) 16:23   No:54891     
Title: Re:無題    
ゲームプログラミングの館(http://dixq.net/g/)を一通りやってみて、ゲーム作りの楽しさを知る。

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

Name: たかぎ [URL]  ..ハッカー(209,877ポイント)   Date: 2010/06/20(日) 16:32   No:54892     
Title: Re:無題    
現状どこまで理解しているのか、どんなプラットフォーム向けの、どんなゲームを、どんな開発ツールを使って作ろうとしているのか、まったく不明です。
焦らずに、規約と注意事項を熟読した上で、必要な情報を補足してください。


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

Name: MNS  ..プログラマー(36,514ポイント)   Date: 2010/06/20(日) 16:39   No:54894     
Title: Re:無題    
ゲームを作りたいのなら、ゲームを作るのが良いと思いますよ。
簡単なもので構わないと思います。ただ方向キーで機体を動かす程度のものでも十分でしょう。

その程度のものでも、
例えば、機体をクラスにするとか、
敵機と自機は機体クラスから派生させるようにするとか、
あらゆる機能を使ってみて、その利便性を理解することが重要です。

カプセル化の利点は、大規模なプログラムを組めば自然と分かりますし、
デザインパターンがどう有効なのかは、プログラムをある程度組まないと分かりにくいと思います。

自身のC++の機能に対する理解度なども分かりますし、
とりあえず、自分が作りたいと思えるゲームを作ってみてはどうでしょうか。


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

Name: わふー  ..ぴよぴよ(0ポイント)   Date: 2010/06/20(日) 18:41   No:54905     
Title: Re:無題    
ありがとうございます。

>シエルさん
ゲームを作ったことはあります。

>たかぎさん
すいません。圧倒的に情報不備でした。

・現状どこまで理解しているのか
一言で表すのは難しいです……。
ゲームを作ることはできましたが、ソースが汚くなってしまいました。
クラスなんて1個もなく、グローバル変数がごりごりと使われ、例外処理もなく、値は全てハードコード……といった感じです。
なので、もうちょっとかっこよくコーディングしたいなと思い始めた程度の理解です。
本当に曖昧ですみませんが、多くのプログラムの知識を1つ1つ分かる/分からないと羅列するのも無理ですし、こういう言い方しかできません。

・どんなプラットフォーム向けの、どんなゲームを、どんな開発ツールを使って
特に指定することは考えていません。
使用する言語やライブラリによって違いはあるかもしれませんが、もっと根本的な部分の悩みだと思うのです。
なんと言いますか……プログラムの設計的な話に近いのかなとか思ってます。


>MNSさん
ゲームはいくつか作ってきました。
クラスは便利だなとは最近感じてきているのですが、カプセル化は利点をいまいち納得できないですし、デザインパターンの有用性についてもあまり感じません。
このままだらだらっと作り続けていては、一生これらのやり方を無視したままになってしまいますので、見ていきたいと思っています。

また別の問題として、私がまったく知らないやり方があるであろうということもあります。
“カプセル化”という言葉を知っていれば、まだ調べようもあるのですが、まったく知らないものについては調べようがありません。(知るまで時間がかかりすぎる。)


そういう曖昧にしている部分があるのを知りつつプログラミングしていますと、何かしら損した気分になってしまいます。
ですので、こういうときはどうしたらいいのでしょうかという、相談みたいな質問をさせていただきました。
非常に分かりにくくてすいません……。


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

Name: シエル  ..中級者(11,816ポイント)   Date: 2010/06/20(日) 18:51   No:54906     
Title: Re:無題    
なるほど。私も同じ状況かもしれません。
私もある程度ゲームが作れるようになってきましたが、
クラスも使わず、グローバル変数だらけです(笑)
今は問題なく動いてるので特に気にしていませんが、もっと効率的な書き方や方法が
あるんだろうなーと思いつつプログラミングしています。

どうやってレベルアップすればいいんでしょうね。
もっと色々なソースコードを読んで勉強していくしかないんですかね…。


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

Name: 組木紙織  ..比類無きプログラマー(87,748ポイント)   Date: 2010/06/20(日) 19:38   No:54910     
Title: Re:無題    
質問をもう少し明快に書いた方が話が伝わりやすいかと思います。
要は、
初心者はもう突破したとしたと思うけど、中級者になるにはどのような勉強をすればよいかわからない。
どのような勉強をすればよいのか?

ということですか?

C++の使い方ならSTLのアルゴリズムが使えるようになるのが一つの指標と思ってます。
あとテンプレートや適切な多重継承、例外処理もですね。
言語にこだわらない視点で見ると
ソートなどの良く知られているアルゴリズムを自分で実装出来ること。
GoFのデザインパターンを理解して使い方が分かること。
他人の書いた質の良いソースコードをたくさん読んで自分でも書いて見ること。
自分で完成させたゲームを拡張しやすいように手を加えること。(リファクタリング)


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

Name: MNS  ..プログラマー(37,035ポイント)   Date: 2010/06/20(日) 19:56   No:54911     
Title: Re:無題    
そうですね、私も、このコードは非効率ではないかな、と思うことや、
他人のコードを見て、ああ、こんな方法もあったのだな、と思うことが多々あります。

自分が閃いた手法でも、他の人がずっと前に考案した方法であったりすること、
つまりは車輪の再発見まがいなことになっていると考えると、
自分で考えるよりも、他人の手法を真似たいと思ってしまいますよね。

そういうことならば、他人の書いたコードをたくさん読むことが重要でしょう。

しかし、私は、ソレより先に基本を固めるべきだと思います。
例えば、カプセル化の利便性が理解出来ない場合、カプセル化の利便性を活用したコードというものは、
恐らく理解できないと思います。それをただ真似ても仕様がないでしょう。

継承、ポリフォーリズム、テンプレート…、これらの機能の利便性を理解した上で、
使えるようになって、初めて優れたコーティングというものは行えると思います。


デザインパターンなんかは、むしろ、わふーさんが求めているものの典型かもしれませんよ。
まさに先人たちが考案した"優れたコーティング"というものを、再利用可能にしたものですから、
まずは、これが理解できるようになってから、でしょうね。


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

Name: たかぎ [URL]  ..ハッカー(210,101ポイント)   Date: 2010/06/20(日) 20:29   No:54912     
Title: Re:無題    
> クラスなんて1個もなく、グローバル変数がごりごりと使われ、例外処理もなく、値は全てハードコード……といった感じです。 

必要がなければ無理にクラスを使うことはありませんし、グローバル変数を使うべき状況で使ったのなら特に問題ありません。
Cなら例外処理がないのは当然ですし、値もハードコーディングして問題ない状況ならそれでよいと思います。
すべてケースバイケースなので、これだけでもよいとも悪いともいえません。

> なので、もうちょっとかっこよくコーディングしたいなと思い始めた程度の理解です。 

単なるかっこつけならおすすめはしません。
必要な状況で必要な方法で実装したのであれば、それでよいのではないですか?
そうではないなら、例えばソースコードを一部を貼るとか、もっと具体的なことを書かないと何ともいえません。

> ・どんなプラットフォーム向けの、どんなゲームを、どんな開発ツールを使って 
> 特に指定することは考えていません。 
> 使用する言語やライブラリによって違いはあるかもしれませんが、もっと根本的な部分の悩みだと思うのです。 
> なんと言いますか……プログラムの設計的な話に近いのかなとか思ってます。 

プラットフォームも、開発ツールも、何を作るのかも特定しなければ、非常にあいまいな回答しかできません。
アセンブラで4ビットマイコンのゲームを作るのと、3Dグラッフィクスを用いたネットワークゲームを作るのを同列に語るのは無理でしょう。
これまでの書き込み内容でおおよその傾向は見えますが、それらに限定した話をしているのか、一部を取り出して例として挙げているのか不明です。


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

Name: 三郎  ..入門者(3,426ポイント)   Date: 2010/06/20(日) 20:56   No:54916     
Title: Re:無題    
殆ど無意味な横槍かもしれませんが、私もそのようなことに悩んでいます。と言うか、これから悩みます。
元々ゲームなどを造るのに、
>継承、ポリフォーリズム、テンプレート、カプセル化、クラス、、、などを使わないといけないのでしょうか
?。

1.そのような複雑な事をしたら(覚え理解するのが大変だから)従来のものより性能の特に良いゲームが造れるのでしょうか。
2.私の場合特別複雑な事をしなく、性能(処理早さなど)は左程要求しないので(ハードの性能が日増しに進歩している今日、ソフトの性能は不足しても良いと思う)総合的な性能とはハードの処理速度、価格、合理的なソフトによる処理速度の向上の三者で決まると思うので、昔ながらのソフトでよいと思うのです。
コードの量は減るでしょうが、コピペなどでやれば不自由を感じない?。
3.個人でゲームを造る場合でも、私みたいに一人でソフトを作る場合は組織と違い手分けしてソフトを造ったりメンテの必要がない場合、従来どおりの造りかたではだめなのでしょうか???。




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

Name: dic  ..比類無きプログラマー(75,526ポイント)   Date: 2010/06/20(日) 21:40   No:54920     
Title: Re:無題    
私はオブジェクト指向本家のJavaを勉強し、
あらためてC/C++でオブジェクト指向の有効性を認識し、それを実現しようとしています
ただ、理解いたる道のりが長いためなかなかゲーム製作とは実を結びつきにくいですし、
たとえ、自分がきれいだと思っていたソースコードでも
それを理解されなかったら、苦労は全部水の泡です

なので、三郎さんの言っているように
単純な構造化設計で作ったものと
オブジェクト指向やデザインパターンを取り入れた設計のもの2つ用意しています

オブジェクト指向の方がはるかにソースコードの量が増え、バグがでたときなどは
一日つぶれる日もありますので、どちらをとるかはその人によると思います

今はザツでもいいから、設計、開発、プログラミングができることの方が重要だと思ってます
 編集済み


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

Name: ぽこ  ..上級者(16,935ポイント)   Date: 2010/06/20(日) 21:45   No:54921     
Title: Re:無題    
> 殆ど無意味な横槍かもしれませんが、私もそのようなことに悩んでいます。と言うか、これから悩みます。
> 元々ゲームなどを造るのに、
> >継承、ポリフォーリズム、テンプレート、カプセル化、クラス、、、などを使わないといけないのでしょうか
> ?。

> 1.そのような複雑な事をしたら(覚え理解するのが大変だから)従来のものより性能の特に良いゲームが造れるのでしょうか。

性能は上がりません。上記概念は、保守性、再利用性向上を「サポート」するためにあります。
ですので、上記のような概念がない言語でも同じような工夫はできます。

> 2.私の場合特別複雑な事をしなく、性能(処理早さなど)は左程要求しないので(ハードの性能が日増しに進歩している今日、ソフトの性能は不足しても良いと思う)総合的な性能とはハードの処理速度、価格、合理的なソフトによる処理速度の向上の三者で決まると思うので、昔ながらのソフトでよいと思うのです。
> コードの量は減るでしょうが、コピペなどでやれば不自由を感じない?。

コピペでOKな考え方は止めるべきです。
コピペした場所を修正したいあった場合はどうします?
全部直すのですか?全部直したことをどうやって確認しますか?


> 3.個人でゲームを造る場合でも、私みたいに一人でソフトを作る場合は組織と違い手分けしてソフトを造ったりメンテの必要がない場合、従来どおりの造りかたではだめなのでしょうか???。


繰り返しますが、コピペでOKな考え方は止めるべきです。
将来、別のゲームを作る自分のために保守性(メンテナンス性)を意識しながら作成しましょう。


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

Name: わふー  ..ぴよぴよ(30ポイント)   Date: 2010/06/20(日) 21:49   No:54922     
Title: Re:無題    
レスありがとうございます。
そして、質問が曖昧ですいません。
今思えば、自分の中のモヤモヤを、ここにぶつけてしまったのかもしれません。
本当に申し訳ありません。

組木紙織さんの仰る通り、
「初心者はもう突破したとしたと思うけど、中級者になるにはどのような勉強をすればよいかわからない。
どのような勉強をすればよいのか?」
ということかもしれません。
初心者とか中級者って区別は、自分には分かりませんが。
自分の性質からして、上級者になるまでゲームが作れなくなるっていう本末転倒なことになるかもしれませんがw、そこは折り合いつけて勉強していこうと思います。

また、やはり言語とかは限定しないと突っ込んだ話にならないかもしれないですね。
と、このことを書いている間にたかぎさんに仰られてしまいましたが、確かにプログラムという括りだけで話を広げたら、そういうことになりますよね。申し訳ありません。
基本はPCのWindows向け・C++・Visual Studio・
また、小さくはないゲームを想定しておりました。
規模的には、龍神録ぐらいでしょうか。
龍神録と3Dネットワークゲームで違いが出るかどうかについては、知識不足で分かりません;;

勉強方法に関しては、皆様の仰ることを大いに参考にして励んでいきたいと思います。
ありがとうございます。

>単なるかっこつけならおすすめはしません。 
>元々ゲームなどを造るのに、継承、ポリモーフィズム、テンプレート、カプセル化、クラス、、、などを使わないといけないのでしょうか?
とのことですが、これには噛みつきます。
個人差はあると思いますが、一生で何度もプログラミングをする機会があるなら、こういう知識を深めて損はないと思うからです。
マニアックすぎる知識は余計かもしれませんが、この程度の話であれば、まだまだ許容範囲内だと思うのです。
>必要な状況で必要な方法で実装したのであれば、それでよいのではないですか? 
に関しましても、これらを知らなければ“必要かどうか”という判断をするにも至らないかもしれません。
それは怖いです。

>今はザツでもいいから、設計、開発、プログラミングができることの方が重要だと思ってます 
お気持ちは1/10くらい分かる気もするんですが、やはり私はその境地には遠い位置におります。
どういうお考えからコレに至ったのかは想像もつきませんが、恐らく結論に至るためには、JavaとC++を通じて学ばれたことが必須なのかと予想します。


返信が雑ですいません。
正直、文章を書くのが遅いもので、間に合いません;−;


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

Name: たかぎ [URL]  ..ハッカー(210,835ポイント)   Date: 2010/06/20(日) 22:28   No:54924     
Title: Re:無題    
> >単なるかっこつけならおすすめはしません。  
(中略)
> 個人差はあると思いますが、一生で何度もプログラミングをする機会があるなら、こういう知識を深めて損はないと思うからです。 

知識を深めることは損ではありません。
問題はその動機です。
かっこいいコーディングがしたいことが動機であれば、そんなものはおすすめしないといっているのです。
設計やコーディングのテクニックは、見た目のかっこよさより適しているかどうかで判断すべきです。どんなに泥臭く、格好悪くても、そのほうが適しているならそれを採用すべきです。

> マニアックすぎる知識は余計かもしれませんが、この程度の話であれば、まだまだ許容範囲内だと思うのです。 

マニアックすぎる知識というのは具体的にどんなものを想定していますか?
一見して歴史的価値しかないと思いがちな、例えばC with Classesに関する知識であっても、C++の設計思想を深く理解するためには無駄ではありません。
移植性に関する知識にしても、マルチプラットフォームの開発をする場合は不可欠ですし、一生のうちに一度も遭遇しないような環境に関する知識であっても、移植性に関してどこまで配慮すれば大丈夫かを見極める上で有益です。
マニアックすぎて余計な知識というのは案外ないと思いますよ(知らなくても済んでしまうということはありますが、それは余計とか不要とかいうこととは違います)。

> >必要な状況で必要な方法で実装したのであれば、それでよいのではないですか?  
> に関しましても、これらを知らなければ“必要かどうか”という判断をするにも至らないかもしれません。 

その通りです。さらにいうなら、知っているだけでは"必要かどうか"を判断できません。実際に使えるようになっておかないと。

ただ、グローバル変数以外での実現方法を知らず、その状況で作らなければならないのであれば、(グローバル変数が)必要な状況でその方法で実現したわけですし、それ以外の選択肢はなかったわけですよね。

それをどうにかするには、知識を深め、経験を積むしかありませんが、一足飛びに高レベルに到達することなどできません。
だったら今できる精一杯のことをやるしかないわけです。

言いたいことは大体の察しは付きます。
けれども、クラスや例外処理を使い、グローバル変数をなくし、ハードコーディングを避けるのが、そのときの状況で本当に正しかったのかどうかも判断付かないでしょう?
だから具体例としてソースを貼ってみることを提案しているのです。


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

Name: たいちう  ..比類無きプログラマー(99,145ポイント)   Date: 2010/06/20(日) 23:03   No:54927     
Title: Re:無題    
# 一応、三郎さんへの回答という形で書きました。

オブジェクト指向の入門書などで、カプセル化や継承を説明するサンプルは普通短いため、
利点が分かりにくいのだと思います。クラスなど使わない方がよっぽどシンプルでしょう。

しかしプログラムの規模が大きくなると、全体を何らかの方法で管理しないと破綻してしまいます。
そのための工夫として考え出されたものの1つが、オブジェクト指向です。

本に書かれているのは、あくまでもサンプルでしかありません。
きっと、ページ数の都合だったり、エッセンスだけを書こうという著者の思いだったりするのでしょう。
それを実際のプログラムにどのように役立てるかは、読者が考えなくてはいけないことです。
オブジェクト指向に限らず、応用力が求められています。

三郎さんの場合ですが、以前作ったプログラムを読み返すことすらないとか、
三郎さんの能力・記憶力と比較して、小規模なプログラムしか作らないとか、
現状で問題と認識しているようなことがないのでしたら、
オブジェクト指向を導入する直接的メリットはないかもしれません。

しかし多くのプログラムを理解できるようになり、世界が広がると思います。
自分のプログラムではどのように使う事ができるかと想像しながら
入門書のサンプルを動かす事と、自分のプログラムを作りながら、
入門書のあの方法が使えないか検討することの2つを、
機会があれば何度でも挑戦してください。


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

Name: 三郎  ..入門者(4,046ポイント)   Date: 2010/06/21(月) 05:23   No:54949     
Title: Re:無題    
雑談です、、
確かに皆さんの云われる事が分ったような気がします(分ったような気がする、ここが要点)。
そうでした、私の場合キー操作が特に下手(ブラインドタッチ?など夢のまた夢)なので打ち込みが遅すぎミスだらけ、大文字と小文字が混同多し。故に短い単語さえコピペの常習犯です、そのような意味も含みます。

例えばソフトの国税の申告とか納税のコンピュウターシステムがありますね。ソフトの価格が、どれほどのものか見当がつきません。
そして県税とか市民税の納税システムとソフトウエアが必要ななったら国税のシステムを基本に改変すればコストは1/10か、、1/100、、で造れるはずだと思う。
しかし、業者は一体いくらで納入しているやら???正にこれこそ、継承、ポリフォーリズム、テンプレート、カプセル化、クラス、、、の恩恵なのでしょうかね。
もしかして別業者に発注してコスト低減のメリットを生かせなかったりして、、、、

1、人類は此処1000年あるいは2000年位前より知能指数は向上していないそうな(本当にそう思う)
そして反射神経なども同じ(むしろ退化していると思う)古代人に今のパソコンゲームをさせてもスコアはほぼ同じと思う。管理人さんの作られた「四聖龍神録」を動かしてみました。
”まあ〜凄い事ができるものだなあ”と驚き感心しました。私には、左右上下のキーとXとZキー位しか使えませんが操作が難しくてギブアップ、、、私の場合、超最低スコア(恥ずかしい涙)。
知能指数の限界と反射神経の(手と指先)の限界で今後どうなるのでしょうか。
一度尋ねたく思っていました。

2、いっそのこと、キー操作などソフトでやらせ、知能指数のほうもソフトでやらせたら、要するに知能ロボットにゲームをさせたら(ソフトのバグを見つけるため、シュミレータまがいのもの(テストプログラム)を造り用意する)、どれほどのスコアが出るものでしょうか?ソフト上のバグとか多く出るような気がします。個人的に興味があります、勿論私には出来ません。

3、私は現場の必要性から昔ソフトを色々造りまました。要するに動機があった。
今の小中学生はソフトの必要性を感じていないはず。
しかしゲームに夢中、、、そして、それを自分で造ってみたくなる。
素晴らしい環境が望むと望まざるに関らず自然と出来上がっている。
これは素晴らしい事で将来の、、、、、に明るい展望が開けていると思うのは、私だけではなかろうと思う。





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

Name: わふー  ..ぴよぴよ(297ポイント)   Date: 2010/06/22(火) 23:20   No:55093     
Title: Re:無題    
>たかぎさん

ご返信いただき、ありがとうございます。


こちらも何となく仰ることの意図は察しはつきます(ついてる気がします)。
まずもって、私の言葉が不正確で申し訳ありません。
そして、たかぎさんの仰ることはもっともだと思います。

ソースに関しましては、現在作り途中のもので100KBとかあります。(シューティングです。)
まさか全プログラムを見ていただくというわけにもいかないでしょうから、何とか具体的すぎないように話を進められたらいいなと思っておりました。
規模を縮小してのソース(単純にクラス図とか?)ならありかなと思いましたが、私の頭が不足なため、正確に書き出すのに時間がかかります。(時間をかけても不正確な(将来的に変更がガリガリ入ってしまう)ものしかできない気がします。)

と言うわけでして、ソースを作る時間をいただけたらと思います。


もし全部見てやるよ! という場合は遠慮無く投げますのでw、ご連絡下さい。


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

Name: たかぎ [URL]  ..ハッカー(210,892ポイント)   Date: 2010/06/22(火) 23:23   No:55096     
Title: Re:無題    
> 現在作り途中のもので100KBとかあります。

その程度であれば、圧縮して添付してしまってもOKだと思います。
ソース全部を細かく見ることはできませんが、全体の傾向がつかめれば十分かと思います。


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

Name: ookami  ..プログラマー(28,245ポイント)   Date: 2010/06/23(水) 09:51   No:55129     
Title: Re:無題    
# わふーさん

私もソースを添付してもらっていいと思いますよ。
「全部見てやるよ!」とは言えませんが、回答の指針がつかめると思います。



# 三郎さん

> 業者は一体いくらで納入しているやら???正にこれこそ、継承、ポリフォーリズム、テンプレート、カプセル化、クラス、、、の恩恵なのでしょうかね。 

「継承、ポリフォーリズム...」を使えば必ず
再利用可能なプログラムになるわけではありません。
中には「これは本当にプロが書いたのか?(継承を使えばカッコイイと思っただけじゃないのか)」
というようなプログラムも見かけます。

たかぎさんも仰っていますが、
正しく使わなければ意味がありませんし、
「正しく使う」ということ自体が難しいです。
(最初に設計した段階では正しくても、
仕様変更でまったく意味がなくなることもある)

個人的には、クラス化しているとかではなく、
「読みやすい」「誤解を生まない」ソースコードが、
仕様変更にも強く、再利用しやすいと思っています。


> そして県税とか市民税の納税システムとソフトウエアが必要ななったら国税のシステムを基本に改変すればコストは1/10か、、1/100、、で造れるはずだと思う。 

「似ている」のは外見だけで、内部構造はまったく違う、
ということはよくある話です。まさにそんな感じで、
営業さんが「1/10くらいで作れるはずだと思う」とか顧客と安請け合いをしてきて、
技術の人が「ムリに決まってるじゃないですか!」みたいなやりとりも、
よくある話(?)です。

それに大抵の場合、同じ「納税システム」といっても、
お客さんごとに、好みの付加機能が付くはずですから、
結局はゼロから開発するに等しい場合がほとんどです。


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

Name: 組木紙織  ..比類無きプログラマー(87,816ポイント)   Date: 2010/06/23(水) 10:21   No:55130     
Title: Re:無題    
全部見れるかは保証の限りではありませんが、見たいです。

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



Name: あ〜る  ..上級者(20,705ポイント)   Date: 2010/06/22(火) 22:35   No:55089       
Title: 32bitと16bitの変更    
お久しぶりです。
龍神録の館でゲーム作りを学んでいる者です。
今回、大分ゲームの方が区切りがついたので、コンフィグソフトを制作しています。
そしてコンフィグの中で龍神録や東方で実装されているように、画面のモードを32bitと16bitで変えられるようにしようと思ったのですが、方法がわかりません。
何かそれ用の関数を使うのか、自分で処理を作るのか、若しくは他の方法なのか・・・
どなたか教えて頂けると嬉しいです。

BorlandC++でDXライブラリを使っています。


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


Name: Justy  ..伝説なるハッカー(547,966ポイント)   Date: 2010/06/22(火) 23:33   No:55098     
Title: Re:32bitと16bitの変更    
>画面のモードを32bitと16bitで変えられるようにしようと思ったのですが、方法がわかりません。 
 SetGraphMode関数の第三引数で指定できます。


# ところで何でコンフィグを別ソフトにしようとしているんでしょうか?


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

Name: あ〜る  ..上級者(20,959ポイント)   Date: 2010/06/22(火) 23:54   No:55106     
Title: Re:32bitと16bitの変更    
ありがとうございます!
こんな関数知りませんでした・・・これで実装出来ます。

>>ところで何でコンフィグを別ソフトにしようとしているんでしょうか?
他のゲームなども分けてるので、分けようと思ったんですが確かにわかりません(ぉ
多分、SetGraphMode関数などは

この関数を実行するとロードしたすべてのグラフィックデータハンドル、 作成したフォントハンドルは自動的に削除され、SetDrawArea, SetDrawScreen, SetDrawMode, SetDrawBlendMode, SetDrawBright  等の描画に関係する設定を行う関数による設定も全て初期状態に戻りますので、 画面モード変更後 LoadGraph関数や CreateFontToHandle関数等で再度ハンドルを作成し直し、 描画可能領域、描画対象画面等の各種描画系の設定も再度行う必要があります。
(DXライブラリリファレンスページより)

となっているので、最初に読み込む前に全て設定し、ゲーム中に設定するのは避けているのだと思います。
キーコンフィグや初期ライフ・ボムなんかのデータはゲーム中のコンフィグ画面で設定しています^^


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

Name: Justy  ..伝説なるハッカー(548,138ポイント)   Date: 2010/06/23(水) 00:18   No:55110     
Title: Re:32bitと16bitの変更    
>最初に読み込む前に全て設定し、ゲーム中に設定するのは避けているのだと思います
 確かにこのあたりは面倒な処理なので別に作れば楽という面はありますけど、
最悪自分で自分のアプリを再起動するだけでも達成できるような気がします。


>キーコンフィグや初期ライフ・ボムなんかのデータはゲーム中のコンフィグ画面で設定しています
 なるほどコンフィグはプレイ環境系とゲーム設定と分かれているのですね。
 なら別のままでもいいのかもしれませんね。
 失礼しました。


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

Name: ookami  ..プログラマー(26,660ポイント)   Date: 2010/06/23(水) 07:46   No:55125     
Title: Re:32bitと16bitの変更    
ところで、

> 画面のモードを32bitと16bitで変えられるようにしようと思った

のは、「ゲームをプレイする人のモニタが32bitに対応していなかったらコンフィグで16bitに落としてもらう」ためでしょうか?

だとしたら、「現在使われているビット数を取得する関数」かなにかがあれば、コンフィグで選択させる必要がなくなるって事でしょうか。

32bitとか16bitが分からない人もいると思いますし…


ということで、取得するならこんな感じでいかがでしょうか。

HDC DesktopDC=GetDC(NULL);
screenBit=GetDeviceCaps(DesktopDC,BITSPIXEL);
ReleaseDC(NULL,DesktopDC);


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



Name: porno  ..ぴよぴよ(369ポイント)   Date: 2010/06/22(火) 02:07   No:55045       
Title: 文字列中の各 文字の出現回数を数える    
すいませんが質問に答えて下さい。

fgets() を使って50文字以下の文字列を入力し,文字列中の各
文字の出現回数を数えるプログラムを作成せよ。
という課題で 
例えば、
%
文字列は? abcdef,abb(ccc110)
a : 2
b : 3
c : 4
d : 1
e : 1
f : 1
, : 1
( : 1
1 : 2
0 : 1
) : 1
という感じに仕上げたいのですがどうしてもうまくいきません。
どうやって出現回数の数を数えることができるのか教えてもらえないでしょうか。

osはlinux、コンパイラはgccです。

一応作りかけのソースを載せておきます。

#include <stdio.h>

# define BUFFER_SIZE (256)
 
int main(void)
{
   int i;
  int count[256];
   char buf[BUFFER_SIZE];
   printf("Please input :");
   fgets(buf, BUFFER_SIZE, stdin);
   for(i=0;buf[i];i++)
   {
      count[buf[i]]++;
   }
   for(i=0;buf[i+1]!='\0';i++)
   {
      printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]);
   }
   return(0);
}


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


Name: ookami  ..プログラマー(25,992ポイント)   Date: 2010/06/22(火) 02:54   No:55047     
Title: Re:文字列中の各 文字の出現回数を数える    
いろいろ気になるところはありますが、まずは、
int count[256];

int count[256]={0};
ですね。

現状の出力結果も回答の参考になるので、示してもらえるとよいと思いますよ。


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

Name: porno  ..ぴよぴよ(543ポイント)   Date: 2010/06/22(火) 03:12   No:55048     
Title: Re:文字列中の各 文字の出現回数を数える    
返答ありがとうございます。
ソースを直してから実行してみると
Please input number:ghfyug
'g' appeared 2 times.
'h' appeared 1 times.
'f' appeared 1 times.
'y' appeared 1 times.
'u' appeared 1 times.
'g' appeared 2 times.
となり、回数は正しくなりましたがgが二回表示されてしまいます。

また、
int count[256];

int count[256]={0};
なぜこのようにする必要があるのでしょうか。 


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

Name: ookami  ..プログラマー(26,228ポイント)   Date: 2010/06/22(火) 03:37   No:55049     
Title: Re:文字列中の各 文字の出現回数を数える    
デバッグの手法として「ステップ実行」はご存知でしょうか?活用を強くオススメします。gccが手元にないのでちょっと手順はわかりませんが…

とは言え、これくらいならってことで、
for(i=0;buf[i+1]!='\0';i++)
{
    printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]);
}

for(i=0;i<256;i++)
{
    if(count[buf[i]]) printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]);
}
なぜこうなるのか、お分かりいただけるでしょうか?

> なぜこのようにする必要があるのでしょうか。

これは「c++ 配列 初期化」あたりで検索するとよいと思います。


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

Name: porno  ..ぴよぴよ(732ポイント)   Date: 2010/06/22(火) 04:20   No:55051     
Title: Re:文字列中の各 文字の出現回数を数える    
当たり前のことに気づいてなかったです..
0から数えるのだからすべてを0に初期化しないとだめということですね。

for(i=0;buf[i+1]!='\0';i++)
{
    printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]);
}

for(i=0;i<256;i++)
{
    if(count[buf[i]]) printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]);


これの意味がわかりません..
これに直してコンパイルし、実行したところ
おかしくなったのですが..



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

Name: フリオ  ..プログラマー(32,977ポイント)   Date: 2010/06/22(火) 04:44   No:55052     
Title: Re:文字列中の各 文字の出現回数を数える    
 
 結果(count)を表示する際に入力した文字列(buf)を経由しているので、
その文字列に複数回出現する文字は、結果も複数回表示されます。
 
これは、入力した文字列(buf)を使わずに、結果(count)を表示すれば
回避できます。


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

Name: フリオ  ..プログラマー(33,157ポイント)   Date: 2010/06/22(火) 04:50   No:55053     
Title: Re:文字列中の各 文字の出現回数を数える    
 
for(i=0;buf[i+1]!='\0';i++) 

    printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]); 

↓ 
for(i=0;i<256;i++) 

    if(count[buf[i]]) printf("'%c' appeared %d times.\n",buf[i],count[buf[i]]); 
}  

 これだと、bufに格納されている文字列の終端を越えて意味のない場所まで参照してしまうので、
結果がおかしくなります。


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

Name: ookami  ..プログラマー(26,292ポイント)   Date: 2010/06/22(火) 07:30   No:55055     
Title: Re:文字列中の各 文字の出現回数を数える    
うぅわすいません(汗
「なぜこうなるのか、お分かりいただけるでしょうか?」とか言って私が分かってないっていう… 本当にすみませんでした。

えぇと… その後うまくいきましたでしょうか。


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

Name: porno  ..ぴよぴよ(991ポイント)   Date: 2010/06/22(火) 10:25   No:55062     
Title: Re:文字列中の各 文字の出現回数を数える    
みなさんアドバイスありがとうございます。
一応このソースコードでうまくいったのですが、これであってますか?


#include <stdio.h> 
# define BUFFER_SIZE (256)
int main(void)
{
  int i;
  int count[256]={0},sum[256]={0};
  char buf[BUFFER_SIZE];
  printf("Please input :");
  fgets(buf, BUFFER_SIZE, stdin);
  for(i=0;buf[i];i++)
   {
     count[buf[i]]++; 
   }         
  for(i=0;buf[i+1]!='\0';i++)
   {
       if(sum[buf[i]]==0)
        {
           printf("'%c' appeared %d times.\n",buf[i] ,count[buf[i]]); 
           sum[buf[i]]++;          
        }
   }         
  return(0);
}


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

Name: mila  ..ぴよぴよ(3ポイント)   Date: 2010/06/22(火) 20:50   No:55073     
Title: Re:文字列中の各 文字の出現回数を数える    
後ろの処理はこうした方がすっきりします。
for (i = 0; i < 256; i++) {
    if (count[i] > 0) {
        printf("%c appeared %d times.\n", i, count[i]);
    }
}


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

Name: porno  ..かけだし(1,001ポイント)   Date: 2010/06/22(火) 21:59   No:55082     
Title: Re:文字列中の各 文字の出現回数を数える    
こちらのほうがすっきりしますね。わかりました!
皆さんのおかげで完成することができました。

本当にありがとうございました!


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

Name: TKOZ  ..熟練のプログラマー(64,438ポイント)   Date: 2010/06/22(火) 22:09   No:55084     
Title: Re:文字列中の各 文字の出現回数を数える    
僕も自分なりに作ってみました。
作ったのはいいんですが、期待した動作と違っているような気がします。

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

#define MAX_CODE 93
//93の由来は、ASCIIコード abs(0x21-0x7e)

int CountString(char *String)
{
    static int Count[MAX_CODE]={0};
    int StringTable[MAX_CODE]={0};
    
    int i,j;
    
    for(i=0;i<strlen(String);i++)
    {
        Count[String[i]-0x21]++;
        StringTable[String[i]-0x21]=1;
    }
    
    {
        for(i=0;i<MAX_CODE;i++)
        {
            if(StringTable[i]==1 && Count[i]!=0)
            {
                printf("%c:%d\n",i+0x21,Count[i]);
            }
        }
    }
}

#define BUFFERSIZE (256)
#define StringLen 50

int main(void)
{
    char buf[StringLen];
    printf("文字列は?");fgets(buf,BUFFERSIZE,stdin);
    
    CountString(buf);
    
    return 0;
}


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

Name: porno  ..かけだし(1,029ポイント)   Date: 2010/06/22(火) 23:53   No:55105 解決!     
Title: Re:文字列中の各 文字の出現回数を数える    
そのような方法もあるんですね!

ありがとうございます!!


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

Name: フリオ  ..プログラマー(33,182ポイント)   Date: 2010/06/23(水) 02:05   No:55120     
Title: Re:文字列中の各 文字の出現回数を数える    
 
 charがsignedかunsignedかは処理系によるので、
char buf[BUFFER_SIZE];
は、
unsigned char buf[BUFFER_SIZE];
にしましょう。
 
先に、
>これは、入力した文字列(buf)を使わずに、結果(count)を表示すれば 
>回避できます。
と回答しましたが、もし結果表示の順を文字コードではなく、
入力した文字列に依るのなら、
for(i = 0; buf[i] && buf[i] != '\n'; ++ i) 
    { 
        if(count[buf[i]]) 
        { 
            printf("'%c' appeared %d times.\n", buf[i], count[buf[i]]);  
            count[buf[i]] = 0;
        }
    }

という方法もあります。
 

 編集済み


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



Name: KOZAST  ..ぴよぴよ(223ポイント)   Date: 2010/06/22(火) 23:29   No:55097       
Title: 透過処理がうまくいきません;    
はじめまして。
高校時代、C言語を覚えて1年目くらいの大学生です。
どうしても解決方法がわからなかったので、初めてですが、電子掲示板で質問をさせていただきます。



DXライブラリによるゲーム制作を行っているのですが、どうしてもロードした画像の透過処理ができません。

image = LoadGraphScreen( 0 , 0 , "test.bmp" , TRUE ) ;

だと、test.bmp_aを読み取り、DrawGraph関数で描写させたとき、思い通りに透過処理が行われるのですが、

image = LoadGraphScreen( 0 , 0 , "test.png" , TRUE ) ;

に変えると、なぜか透過処理が行われません。(透過処理を行わないまま描写されます。)

いろいろためしてみたのですが、どうしても原因がつかめません。
test.bmpは思い通りに透過処理が行われたので、プログラムにミスはないはずですが・・・。


ちなみに、上と下の違いは同じサイズで同じ画像、「test」のファイル形式がbmpかpngかの違いです。
フォルダの中にはtest.bmp、test_a.bmp 、 test.png、test_a.png があります。
コンパイルしたときに、エラーはありません。

いったいなぜなのでしょうか・・・。


OS:Windows7
画像作成:ペイント
開発環境:Visual C++ 2008 Express Edition
知識:C言語入門書を一冊(全ページを)読んだレベル。pngとbmpの違いが(容量が軽いくらいしか・・・)わからない。絵に関する知識は0に等しい。


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


Name: シエル  ..中級者(14,334ポイント)   Date: 2010/06/22(火) 23:38   No:55100     
Title: Re:透過処理がうまくいきません;    
LoadGraphScreen関数はファイルを読み込んで、直接画面に描画する関数です。
ですので、image = LoadGraphScreen( 0 , 0 , "test.bmp" , TRUE ) ;では
直接画面に描画しており、メモリに画像を読み込んでいるわけではありません。

DrawGraph関数はメモリに読み込んだ画像を画面に描画する関数です。
DrawGraph関数は以下のようにLoadGraph関数で画像を読み込み、
そのグラフィックハンドルを引数に設定し描画を行います。


int GHandle;
GHandle = LoadGraph( "test1.bmp" ) ;

// 読みこんだグラフィックを画面左上に描画
DrawGraph( 0 , 0 , GHandle , TRUE ) ;


一度作り直してみて下さい。

追記:
すいません。全然関係ないこと言ってるかもしれません。
全然関係無いようだったらスルーして下さい。。。 編集済み


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

Name: Justy  ..伝説なるハッカー(547,898ポイント)   Date: 2010/06/22(火) 23:44   No:55101     
Title: Re:透過処理がうまくいきません;    
>なぜか透過処理が行われません
 test.pngがアルファチャンネル付のフォーマットになっている可能性があります。
 アルファチャンネルを含まない画像に保存しなおしてみて下さい。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,225,565ポイント)   Date: 2010/06/22(火) 23:50   No:55103     
Title: Re:透過処理がうまくいきません;    
> KOZASTさん

はじめまして。
では最初にbmpとpngの違いから整理してみましょう。
とりあえず解らない事があればググれば大抵解決します。

png
http://www.google.co.jp/search?hl=ja&q=png&lr=lang_ja

bmp
http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=bmp&aq=f&aqi=&aql=&oq=&gs_rfai=

画像 種類
http://www.google.co.jp/search?hl=ja&tbs=lr%3Alang_1ja&q=%E7%94%BB%E5%83%8F+%E7%A8%AE%E9%A1%9E&lr=lang_ja&aq=f&aqi=g5g-m1g-cr4&aql=&oq=&gs_rfai=

画像 形式
http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=%E7%94%BB%E5%83%8F%E3%80%80%E5%BD%A2%E5%BC%8F&aq=f&aqi=g-e3g6g-cr1&aql=&oq=&gs_rfai=

まずディスプレイに表示する色は光の三原色で出来ています。
R(赤)G(緑)B(青)で、全て合わせると白になります。(ホントは無色ですが)

で、bmpというのは全くデータを圧縮していない、RGBのデータをそのままファイルに保存したものです。
ですから、重いですし、解像度が同じなら画像の中身によってファイルサイズが変わる事はありません。

一方で圧縮した画像ファイル形式にpngやjpgがあります。
画像を扱うなら最低この3種類知っておく必要があるでしょう。
写真などに特化した圧縮はjpg、テキストデータを画像にしたものなどに適した圧縮はpngです。
また、pngは3原色の他に「透過度」を持つ事が出来るので、ゲームではよく使います。

DXライブラリではデフォルトで「真っ黒」が透過されるようになっています。
しかし真っ黒は透過して欲しくない場合もあり、「ちょっと透過」みたいな事がしたい事もあります。

そんな時は画像ソフトで画像自体に透過要素をいれてやります。
pngはRGBの他に透過度であるAが一緒に保存されます。
この透過はwindows標準のペイントなどでは無理で、編集するならGIMP等が必要です。
http://www.geocities.jp/gimproject/gimp2.0.html

私はフォトショップというソフトを使っています。
http://www.adobe.com/jp/products/photoshop/compare/

他にも絵を描きたいならSAIなど色々あります。
ゲーム制作に力を入れてくると、「真っ黒を透過色に」というやり方は使わなくなってきます。
画像自体に透過処理を施すやり方を覚えた方が良いでしょう。


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

Name: KOZAST  ..ぴよぴよ(675ポイント)   Date: 2010/06/22(火) 23:52   No:55104     
Title: Re:透過処理がうまくいきません;    
すみません;ソース見ないで打ち込んだせいで間違えました;
シエルさんの指摘のおかげで気がつきました。
正しくは以下の通りです。




DXライブラリによるゲーム制作を行っているのですが、どうしてもロードした画像の透過処理ができません。 

 LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image );

だと、test.bmp_aを読み取り、DrawGraph関数で描写させたとき、思い通りに透過処理が行われるのですが、 

LoadDivGraph( "image//test.png" , 5 , 20 , 20 , 20 , 20 , image );

に変えると、なぜか透過処理が行われません。(透過処理を行わないまま描写されます。) 



返答の後ですみません;以後、問題のプログラムのソースはコピペするように気をつけます。


アルファチャンネルを含まない画像というと・・・・ペイントで、保存するときに設定をいじれるのでしょうか・・・?ためしてみます。

入力が遅いんで、こうしている間にいろいろ返答きているかも・・・・失礼しました。。


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

Name: KOZAST  ..かけだし(1,223ポイント)   Date: 2010/06/23(水) 00:13   No:55108 解決!     
Title: Re:透過処理がうまくいきません;    
シエルさん
Justyさん
管理人さん

ありがとうございます!
(この返信メッセージを書いているときに返信した方がいましたら、その人にも感謝です!)
みなさんのアドバイスのおかげで解決しました。
ペイントでは不可能だったので、SAYというソフトを落として画像を上書き保存したら成功しました。

上書き保存するとき、
PNG保存オプションというのが出てきて、
「24bbp RGB」を選択したら成功しました。

これで、ゲーム制作を再び進めることができそうです。
また、質問することがあるかもしれませんが、そのときはまたよろしくお願いします。
(即答でびっくりしました。感謝。)


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

Name: wing  ..中級者(11,266ポイント)   Date: 2010/06/23(水) 00:19   No:55111     
Title: Re:透過処理がうまくいきません;    
ちょっと気になったんですが、
LoadDivGraph( "image//test.bmp" , 5 , 20 , 20 , 20 , 20 , image ); の
5 , 20 , 20, の部分はまちがっていませんか?


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

Name: KOZAST  ..かけだし(1,274ポイント)   Date: 2010/06/23(水) 00:38   No:55113     
Title: Re:透過処理がうまくいきません;    
本当だ・・・おかしいですね。
今、修正しました。
偶然なのか、修正後と修正前の表示がおなじだったので気がつかなかったです。
ありがとうございます。


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



Name: 爺プログラマー  ..ぴよぴよ(645ポイント)   Date: 2010/06/22(火) 22:10   No:55085       
Title: コンボボックスのソート    
リストにソート掛をけるにはCreateWindowEx(でCBS_SORTオプションを設定しますが、
順番に並んでくれません。

又、ソートの対象が今一よくわかりません。
ファイル作成日付順にするにはどの様にしたら良いか教えてください。


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


Name: シエル  ..中級者(14,074ポイント)   Date: 2010/06/22(火) 22:15   No:55086     
Title: Re:コンボボックスのソート    
コードを貼っていただけますか?

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

Name: 爺プログラマー  ..かけだし(1,074ポイント)   Date: 2010/06/22(火) 23:05   No:55092     
Title: Re:コンボボックスのソート    
h_ComboBox1 = CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_SORT,X, Y, 500, 200,    hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

    strcat(INI_BUFF+Folder,"\\*.wav");
    List_len = 0;
    i=-1;

    //ファイルの検索
    hFind = FindFirstFile(INI_BUFF+Folder, &lpFileData);

    next_file:

    FILENAME=lpFileData.cFileName;
    j=strlen(FILENAME)-4;
    FILENAME[j]=0;//拡張子削除

    SendMessage(h_ComboBox1, CB_ADDSTRING, 0, (LPARAM)FILENAME);

    if(j > List_len)List_len = j;

    if(FindNextFile(hFind,&lpFileData)!=0)goto next_file;

    FindClose(hFind);

    SetWindowText(h_EditBox,FILENAME);//最後のファイル名をテキストボックスに書き込む

    List_len = List_len * 8;
    SendMessage(h_ComboBox1,CB_SETDROPPEDWIDTH,List_len,NULL);//最大幅設定

    i=SendMessage(h_ComboBox1, CB_GETCOUNT, 0, 0)-1;//行数取得
    
    SendMessage(h_ComboBox1, CB_SETCURSEL, i, 0);//最後の行を初期表示にする
    return 0;



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

Name: シエル  ..中級者(14,150ポイント)   Date: 2010/06/22(火) 23:20   No:55094     
Title: Re:コンボボックスのソート    
コンボボックスのCBS_SORTのオプションはアルファベット順にソートだった気がします。
順番に並ばないというのはアルファベット順にも並ばないということですか?
ファイル作成日順に並ばないということですか?


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

Name: 爺プログラマー  ..ぴよぴよ(963ポイント)   Date: 2010/06/22(火) 23:34   No:55099     
Title: Re:コンボボックスのソート    
初期段階のCB_ADDSTRINGではアルファベット順になりますが、作成後ある項目を削除して同じアイテム番号の所にCB_INSERTSTRINGでストリングを送った後開くとそのストリングは順番になっていません。
リストの内容を変更した後ではソート対象にはならないのでしょうか?


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

Name: YuO  ..熟練のプログラマー(46,896ポイント)   Date: 2010/06/22(火) 23:45   No:55102     
Title: Re:コンボボックスのソート    
MSDNをちゃんと読みましょう。

> Unlike the CB_ADDSTRING message, the CB_INSERTSTRING message does not cause a list with the CBS_SORT style to be sorted.
と,CB_INSERTSTRINGではソートされた状態にはならないと書いてあります。

MSDN: CB_INSERTSTRING Message (Windows)
http://msdn.microsoft.com/en-us/library/bb775875.aspx

ソートした状態を保ちたいのであれば,CB_ADDSTRINGを使ってください。


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

Name: 爺プログラマー  ..かけだし(1,044ポイント)   Date: 2010/06/22(火) 23:55   No:55107     
Title: Re:コンボボックスのソート    
わかりました、全てをもう一度順に送ってやればいいのですね。
リスト作成対象のフォルダーの表示順が反映されることになるようです。

ネットは人を無精者にするようです。
ちゃんと読んでいる人には頭が下がります。




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



Name: ABS  ..かけだし(1,313ポイント)   Date: 2010/06/22(火) 20:48   No:55072 解決!       
Title: メモリ使用量が増大する? 関数呼び出しと描画    
ABSと言います。C言語超初心者です。
よろしくお願いします。

今していることは、5対5で味方と敵がターン制バトル(ドラクエと同じ)を
したいと思ってます。
そこで、HPバーとMPバーを最大で10人分用意する必要があると思います。

1、攻撃コマンド選択。
2、攻撃対象を選ぶ。
3、HPバーを減らす。
のプログラムはなんとか組めたのですが、
HPバーを減らすたびに、下記のような関数を呼ぶ必要があるのでしょうか。
というか画像を少しでもいじるたびに全て消して、また描く必要があるのでしょうか。

このように関数を用意して画像を描写すると、メモリ使用量が爆発的に増大し、
攻撃コマンドを5回選択するとメモリ使用量が50M→1Gくらいになってしまいます。
何かおかしいと思うのですが、どうかアドバイスください。

つまり質問内容を要約すると、
「下記のようにプログラムを組むと、メモリを使いすぎる!!おかしいですか?」
ということです。。


プロジェクト全体(って言うのかな)をzipで上げます。
28.2MBで解凍すると80Mくらいになります。
ちなみにプログラムは途中で、プレイヤーの行動を決定するだけです。
パスは「C」
http://www1.axfc.net/uploader/Si/so/76874.zip

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

void byouga_kihon(){

    int image_attack = LoadGraph("attack.png");
    int image_magic = LoadGraph("magic.png");
    int image_defence = LoadGraph("defence.png");
    int image_enemy = LoadGraph("enemy.png");
    int image_forest = LoadGraph("Forest.png");
    int image_py     = LoadGraph("py.png");
    int image_py2     = LoadGraph("py2.png");
    

    SetDrawScreen( DX_SCREEN_BACK );

    SetDrawBright(64,64,64);
    DrawGraph(  0,  0,image_forest,FALSE);
    SetDrawBright(256,256,256);
    DrawGraph(360,75,image_attack,FALSE);
    DrawGraph(360,108,image_magic,FALSE);
    DrawGraph(360,141,image_defence,FALSE);
    DrawGraph(480,75,image_enemy,TRUE);
    DrawGraph(80,75,image_py,TRUE);
    DrawGraph(80,180,image_py2,TRUE);


        int i = 0;
        double A = (py_hpX[i] * 100) / py_maxhp[i];

                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+100 , py_hp_y[i]+10 , GetColor(255,0,0) ,TRUE );
                //HPメーターのダメージバーを描画(赤ゲージ)
                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+A, py_hp_y[i]+10 , GetColor(0,255,255) , TRUE );
                //HPメーターのダメージバーを描画(緑ゲージ)

         i = 1;
         A = (py_hpX[i] * 100) / py_maxhp[i];

                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+100 , py_hp_y[i]+10 , GetColor(255,0,0) ,TRUE );
                //HPメーターのダメージバーを描画(赤ゲージ)
                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+A, py_hp_y[i]+10 , GetColor(0,255,255) , TRUE );
                //HPメーターのダメージバーを描画(緑ゲージ)


        i = 5;
        A = (py_hpX[i] * 100) / py_maxhp[i];

                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+100 , py_hp_y[i]+10 , GetColor(255,0,0) ,TRUE );
                //HPメーターのダメージバーを描画(赤ゲージ)
                DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+A, py_hp_y[i]+10 , GetColor(0,255,255) , TRUE );
                //HPメーターのダメージバーを描画(緑ゲージ)
編集済み


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


Name: シエル  ..中級者(13,919ポイント)   Date: 2010/06/22(火) 20:55   No:55074     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
おそらくですが、この関数を呼ぶたびにLoadGraphで画像を何度も読み込んでることが原因
かと思われます。
画像はゲーム開始時に一度だけ読み込んで、DrawGraphだけで何度も描画するというように
したほうがいいと思われます。


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

Name: ABS  ..かけだし(1,508ポイント)   Date: 2010/06/22(火) 21:07   No:55076     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
>>シエルさん
void byouga_kihon(){

    int image_attack = LoadGraph("attack.png");
    int image_magic = LoadGraph("magic.png");
    int image_defence = LoadGraph("defence.png");
    int image_enemy = LoadGraph("enemy.png");
    int image_forest = LoadGraph("Forest.png");
    int image_py     = LoadGraph("py.png");
    int image_py2     = LoadGraph("py2.png");

ここの行を全てコメントアウトして、
最初に、グローバル変数をLoadGraphで読み込むようにしてみたのですが、
それだとなぜか画像が描写されないんです。

上の文のコメントアウト全て外すと、画像描写はされるのですが
やはりメモリ使用量がどんどん増えていきます。

よく分らないです。


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

Name: ムンバ  ..比類無きプログラマー(74,295ポイント)   Date: 2010/06/22(火) 21:20   No:55077     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
こんばんは!

こちらのサイトの館で勉強させて頂いた時、作ったRPGの一部のソースです。
メインファイルは、添付させて頂きました。(←見れなかったら修正します。)
---↑解決により添付ファイル削除しました---
ABSさんの参考になりますでしょうか?

//Lord.cpp(ファイル)

#include "header.h"

void Load()
{
    /* キャラ画像 */
    LoadDivGraph("img/cat001.png", 16, 4, 4, 32, 32, chara001_img); //001(16分割)〜016・猫001

    /* 背景画像 */
    bg[0] = LoadGraph("img/haikei_002.png"); //map1背景

    /* 行けない所画像 */
    no_img[0] = LoadGraph("img/wood001.png"); //木
    no_img[1] = LoadGraph("img/hako001.png"); //宝箱001
    no_img[2] = LoadGraph("img/hako002.png"); //宝箱002
    no_img[3] = LoadGraph("img/hako003.png"); //宝箱003

    /* 行ける所画像 */
    go_img[0] = LoadGraph("img/door001.png"); //扉
    go_img[1] = LoadGraph("img/jimen001.png"); //草
    go_img[2] = LoadGraph("img/miti001.png"); //草
    go_img[3] = LoadGraph("img/izumi_001.png"); //泉001
    go_img[4] = LoadGraph("img/yuka001.png"); //床001
    go_img[5] = LoadGraph("img/izumi_002.png"); //泉002
    go_img[6] = LoadGraph("img/numa001.png"); //沼001

    /* 敵画像 */
    teki_img[0] = LoadGraph("img/teki001_dog.png"); //敵犬

    SetDrawScreen(DX_SCREEN_BACK);    //描画先を裏画面に設定
}


ベテランの方のやり方は、また違うと思うので
ソースに関しては、突っ込まないで下さい。^^;
あくまでも、参考になればと思い。(笑

---編集・追記---
添付ファイルを開いて文字化けしてるようでしたら
ブラウザ→表示→エンコード→日本語(シフト JIS)などで表示されると思います。
メインファイルの 14行目辺りの Load(); で画像を読み込んでいます。
while文より先に(前で)呼び出してます。 編集済み


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

Name: ムンバ  ..比類無きプログラマー(74,327ポイント)   Date: 2010/06/22(火) 21:37   No:55078     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
すみません。
これだと、型宣言が足りないですね。
ん〜?
ABSさん、今お時間ありますか?

---修正・添付ファイル(dec.h)追加---
---解決により添付ファイル削除させて頂きました。---
型宣言をしたファイルを、添付させて頂きました。

header.h ファイルを追記させて頂きます。

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "func.h"
#include "dec.h"

これで、何とかつながりますでしょうか?
もし解らなければ、こちらのサイトの
「龍神録プログラミングの館」の
0〜
6 メインループで呼ぶ関数を制御してみよう
までを参考にされて下さい。 編集済み


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

Name: シエル  ..中級者(14,068ポイント)   Date: 2010/06/22(火) 21:49   No:55079     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
すみません。ソースコードを見させていただきましたが、ちょっと修正していただく部分が
かなり多そうなので、一度下記のページを参照してもう一度書き直すことをお勧めします。
ScreenFlipとかSetDrawScreenなどを何度も呼び出しすぎです。
その他にもたくさん修正する必要があります。。。

http://dixq.net/g/13.html
http://dixq.net/g/14.html


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

Name: ムンバ  ..比類無きプログラマー(74,391ポイント)   Date: 2010/06/22(火) 21:56   No:55080     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
修正してたら、シェルさんとかぶってしまいました。
申し訳御座いません。
私のソースは、今後の参考程度になればと思います。
ちょっと飛躍(ひやく)し過ぎてました。ごめんなさい。
ABSさん、がんばって下さい!^^


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

Name: ABS  ..かけだし(1,626ポイント)   Date: 2010/06/22(火) 21:57   No:55081     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
>>ムンバさん

はじめまして!

#include "header.h"や、
Load.cppを作りmainファイルで呼び出すことなど新しい発見がありました。
大変参考になりました。
自分がちょっと初心者すぎたと思います。勉強し直します。
とりあえずスパゲッティコードで何か作りたいと焦っていたようです。

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




※UPしたファイルを削除しました。


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

Name: ABS  ..かけだし(1,801ポイント)   Date: 2010/06/22(火) 22:05   No:55083     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
>>シエルさん
>すみません。ソースコードを見させていただきましたが、ちょっと修正していただく部分が
>かなり多そうなので、一度下記のページを参照してもう一度書き直すことをお勧めします。
>ScreenFlipとかSetDrawScreenなどを何度も呼び出しすぎです。
>その他にもたくさん修正する必要があります。。。


自分でもコレは突っ込みどころ満載だろうなぁと思ってました(笑)
わざわざ時間を取らせてもらってすいません。
そのページは何度か見たのですが、もう一度最初から見直してみます。
ありがとうございました!


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

Name: ムンバ  ..比類無きプログラマー(74,994ポイント)   Date: 2010/06/22(火) 22:22   No:55087     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
あっ・・・
こちらこそ、初めまして!^^

私は、シェルさんがリンクを張られた、こちらのサイトの
「ゲームプログラミングの館」を参考にさせて頂き、ゲーム作りを始めました。
比類無きプログラマー と、なってますけど
ほとんど「聞くだけの比類無きプログラマー」ですので、ご勘弁下さい。

初級者の本を購入して基礎を勉強しながら、ゲームプログラミングの館を参考に
こちらの掲示板で解らない所を質問しながら・・・
最初は、怒られてるみたいに思う(感じる)かもしれませんが・・・
実は私、いつも訳の解らない、勘違いだらけの質問をしてまして・・・
でも皆さんは、親身になってご解説して頂いてると思う今日この頃です。
こちらのサイトを宣伝するつもりは無いですが。w

龍神録プログラミングの館の 
0〜 6 メインループで呼ぶ関数を制御してみよう
までを勉強したら、添付・貼り付けさせて頂いたソースを含み
簡単なRPGができました。

Dixqさんが最初の頃に作成されたプログラム(何処かのページでおっしゃってましたが)
最初は、スパゲティコードで何万行?にもなってました。
と言ってましたが、最初はスパゲティでも動けば良いのではないかと思います。

そこで味が足りなければ、タバスコをかけたり粉チーズかけたりしてケチャップとか追加して
レベルアップしていけば良いのではないかと思います。

PS:私、また変な事言ってます?---顔文字削除しました---

---編集・追記---
解決後の書き込み、すみません。
相変わらず、確認不足ですみませんでした。
聞くだけの私でも出来たのですから、ABSさんにもできると思います。
無理せずマイペースでがんばるのが、良いかと思います。
以上、長い割りに何のメリットの無い私のコメントでした。www
私もアップさせて頂いたファイルを削除させて頂きますね。
失礼します。

---上から、すみません。---
自分で作ったスパゲティを食べて、味わい吟味しながら
中途半端でも、スパゲティを他人に味わってもらって意見を聞く事が、レベルアップになると思うんです。^^
なんちゃって。w
文字化けの確認ありがとうございました。
次に質問される時は、ABSさんはレベルアップしてると思うので
私には、解説できないかもしれませんね。^^ 編集済み


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

Name: ABS  ..かけだし(1,709ポイント)   Date: 2010/06/22(火) 22:43   No:55090     
Title: Re:メモリ使用量が増大する? 関数呼び出しと描画    
>>ムンバさん

はい、励ましありがとうございます!
スパゲティがまだ出来上がってないので、レベルアップは難しそうです。

あ、すいません。文字化けはしてませんでした。
コードも全て拝見させて頂きました。
顔文字は文字化けしてません。

分らないことがあったらまたスレッドを立てると思うのでよろしくお願いします。


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



Name: dic  ..比類無きプログラマー(75,765ポイント)   Date: 2010/06/21(月) 22:13   No:55020       
Title: ちょっとした認識を聞きたい(雑談?    
ちょっとみなさんにお聞きしたいのですが、
ゲームや、アニメ、マンガなど
仮想空間で、これらは話が始まり、仮想空間で話が終結します

しかし、前にも匿名さんがおっしゃった
現実と、仮想空間の認識の仕方について
みなさんはどのような世界の認識をされているのか、お尋ねしたいところです
私は、人工知能なども勉強したいと考えているのですが、
まっこうから否定される方もいらっしゃって
色々考えた結果、世界の認識方法が異なることや
学校で学んだ知識の違いからこのような意見や考えの違いが生じると考え付きました

そこで、みなさんは、現実の世界と仮想空間の世界を
画像のようにAとB、もしくは場合によってはA場合によってはBと
どのような認識をされていらっしゃるのでしょうか?

すっとんきょうな質問ですが、なかなか相手にされなく
会話にもならず、ひとりで悩んでいるところです

A:現実の世界を仮想空間で表現する
B:仮想空間のものを現実世界に投影する
C:場合による

また、これの発展系で
D:現実世界でがんばったので、マスコミ、ゲーム、アニメ(仮想空間)が盛り上がる → もっと現実世界でがんばる
E:仮想空間でがんばったので、現実世界に反映されなにかしらの報酬が得られる → もっと仮想空間でがんばる


 編集済み


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


Name: DecentLove  ..初心者(6,521ポイント)   Date: 2010/06/21(月) 22:24   No:55023     
Title: Re:ちょっとした認識を聞きたい(雑談?    
どうも、この話題が僕の興味を引いたのでコメントさせていただきます。

ちょっと質問の内容がよくわからなくて、それを先に質問させていただこうかと思います。

現実の世界と仮想空間の世界を
画像のようにAとB、もしくは場合によってはA場合によってはBと
どのような認識をされていらっしゃるのでしょうか?


ここらへんの意味がいまいちよくわかりませんでした。
A・Bはそれぞれこういう意味なんでしょうが、
A:現実の世界を仮想空間で表現する
B:仮想空間のものを現実世界に投影する 

2つの世界の捉え方としてA・Bの2つが上がっているのには解釈出来ませんでした。

僕なりの解釈としては、
Aの場合。
2つの世界の関係が、仮想空間は現実世界を表現するための物であるということ。

Bの場合。
2つの世界の関係が、現実世界に、仮想空間の物を投影する。ということ。


このBの意味がよくわかりません。
わかりやすく、教えていただければ。と思います。
自分的には、こういう哲学的?抽象的?な話題は好きです。


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

Name: dic  ..比類無きプログラマー(76,293ポイント)   Date: 2010/06/21(月) 22:47   No:55028     
Title: Re:ちょっとした認識を聞きたい(雑談?    
興味をもたれたようでなによりです
Bについての説明ですが、なかなかわかりやすく表現することが難しいですが、
ガンダムアニメ「ZZガンダム」の主題歌「アニメじゃない」
のように、宇宙世紀○○年の宇宙型ロボットの戦争ものを表現し
作者はこれは仮想空間ではない現実のものだ と訴えていると感じました

最近の話題ですと、DeathNote(デスノート)のように、死神からもらったノートに
殺害したい人物の名前を書き込むと、現実にその人物がなくなるという
まさに、ノート(仮想空間)に書き込んだ内容が現実に反映される
という作品がでています

つまり、この作品では仮想空間のものが現実に反映される Bの世界を描いたものだと考えています

ただ、その仮想空間から現実の世界への反映は、科学的な裏づけられた
学校でも学べない超高度な知識を必要としているものではないのか
それを悪用されるとおそろしい世界ができあがってしまうのではないのか という危機感から
封印されているのではないのか と考えているものです

他にもアニメ「ナデシコ」でも古代の超科学の原理を手に入れるために宇宙に飛び出るなど
古代の時代からこの今の現代人では理解できない科学があったとされるのではないかと思っています
「ラピュタ」もそうですね

「ZZガンダム」の歌の中に「大人はテレビの見すぎといいけれど、僕は絶対に嘘なんかついてない」
という歌手があるように一部の大人だけが知っていてて、ほとんどの大人はそれを知らないので
話が成立しないのではないかと考えています


前提となる知識が一致しない場合、この説明は理解できないかと思います


Cについてですが、自分にとって都合のいいテレビの内容のときは信用し
自分にとって都合の悪い話(おもしろくない、不愉快)はチャンネルを変える、見ない
という行動をとっているのではないのかと考えています
それゆえ、場合によっては、となります
 編集済み


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

Name: shiro4ao  ..初心者(5,657ポイント)   Date: 2010/06/21(月) 23:52   No:55036     
Title: Re:ちょっとした認識を聞きたい(雑談?    
かなり難しい内容なので、的外れなことを書き込んでいたら申し訳ないです。

>私は、人工知能なども勉強したいと考えているのですが、
 まっこうから否定される方もいらっしゃって 

「人工知能」の定義や「知能」の定義がかみ合わないために一方的に
否定されるのかもしれないと感じました。
知能では高度な部類とされる「計算能力」はコンピュータの得意分野ですが
だからといって子供よりコンピュータが賢いともいい切れないので、
まず言葉の前提をお互い揃えてから議論する必要があるかもしれません。


>そこで、みなさんは、現実の世界と仮想空間の世界を
 画像のようにAとB、もしくは場合によってはA場合によってはBと
 どのような認識をされていらっしゃるのでしょうか? 

自分は単純に
自分の行動に影響するものを「現実の世界」
と考えるので、基本的に「仮想現実だから軽く見る」とか「現実なのだから重視する」
といったことはしません。
「現実世界」の中に「仮想空間の世界」が入る事もあります。
逆に行動に影響しないものは「現実の世界」に含めません。

例えばゲームをプレイしていて、ボス戦で、20回やられてむしゃくしゃしたとします。
すると、仮想空間の世界(この場合はゲームのボス)に影響されむしゃくしゃしたのでこれは
現実です。
逆に道を歩いていて「ナントカカブトムシ」という虫が歩いていようと興味はないので
これは「現実の世界」にはありません。
だいたいこんな認識なので、当然人と人の「現実」は噛みあわないもので当然と考えています。


さらに現実を仲介する仮想現実というものもあるとおもいます。
(チャット、BBS、Skypeなど)
これも(媒介として仮想現実を利用していても)現実の世界に含めると考えます。

だいたいこんな感じですが、見当違いの内容だったらすみません。
学生時代、国語のテストでマス目いっぱい書いたのに×をもらうことが多かったので
わかりにくかったら申し訳ないです。


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

Name: ROM  ..入門者(2,663ポイント)   Date: 2010/06/21(月) 23:53   No:55037     
Title: Re:ちょっとした認識を聞きたい(雑談?    
質問の内容が…理解出来ないのは私だけなのでしょうか・・。

つまり

現実があって仮想があるのか、
仮想があって現実があるのか、
そういうような事ですか?

2回位読み返しましたが理解出来ませんでした。。。


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

Name: ookami  ..プログラマー(25,933ポイント)   Date: 2010/06/21(月) 23:55   No:55038     
Title: Re:ちょっとした認識を聞きたい(雑談?    
たいへん高尚なテーマですね。私はその辺にはうといですが、面白そうなので僭越ながら回答させていただきます。

他の方と似ていますが、「A〜Eのどれともつかない」です。

マンガなどを「楽しむなどのリアクションをとっているのは現実の私」のような気もしますし、「感情移入する(仮想世界に自分を投影する)からこそ楽しめる」ようにも思えます。どちらともつかないです。

D、Eなどの「がんばる由縁」についても同様です。


# ついでですが、「まっこうから否定される方もいらっしゃ」る「人工知能」と言うのは「人間のように感じ、人間のように考える人工知能」のような感じでしょうか。ひとくちに人工知能といってもいろいろですから…


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

Name: ムンバ  ..比類無きプログラマー(73,831ポイント)   Date: 2010/06/22(火) 00:13   No:55039     
Title: Re:ちょっとした認識を聞きたい(雑談?    
こんばんは。
私も、この様な話題には大変興味があります。
(ただ、こちらの掲示板での話題に合っているかどうかは
 ノーコメントとさせて頂きます。w)

私は、「仮想空間」は「妄想」だと考えてます。
あくまでも、私の考えです。
数学で言う = 、プログラミングで言う == 
とは、ちょっと違うと思うのですが、うまく表現できません。

例えば、「相手の気持ちを(常日頃)理解できる様に心がけよう」
と自分が思ってたとして、誰かに、この気持ちを伝えた(話をした)とします。

この話を誰かに言った時、聞いた相手が約1分間、首を傾げて考えていたとします。

「今、自分が言った事は正しかったのか?いや、間違ってない。」
「いや!やっぱり俺の言った事に間違いは無い。」
「だから、俺の意見に賛同しろよっ!早く質問に答えろ!」
あるいは
「自分が言った事は正しいんだ。俺の意見に賛同するはずだ。」
「いや!やっぱり俺の言った事は間違いだ。とにかく早く返事しろ!」
「何で、俺の意見に賛同できないんだ?おまえに聞かなきゃ良かった。」

相手も首を傾げてた、この約1分間に
色々な仮想空間を造って、妄想をした事と思います。

>>すっとんきょうな質問ですが、なかなか相手にされなく 
>>会話にもならず、ひとりで悩んでいるところです

私は、仮想空間と妄想は同じ様なものだと思ってますが
現実的に考えると(本当は、そう思いたく無いと思っているにも関わらず)
今現在の自分の、目的や夢・希望と重なります。

私の現段階の結論としては(←この先、経験を積み、また考え方が変わってくると思いますが。)
「仮想空間や妄想は、自分の中で無限に広がり、人(他人)には理解できない部分があると同時に
 人(他人)にも、無限に広がる仮想空間や妄想があると思うので、等しくするのは難しい。」

多数決も大事だと思うのですが、このジレンマ・・・。
私の妄想でした。

---編集・追記---
また、やっちゃいました。(_ _)
No:55036 以降の皆さんのレスを確認する前の、レスです。
おやすみなさい。 編集済み


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

Name: ideyan  ..初心者(8,582ポイント)   Date: 2010/06/22(火) 00:14   No:55040     
Title: Re:ちょっとした認識を聞きたい(雑談?    
現実
仮想現実
仮想空間
拡張現実
複合現実

このあたりの話ではないんですよね?多分。
私もちょっと質問の内容が理解できません^^;

ですが興味のある内容ですので
補足が入るなり他の方の解答を見て理解できたら
是非回答してみたいと思います。


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

Name: ムンバ  ..比類無きプログラマー(73,783ポイント)   Date: 2010/06/22(火) 00:47   No:55042     
Title: Re:ちょっとした認識を聞きたい(雑談?    
dicさんの、このスレッド(No:55020)

A〜Eのご質問の私の回答:A〜Eの全てです。

すみません。
おやすみなさい。(∪。∪)。。。zzzZZ (←この顔文字、文字化けしてませんか?)


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

Name: たかぎ [URL]  ..ハッカー(210,849ポイント)   Date: 2010/06/22(火) 01:09   No:55043     
Title: Re:ちょっとした認識を聞きたい(雑談?    
> この顔文字、文字化けしてませんか?

こんな感じに見えていますが、期待通り?


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

Name: ムンバ  ..比類無きプログラマー(73,869ポイント)   Date: 2010/06/22(火) 01:19   No:55044     
Title: Re:ちょっとした認識を聞きたい(雑談?    
たかぎさん、こんばんは!
期待通りに、表示されてるみたいです。
ってか、リンク小さいなぁ〜。(笑
ありがとうございました。

歯磨きしたんで、今度こそ寝ますねっ♪
皆さん、おやすみなさい。(∪。∪)。。。zzzZZ(←寝る時のお気に入りの顔文字で。w)


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

Name: 三郎  ..入門者(4,160ポイント)   Date: 2010/06/22(火) 04:19   No:55050     
Title: Re:ちょっとした認識を聞きたい(雑談?    
1.私はどうしてこのような事が議論になるのか、その事自体が分りません。なぜ議論が必要なのかもわかりません。
2.現実、過去、未来(将来)。この概念なら分る。想像、予想と云う言葉もわかる。
3.皆さんの述べられた仮想???とか妄想??とか空間??とか云うのは(?に、どんな言葉を入れても良い)単に定義、概念に過ぎないと思う。だから何でも「あり」だと思う。
4.そして仮想(??)に基ずいて{??の言葉は此処では現実}仮想現実に基ずいて多くの映画とかゲームなどがあるのも事実。「だから、どうなのですか?」としか云えない。
5.そして再び「1.」の議論に戻る。「どうしてこのような議論になり必要なのかわかりません」と云う永久ループに入り抜け出せない。
6.質問者には失礼ですが、現実主義者の凡人の私には、このようにしか思えませんが、、、


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

Name: へろり  ..中級者(13,239ポイント)   Date: 2010/06/22(火) 06:14   No:55054     
Title: Re:ちょっとした認識を聞きたい(雑談?    
質問の意味はさっぱりわかりませんが。

この手のフィクションは娯楽ですから、娯楽は娯楽で楽しめればいいんじゃないですか?
楽しむために作られた作り話なわけですから。

現実世界とか仮想世界とか今ひとつ定義が解りませんが、どういうお話をどのように作っていくかは、作者の胸先三寸だと思うのですが。

的はずれな解答だったらごめんなさい。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,224,717ポイント)   Date: 2010/06/22(火) 07:40   No:55056     
Title: Re:ちょっとした認識を聞きたい(雑談?    
おはようございます。
私もちょっと意味が良く解らなかったのですが、

> 人工知能なども勉強したいと考えているのですが、まっこうから否定される方もいらっしゃって

この辺はどう関連するのでしょう?


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

Name: 山崎  ..熟練のプログラマー(44,429ポイント)   Date: 2010/06/22(火) 08:33   No:55057     
Title: Re:ちょっとした認識を聞きたい(雑談?    
おはようございます〜。
なかなか深いテーマ性を持った話題のように感じますね、よろしければ私もコメントしたいところです。

ただ申し訳ないことに、私もちょっと質問の意味を理解しかねております ^^;

この場合の「仮想空間」とは、ゲームやアニメ、漫画の世界の中のことを指すのでしょうか?
それとも、コンピュータのメモリ空間、あるいは電子コミュニティみたいな意味でしょうか?

また、
現実世界→仮想空間
現実世界←仮想空間
という表現なのですが、この場合矢印はどんなことを意味するのでしょうかな?


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

Name: dic  ..比類無きプログラマー(78,233ポイント)   Date: 2010/06/22(火) 09:34   No:55060     
Title: Re:ちょっとした認識を聞きたい(雑談?    
予想以上に反応があってびっくりしましたが、
色々な言葉がでてきそうなので、現実世界と仮想空間と言葉を2つだけにしぼりました



>shiro4aoさん
たしかに、それは自分に興味がないものは現実世界ではないというとらえかたですね


>ookamiさん
なるほど
感情移入できなものは、現実のものではない
もしくは、自分が何かをしているわけではない
という考え方でしょうか


>ムンバさん
「仮想空間」は「妄想」ですね
たしかに、そのようにとられる方はおおいです
アニメも夢おち というのも多いですからね


>ideyanさん
並列世界についてでしょうか?
ちょっと深追いすると奥が深くなるので
現実世界と仮想空間という2つだけにしてます


>三郎さん
現実主義とありますが、たしかに存在はする
ここで止まった思考もあるかもしれませんが
現代ではマスコミが発達し、遠い地域の情報などが
一瞬で入ってくる時代ですし
アニメやゲームに感情移入するのもあるかと思います
ただ、存在だけはする しかし何にも影響を与えない
というものはないと考えています
たとえば、好きな芸能人が身に付けてるファッションを
マネしたりなど、テレビの影響を受ける人もいると思います


>へろりさん
いえ、娯楽としてとらえているようで
それはわりきった関係で、そういうとらえかたもアリだと思います


>Dixq (管理人) さん
人工知能がどのように関連するかですが、
仮想空間では主に人工知能が活躍するものと考えています
それで、人工知能にも強い考えをもった人工知能と、弱い考えを持った人工知能があり
どちらかを選ぶとまた違った仮想空間を作れる
また、人工知能ではなく人が仮想空間で何かをやる(将棋などですね)
というふうに人対人工知能 と 人対人 という関係があると思ってます
プロの棋士はコンピュータと将棋を指してはいけない という決まりがあったと
聞いたことがあります
人が指す手と人工知能が指す手では プロの棋士に与える影響が違ってくるから
だと思っています


>山崎さん
画像の矢印の意味ですが、現実世界→仮想空間 というのは現実世界のものを再現したものが
仮想空間という意味で
現実世界←仮想空間というのが 仮想空間のものが現実に現れるという意味です

コンピュータが作られた理由として、現実では実現できないものごと(科学実験など)を
コンピュータ上(仮想空間)で再現しようというのが主な目的だったと理解しています
科学反応式などの細かい物質レベルものを実際にAの薬品1g Bの薬品2gを配合した場合
どのような科学反応が起こるかを何がおきるか分からない場合、まず、コンピュータで
再現してみてから、安全なようだ、と判断できたら、実際にAの薬品とBの薬品をまぜる
という使い方をするものだと考えてます
(もしかしたら、爆発するかもしれない)

よく言われるシュミレート(シミュレータなどいろいろありますが)を行ってから
実際に実行するというものです

なので、この場合 Aの現実世界を仮想空間に再現しているとも言え
Bの仮想空間の結果をもとに現実世界に反映しているとも言えるのです


>ROMさん
上の説明でなんとなくわかったでしょうか?


根本的な質問として、何でこんな質問をしたのか?
というと、人によってテレビやゲーム、マンガ、ネットなどのやりとりを
どのようにとらえているのかを知りたかったからです


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

Name: softya [URL]  ..ハッカー(183,345ポイント)   Date: 2010/06/22(火) 11:10   No:55064     
Title: Re:ちょっとした認識を聞きたい(雑談?    
おはようございます。
全部読みましたが、いまいち質問の意図が分かりませんでした(汗)。

まず、
>ただ、その仮想空間から現実の世界への反映は、科学的な裏づけられた
>学校でも学べない超高度な知識を必要としているものではないのか
>それを悪用されるとおそろしい世界ができあがってしまうのではないのか という危機感から
>封印されているのではないのか と考えているものです 
が気になったのでコメントを。

私の感覚からすれば、人類の脳科学はそこまで脳のシステムを解析出来ていません。
薬で幻覚を与えたり・睡眠不足で幻覚を見せたりすることは出来ますが、これは経験則でそうなる事を知っているだけで、脳のシステムとしてなぜそうなるのかは全く解明されていないはずです。
あと、映画「ビューティフル・マインド」でも有名になった数学者のジョン・ナッシュの様に統合失調症を患った人にとっては幻覚と現実の区別がつきません。でも、なぜそうなるのかは全く解明されていないわけです。
この様に脳のシステムはまった未解明なのですが、ひとつだけ言えることは人は脳のシステムを通して現実を認識しています。ただ、このシステムは破綻しやすいシステムですし、騙しやすいシステムです。なので、自分が現実だと思っていることも本当に現実かどうかは区別出来ていないと思います。つまり、人が現実として受け止めているのは脳が作り出した仮想現実に過ぎないんじゃないかってのが私の持論です。

それはそれとして、仮想世界と現実世界などで面白いものを挙げておきます。
・拡張現実(AR)
http://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E7%8F%BE%E5%AE%9F
・アニメ「電脳コイル」
http://ja.wikipedia.org/wiki/%E9%9B%BB%E8%84%B3%E3%82%B3%E3%82%A4%E3%83%AB
・映画「ビューティフル・マインド」
http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%95%E3%83%AB%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89


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

Name: dic  ..比類無きプログラマー(78,374ポイント)   Date: 2010/06/22(火) 20:16   No:55071 解決!     
Title: Re:ちょっとした認識を聞きたい(雑談?    
>softyaさん
>人が現実として受け止めているのは脳が作り出した仮想現実に過ぎないんじゃないかってのが私の持論です。 
映画マトリックスでもあったように、本人が認識しているものが実は作り出されたものだった
という話もありますからね

C言語からかなり離れそうなので、ここらへんで解決押しておきます


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



Name: kanade  ..ぴよぴよ(150ポイント)   Date: 2010/06/21(月) 03:12   No:54947       
Title: オープンアプリでのランダム関数    
C言語の質問でなくてすみません。

携帯用のオープンアプリを作っております。 ※Java
ランダム関数を使おうとしているのですがエラーが出てしまいます・・・。

if(mode == M_SHUFFLE) rand = (int)(Math.random() * 10 + 1);

この様な書き方では駄目なのでしょうか?
rand=10等と入れると問題なくコンパイルが通ります。

又、別の質問になってしまうのですがテキストエディタで修正して〜と繰り返しております。
【Wireless Toolkit 2.5.2】
VisualStadioみたいな開発環境はないのでしょうか?


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


Name: YuO  ..熟練のプログラマー(46,813ポイント)   Date: 2010/06/21(月) 04:01   No:54948     
Title: Re:オープンアプリでのランダム関数    
単に,WTK環境にはjava.lang.Math#randomが無いだけです。
WTKの下のdocs (もしかしたら私が別途ダウンロードして展開した可能性有り) のapi以下を見ても,
docs/api/midp/java/lang/Math.htmlには,
[フィールド]
・E
・PI
[メソッド]
・abs(double a)
・abs(float a)
・abs(int a)
・abs(long a)
・ceil(double a)
・cos(double a)
・floor(double a)
・max(double a, double b)
・max(float a, float b)
・max(int a, int b)
・max(long a, long b)
・min(double a, double b)
・min(float a, float b)
・min(int a, int b)
・min(long a, long b)
・sin(double a)
・sqrt(double a)
・tan(double a)
・toDegrees(double angrad)
・toRadians(double angdeg)
[java.lang.Objectからの継承メソッド]
・equals
・getClass
・hashCode
・notify
・notifyAll
・toString
・wait
のみが書かれています。

J2SEのソースから引っ張ってきてもよいのですが,結構大がかりになりそうなので,
適当な線形合同法なりの疑似乱数アルゴリズムを自分で描いた方が楽かもしれません。

 
> VisualStadioみたいな開発環境はないのでしょうか?

Javaと言えばまずはEclipse。
というわけで探してみると,作り方をメモしてくれている方がいました。
参考になればと思います。
SITE: Pleiades(Eclipse 3.5.2 Galileo)によるJ2ME開発環境構築メモ: 執事マウホフの手帳
http://rundog.txt-nifty.com/mau/2010/05/pleiadeseclipse.html


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

Name: kanade  ..ぴよぴよ(218ポイント)   Date: 2010/06/21(月) 11:46   No:54963     
Title: Re:オープンアプリでのランダム関数    
そうだったんですか・・・。
自分で似乱数アルゴリズムを作る・・・。
多分、無理ですwww

そうなると仕様を変えたほうがよいのでしょうか?
どうしてもrand関数を使いたいのですが・・・


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

Name: へろり  ..中級者(12,985ポイント)   Date: 2010/06/21(月) 12:01   No:54965     
Title: Re:オープンアプリでのランダム関数    
別に車輪の再発明をしなくとも、疑似乱数のアルゴリズムなら、あっちこっちに転がってるので、
適当にチョイスすればいいだけじゃないですか?


「乱数 アルゴリズム」でグーグル先生に聞いたら、このサイトがトップにでました。
ライセンスがどうなっているのかは解りませんが、ソースものってます。


http://ayusya.hp.infoseek.co.jp/AlgorithmRandom.html



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

Name: 天空橋  ..かけだし(1,137ポイント)   Date: 2010/06/21(月) 12:13   No:54966     
Title: Re:オープンアプリでのランダム関数    
用途にもよりますが、乱数テーブルを使うのはどうでしょうか?

通常のJavaSEより、乱数を例えば、300個くらい出力して、それを基にstaticな配列として以下のように、定義します。

static final float[] RAND_TABLE = {166.59293f, 166.59293f, ...};

そして、上記の配列を参照していく、rand関数を作ってみると、擬似的にrand関数のようなものが作れるかと思います。

public static int randIndex = System.currentTimeMillis();
public static float random() {
  return RAND_TABLE[(randIndex++) % RAND_TABLE.Length];
}

※ 上記ソースは今コンパイル出来る環境がないため、確認していません。


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

Name: 天空橋  ..かけだし(1,325ポイント)   Date: 2010/06/21(月) 13:54   No:54972     
Title: Re:オープンアプリでのランダム関数    
先ほど、乱数テーブルを利用すればどうでしょうか?と記載したのですが、
ちょっと調べてみたら、CLDC1.1に乱数を扱うクラスRandomクラスがあるようなので、そちらを利用すればよろしいのではないでしょうか?

http://java.sun.com/javame/reference/apis/jsr139/java/util/Random.html

なお、オープンアプリと記載しているところから、au用の携帯アプリを作成していると推察するのですが、
au用の携帯アプリの場合、CLDC1.1/MIDP2.0の仕様に基づいたアプリを利用できる旨が記載されています。

http://www.au.kddi.com/ezfactory/tec/spec/openappli.html

なので、CLDC1.1とMIDP2.0のAPIリファレンスを読むことをお勧めします。


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

Name: kanade  ..ぴよぴよ(321ポイント)   Date: 2010/06/22(火) 15:38   No:55069     
Title: Re:オープンアプリでのランダム関数    
回答ありがとうございます。

Randomクラスは使えるのでしょうか?
if(mode == M_SHUFFLE) rand = Random();
のようにしてみるとエラーが出てしまいます・・・。

どの様に使えば良いのかがわかりません・・・。


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

Name: 天空橋  ..かけだし(1,746ポイント)   Date: 2010/06/22(火) 16:07   No:55070     
Title: Re:オープンアプリでのランダム関数    
提示されたコードを見る限りでは、インスタンスの生成がされていないように見受けられます。
Randomは関数ではなく、クラスです。

もし、この言葉の意味がわからない場合は、アプリケーションを作るよりも先に、
Javaの基本を学んだほうがよろしいかと思います。


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



Name: Limone  ..ぴよぴよ(180ポイント)   Date: 2010/06/21(月) 05:53   No:54950       
Title: ポインタの初歩    
すいません、ポインタについて教えて下さい

int _tmain(int argc, _TCHAR* argv[])
{
    int a,*b;
    a = 10;
    *b = 0;
    printf("値a:%d::::アドレスa:%d",a,&a);
    printf("値b:%d::::アドレスb:%d",*b,b);
    printf("\n");
    return 0;
}

この実行結果でエラーが出ます
ポインタでエラーは出るんですが
何故エラーが出るのかが分からないのです

それと、配列やポインタ、クラスを作成した時は
削除する必要がある、と言われたのですがそれもイマイチ分かりません
レベルの低い理解度で申し訳ありませんがどうかお願いします


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


Name: シエル  ..中級者(11,823ポイント)   Date: 2010/06/21(月) 07:48   No:54953     
Title: Re:ポインタの初歩    
この辺を参考になさった方がよいかと…
http://9cguide.appspot.com/15-05.html

>>それと、配列やポインタ、クラスを作成した時は削除する必要がある、
>と言われたのですがそれもイマイチ分かりません
メモリを動的確保した時のことですか?


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

Name: 初級者  ..初心者(8,195ポイント)   Date: 2010/06/21(月) 12:14   No:54967     
Title: Re:ポインタの初歩    
bの値(つまり、どこを指しているかということ)が
不定の状態で、*bのように、その不定な場所にアクセスしてはいけません。


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

Name: Limone  ..ぴよぴよ(617ポイント)   Date: 2010/06/21(月) 12:47   No:54968     
Title: Re:ポインタの初歩    
>bの値(つまり、どこを指しているかということ)が 
>不定の状態で、*bのように、その不定な場所にアクセスしてはいけません。

なるほど、分かったような気がします。
ありがとうございます

>>メモリを動的確保した時のことですか?

多分そうです。
しかし、動的確保と言うのが良く分かっていません
取り敢えず、以下ソース

void    hantei(int    *judge){
    if (judge == NULL) {
        printf("メモリの割り当て失敗\n");
    } else {
        printf("メモリの割り当て成功\n");
        // メモリの解放どうやるの?
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a,*b=NULL;
    hantei(b);    //失敗の筈
    b = &a;        //bのアドレスにaのアドレスを設定
    a = 10;        //aの値に10を代入
    *b = 100;    //bの値に100を代入
    printf("値a:%d::::アドレスa:%d\n",a,&a);    //aとbのアドレスが一緒だからaの値は100になってる筈
    printf("値b:%d::::アドレスb:%d\n",*b,b);    //aとbのアドレスが一緒だからbの値は&aになってる筈
    hantei(b);//成功の筈
    return 0;
}


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

Name: シエル  ..中級者(13,212ポイント)   Date: 2010/06/21(月) 19:24   No:55002     
Title: Re:ポインタの初歩    
上記のソースがメモリの動的確保をしているとは思えませんが…

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

Name: Limone  ..ぴよぴよ(823ポイント)   Date: 2010/06/21(月) 19:55   No:55005     
Title: Re:ポインタの初歩    
どうやら言葉が足りなかったようです。

動的確保と言うのが良く分かっていません 
動的確保とは何ですか、どうすれば動的確保なんですか
↑のソースで作ってみましたが、コレは違うんですよね?
じゃあ、やっぱり
動的確保とは何ですか、どうすれば動的確保なんですか
となるワケです

その問いに対して
動的確保しているとは思えません、と答えられましても
私には分かりかねます

それと、動的確保じゃなければ解放処理はしなくても良いんですか


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

Name: シエル  ..中級者(13,588ポイント)   Date: 2010/06/21(月) 20:47   No:55011     
Title: Re:ポインタの初歩    
どの辺までC言語を勉強されてるのか分かりませんが、
この辺を参考になさって下さい。
http://www.geocities.jp/ky_webid/c/055.html

>それと、動的確保じゃなければ解放処理はしなくても良いんですか
動的に確保していなければ、その関数が終了した時点で自動的に解放されます。

追記:
c++のクラスについてはこちら
http://www.geocities.jp/ky_webid/cpp/language/012.html
少しはググってみて自分で調べてみましょう。 編集済み


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

Name: Limone  ..ぴよぴよ(961ポイント)   Date: 2010/06/21(月) 21:12   No:55014 解決!     
Title: Re:ポインタの初歩    
すいません
ググった結果、辿り着いたココの
C言語何でも質問掲示板で
ググって自分で調べろ、と言われると思っていませんでした

どうやらココの掲示板は私にはレベルが高過ぎるようです
よろしければ、低レベルの理解度な初心者が
質問しても大丈夫な掲示板などがあれば教えて下さい


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

Name: MNS  ..プログラマー(37,315ポイント)   Date: 2010/06/21(月) 21:22   No:55015     
Title: Re:ポインタの初歩    
「動的確保とはなんですか?」
このような漠然とした質問の場合、
基本的には、サイト上での詳しい説明よりもわかりやすく、
このような掲示板のスレッド上で説明することは困難です。当たり前ですね。
それはどこの掲示板を行っても同じだと思いますよ。

Limoneさんが、シエルさんが提示されたサイトを読んでみて、わからなかったのなら、
何が分からなかったを具体的に明らかにして質問してみてください。
そうすれば、回答者の方々は、その分からなかったところを重点的に詳しく説明することが出来ます。
そういうところが、いわゆる掲示板のメリットなのではないでしょうか?


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

Name: ookami  ..プログラマー(25,276ポイント)   Date: 2010/06/21(月) 22:03   No:55017     
Title: Re:ポインタの初歩    
例えばいきなり「日本とは何ですか?」とか聞かれたら、「何って何が?」と思うと思います。質問が曖昧とはそんな感じです。

さらに「日本で芸者は富士山でリニアモーターカーですか?」とか聞かれたら「いやちょっと勘違いしてるみたいだから、とりあえずガイドブックでも読んでみたら?」と思うと思います。今そんな感じです。

レベルの高い低いではなくて、いったん情報を整理してみましょう、ということです。


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

Name: Limone  ..かけだし(1,130ポイント)   Date: 2010/06/21(月) 22:04   No:55018     
Title: Re:ポインタの初歩    
その質問をした結果、その提示サイトへと答えて貰えて
提示サイトを読んで試した結果、なんとなくわかったのですが

そもそも、その質問をするな、と言われたら
そういった「サイトの行き方へと教えていただくこと」すらもできません。

どうやら、既存サイトへの誘導レベルでしか無い質問だと
ここではダメな様子を受けましたので。
ですので、次回以降は手を煩わせ無いように
そういったサイト誘導レベルの質問をしても大丈夫な掲示板があれば、と思ったのです


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

Name: box  ..ハッカー(154,807ポイント)   Date: 2010/06/21(月) 22:07   No:55019     
Title: Re:ポインタの初歩    
> それと、配列やポインタ、クラスを作成した時は
> 削除する必要がある、と言われたのですがそれもイマイチ分かりません

そのように言った人自身が、イマイチわかっていないだけだと思います。


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

Name: y  ..初心者(6,067ポイント)   Date: 2010/06/21(月) 22:39   No:55027     
Title: Re:ポインタの初歩    
もしかして、勉強は嫌い(または苦手)な方でしょうか。

>そういった「サイトの行き方へと教えていただくこと」すらもできません。 
ということを調べるのが、ググるということです。

>そういったサイト誘導レベルの質問をしても大丈夫な掲示板があれば、と思ったのです 
もし紹介したら、今度はその掲示板の方々の手を煩わすことになります。


みんな始めはわからないものです。
それでも入門書なり入門サイトなりに目を通し、実行させながらなんとか理解するのです。
それが勉強というものではないでしょうか。
私は、勉強してある程度理解して、疑問が生まれ、そこではじめて質問するに至るものだと思っています。
貴方はまだその域に達していません。単なる勉強不足です。

少々キツイ言い方になってしまいましたが、今後の貴方のためを思い、敢えて言わせて頂きました。
どうかお許しください。


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

Name: MNS  ..プログラマー(37,318ポイント)   Date: 2010/06/21(月) 22:49   No:55029     
Title: Re:ポインタの初歩    
Limoneさんが、最初に質問された、
「なんでこのコードではエラーがでるの?」という質問は、調べるのは難しいでしょうね。
難しいなりに調べてみて、この掲示板にたどり着いたんだと思います。

そして、質問した結果、『動的確保』というキーワードを得ましたね。
これをオウム返しのように、「動的確保とは?」と返すのは良くないのです。
この動的確保というキーワードを調べてみましたか?

>そもそも、その質問をするな、と言われたら 
>そういった「サイトの行き方へと教えていただくこと」すらもできません。 

シエルさんが提示されたサイト(前者)は、動的確保とGoogleで調べれば、2番目に出てきます。
Limoneさんが、このサイトを読んで試した結果、分かったのなら、
わざわざ質問するよりも、自分で調べてみたほうが早いとは思いませんか?


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

Name: Limone  ..かけだし(1,155ポイント)   Date: 2010/06/21(月) 22:58   No:55030     
Title: Re:ポインタの初歩    
はい、そうですね
検索の仕方が間違ってました
すいませんでした


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

Name: ムンバ  ..比類無きプログラマー(73,340ポイント)   Date: 2010/06/21(月) 23:01   No:55031     
Title: Re:ポインタの初歩    
こんばんは。

いつも変で、すみません。(汗
スレッドから離れてしまいます事、どうかお許し下さい。

私は「ググってみましょう」とか「グーグル先生に聞いてみましょう」
など、ご指導していらっしゃった方々の「ググる」って意味は
(yさんのNo:55027でおっしゃられてる「ググる」の揚げ足とかを取っているのでは無いので
 お気に触られたら、どうかご勘弁下さい。悪意等は全く御座いませんので。)

「Googleサイトの検索エンジンで、検索してみましょう。」
って意味かと、今まで思っていたのですが
「Yahooのサイトの検索エンジンで、検索してみましょう。」
も、ググるって事なのですか?

またしても、変な質問∩便乗させて頂き、すみません。(_ _)
ご指導頂ける方、宜しくお願い致します。

---編集・追加---
新しく、スレッド立てるべきでした。
解決後に、すみませんでした。(謝
必要なら、また質問させて頂きますので
今回の私のぶら下がり、無視して下さい。
本当に、すみませんでした。 編集済み


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

Name: dic  ..比類無きプログラマー(76,728ポイント)   Date: 2010/06/21(月) 23:08   No:55032     
Title: Re:ポインタの初歩    
動的確保とはプログラム実行中にメモリを割り当てることです
今回のソースコードでは、ソースコードに書いた時点で割り当てられており
プログラムが実行し、そのプログラムがメモリを必要としているので
そのプログラムが必要に応じてメモリを確保するという意味です

動的メモリ確保の対義語として、静的メモリの確保というものがあります

この静的メモリ確保は、ソースコードを書いた時点で、どれだけのメモリを確保するのか
ソースコードにそのまま書かれています

動的メモリ確保は、プログラムを実行した時にメモリの確保をします
場合によっては100Kbかもしれませんし、100MBだったりします
これは、ソースコードに直接書き込むことができません
そのプログラムが必要とした、プログラムの実行中にしか分からないメモリのことを指しています

Limoneさんが言っているのは動的メモリの確保ではなく、静的メモリの確保です
静的メモリの確保は初めからどのくらいのメモリを必要とするか分かっており、
ソースコードに直接書き込めるものです

int i; も
int *p; も
メモリを確保するという点では同じです
ただ、この *p にどのくらいのメモリを入れるかを
コンパイルの時ではなく、プログラム実行中に決めるのは動的メモリの確保です

動的、静的の違いを比べてみるのがいいかと思います


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

Name: ookami  ..プログラマー(25,407ポイント)   Date: 2010/06/21(月) 23:09   No:55033     
Title: Re:ポインタの初歩    
この掲示板ほど、専門知識をもっていて良心的な回答者さんが集まる掲示板はなかなか無いと思います。

Limoneさんは引きぎみのようですが… 決して、怒ったりけなしたりしているわけではないんですよ。

> ムンバさん
「ググる」そのものは「グーグルで検索する」という意味のようです。「検索といえばグーグル」みたいな風潮になってるからですかね^^


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

Name: ぽこ  ..上級者(16,809ポイント)   Date: 2010/06/21(月) 23:10   No:55034     
Title: Re:ポインタの初歩    
> そもそも、その質問をするな、と言われたら
> そういった「サイトの行き方へと教えていただくこと」すらもできません。

誰も「質問するな」って言ってませんよ。
シエルさんの
> 少しはググってみて自分で調べてみましょう。 
は「くだらない質問するな」って意図ではなくて、
「そういう癖をつけると時間の節約になります」って意図だと思いますよ。

#言葉足らずな点は否めませんが。


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

Name: ムンバ  ..比類無きプログラマー(73,306ポイント)   Date: 2010/06/21(月) 23:13   No:55035     
Title: Re:ポインタの初歩    
(ookamiさん、ご解説ありがとう御座いました。了解しました。^^)

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

Name: Limone  ..かけだし(1,229ポイント)   Date: 2010/06/22(火) 02:30   No:55046     
Title: Re:ポインタの初歩    
意見、解答、フォローありがとうございます。
既に解決済みマークを付けましたが
ちゃんと読みましたよ、理解しました(つもりですよ)
という印として書き込ませて頂きます。

追記:
お礼は答えてくれた方全員に大してすべきで、
個別にはあまりしたくは無いのですが、それでも
「dic」さん ありがとうございます 編集済み


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



Name: Apple  ..ぴよぴよ(492ポイント)   Date: 2010/06/20(日) 23:24   No:54929       
Title: テストの平均値を求める    
#include <stdio.h>

#define maxStudents 10

int calcAve(student input[], double *englishAverage, 
double *mathAverage, double *totalAverage)
{??????

int main(void)
{
    students english,math;
    double mathAve, engAve, totalAve;
    
    int i=0;
    
    while (i<maxStudents) {
        if (scanf("%d %d", &students[i].english, &students[i].math) != 2)
            break;
        i++;
    }
    students[i].english = students[i].math = -1;
    
    calcAve(students, ????????);
    
    printf ("English average is %6.2f\n", engAve);
    printf ("Math    average is %6.2f\n", mathAve);
    printf ("Total   average is %6.2f\n", totalAve);

    return 0;
}
タイトルの通りで入力された値の各平均値を求めます。
↑のはサンプルで出された骨組みに自分で手を加えたものです。
calcAveの中身をいじるのですが、配列の最後を{-1,-1}のダミーにしなさい、というヒントが
いまいち理解できません。
入力例
45 69
68 80
57 75
35 50
60 71
80 74
78 80
32 46
48 56
100 100
出力例
English average is  60.30
Math    average is  70.10
Total   average is  65.20


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


Name: パコネコ  ..入門者(2,720ポイント)   Date: 2010/06/20(日) 23:47   No:54932     
Title: Re:テストの平均値を求める    
>int calcAve(student input[], double *englishAverage,  
>double *mathAverage, double *totalAverage) 
>{??????
これってサブルーチンですよね?
(1つ目)student input[],(2つ目)double *englishAverage,(3つ目)double *mathAverage,(4つ目) double *totalAverage

でメインから4つもらってくるということでしょうか?
でも
>calcAve(students, ????????); 
2つっぽいですよね?
>students english,math; 
このstudentsってどういう意味なんですか?
読んでみると
>&students[i].english, &students[i].math
となっているのでstudentsの配列を.englishバージョンと.mathバージョンがあるということになるんですね
気になってしまったのでどなたか教えていただいてもいいですか?
Appleさん質問答えず質問書いてしまってすいません


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

Name: Apple  ..ぴよぴよ(606ポイント)   Date: 2010/06/20(日) 23:56   No:54933     
Title: Re:テストの平均値を求める    
原文では、
#include <stdio.h>

#define maxStudents 10

????????

int main(void)
{
    ????????;
    double mathAve, engAve, totalAve;
となっていて、ヒントでcalcAveのプロトタイプが
int calcAve(student input[], double *englishAverage, double *mathAverage, double *totalAverage)
であると書いてあったのでそのまま埋めてしまいました。


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

Name: パコネコ  ..入門者(2,863ポイント)   Date: 2010/06/21(月) 00:11   No:54936     
Title: Re:テストの平均値を求める    
/*
int i=0; 
     
    while (i<maxStudents) { 
        if (scanf("%d %d", &students[i].english, &students[i].math) != 2) 
            break; 
        i++; 
    } 
    students[i].english = students[i].math = -1; 
     
    calcAve(students, ????????); 
     
    printf ("English average is %6.2f\n", engAve); 
    printf ("Math    average is %6.2f\n", mathAve); 
    printf ("Total   average is %6.2f\n", totalAve); 

    return 0; 
}
*/
この部分も自分でですか?


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

Name: Apple  ..ぴよぴよ(634ポイント)   Date: 2010/06/21(月) 00:13   No:54937     
Title: Re:テストの平均値を求める    
そこも元々記述されてあった部分なので、変更しなくて良いです。

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

Name: パコネコ  ..入門者(3,106ポイント)   Date: 2010/06/21(月) 00:22   No:54939     
Title: Re:テストの平均値を求める    
そうですか…calcAve(students, ????????); の部分結局1つしか枠がないんですね
4つのデータをもらう準備しているのでやはり考えられるのは
1)
???????の部分で3つ書く
2)
studentsの中に含まれている
3)
そもそも4つではない
というところでしょうか?
これを3つ目の????だとすると
1つめの???はほぼサブルーチンで間違いはないと思います。
2つ目の????は何らかの宣言文ぽいですね
この場合students[i].english, students[i].mathを宣言するんですかね
やり方がわからないのが残念です。
まとめるとこうなるので間違ってないでしょうか?
 


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

Name: fatens  ..中級者(14,049ポイント)   Date: 2010/06/21(月) 00:37   No:54942     
Title: Re:テストの平均値を求める    
おそらく、構造体の配列, typedef, ポインタあたりを使うのだとは思いますが、
一度原文をそのまま提示してみてください。


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

Name: Apple  ..かけだし(1,340ポイント)   Date: 2010/06/21(月) 06:59   No:54951     
Title: Re:テストの平均値を求める    
そのままの文ですと、
#include <stdio.h>

#define maxStudents 10

????????

int main(void)
{
    ????????;
    double mathAve, engAve, totalAve;
    
    int i=0;
    
    while (i<maxStudents) {
        if (scanf("%d %d", &students[i].english, &students[i].math) != 2)
            break;
        i++;
    }
    students[i].english = students[i].math = -1;
    
    calcAve(students, ????????);
    
    printf ("English average is %6.2f\n", engAve);
    printf ("Math    average is %6.2f\n", mathAve);
    printf ("Total   average is %6.2f\n", totalAve);

    return 0;
}
になります。


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

Name: シエル  ..中級者(11,921ポイント)   Date: 2010/06/21(月) 08:03   No:54954     
Title: Re:テストの平均値を求める    
typedef struct {
int english,math;
}DATA;

DATA students[maxStudents]


こんな構造体を作って配列にして、ループさせて入力を行い、
calcAve関数に構造体配列、mathAve, engAve, totalAveのアドレスを渡して、
calcAve側で計算させて、mathAve, engAve, totalAveにそれぞれ値を代入し、
main関数に戻ってきて、そいつを表示するだけ。


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

Name: fatens  ..中級者(14,429ポイント)   Date: 2010/06/21(月) 08:50   No:54955     
Title: Re:テストの平均値を求める    
文章による説明もあったと思うので、それも書いてほしかったのですが、
???????? の部分は好きに書いていいものとして回答します。

1つめの????????
english, mathをメンバに持つ構造体を作り、typedefで名前をstudentとします。
シエルさんはDATAとしていますが、これだと以下のプロトタイプ宣言と合いません。
int calcAve(student input[], double *englishAverage, double *mathAverage, double *totalAverage) 
そして、calcAve 関数の処理を書きます。

2つめの????????
student型で要素数がmaxStudents+1の配列を作ります。
そうしないと
 while (i<maxStudents) {
    if (scanf("%d %d", &students[i].english, &students[i].math) != 2)
        break;
    i++;
}
students[i].english = students[i].math = -1;
この部分でmaxStudents人のデータを入力したとき、
最後で配列の範囲外の要素にアクセスしてしまいます。

3つめの????????はもう回答がありますので省略します。


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

Name: シエル  ..中級者(12,161ポイント)   Date: 2010/06/21(月) 09:07   No:54956     
Title: Re:テストの平均値を求める    
DATA students[maxStudents]って書いてるんですが…

もしかして「students]のsが多いってこと言ってますか?

↓のような文もあったので、studentsかstudentなのかはっきりしてません。
students[i].english = students[i].math = -1; 



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

Name: toyo  ..熟練のプログラマー(49,913ポイント)   Date: 2010/06/21(月) 09:08   No:54957     
Title: Re:テストの平均値を求める    
関数から値を取得するには普通は関数の戻り値を使いますね
ただこの方法ですと値を1個しか受け渡しできません
複数の値を受け取りたい場合はいくつかの方法がありますが(構造体や配列で渡すとか)
一つの方法として関数の引数を使う方法があります
関数の呼び出し側で値受け取り用の変数を用意してその変数のアドレス(ポインタ)を引数にして関数を呼び出します
関数側では引数のポインタに値を入れるだけで呼び出し側でその値が使えるようになります
calcAveのプロトタイプが
int calcAve(student input[], double *englishAverage, double *mathAverage, double *totalAverage) 
なら
    calcAve(students, &engAve, &mathAve, &totalAve);
と呼び出せばよいでしょう



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

Name: シエル  ..中級者(12,218ポイント)   Date: 2010/06/21(月) 09:12   No:54958     
Title: Re:テストの平均値を求める    
あっfatensさんの意味がわかった…
プロトタイプ宣言思いっきり無視してました。。。
確かにDATAじゃだめですね。すいません。。。


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

Name: Apple  ..かけだし(1,495ポイント)   Date: 2010/06/21(月) 20:10   No:55007     
Title: Re:テストの平均値を求める    
1つめの???で、

typedef struct {
int english;
int math;
}student;

int calcAve(student input[], double *englishAverage, 
double *mathAverage, double *totalAverage)
{
まで書きましたが、calcAveの()内に4種類あって3つめの???のように
calcAve(students, ????????); 
と()内が2種類の形になるように作るのが良く分からないです。


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

Name: シエル  ..中級者(13,715ポイント)   Date: 2010/06/21(月) 20:59   No:55012     
Title: Re:テストの平均値を求める    
toyoさんがおっしゃってるように
calcAveのプロトタイプが
int calcAve(student input[], double *englishAverage, double *mathAverage, double *totalAverage) 
なら
    calcAve(students, &engAve, &mathAve, &totalAve);
と呼び出せばよいでしょう。


calcAve(students, ????????);
のように2つの引数だけでこの関数を呼ぶように指示されてるのですか?


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

Name: フリオ  ..プログラマー(32,898ポイント)   Date: 2010/06/21(月) 21:03   No:55013     
Title: Re:テストの平均値を求める    
 
>calcAve(students, ????????);  
>と()内が2種類の形になるように作るのが良く分からないです。
 
 ???...は、ここを文字列で埋めてソースを完成させろ、という意味で、
引数が2つとは限らないのでは?

実際、calcAveの引数は2つじゃないし。
 


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

Name: Apple  ..かけだし(1,531ポイント)   Date: 2010/06/21(月) 21:35   No:55016     
Title: Re:テストの平均値を求める    
確かにプロトタイプに4つある以上、引数は4つですね。

あと、どうしてもcalcAve内の書き方が分からないです…


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

Name: 組木紙織  ..比類無きプログラマー(87,788ポイント)   Date: 2010/06/21(月) 22:29   No:55025     
Title: Re:テストの平均値を求める    
>あと、どうしてもcalcAve内の書き方が分からないです…

処理内容はわかるんですよね。
Cで書き方が分からない部分は日本語で書いて見てください。



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



Name: ムンバ  ..比類無きプログラマー(71,878ポイント)   Date: 2010/06/21(月) 18:36   No:54992       
Title: DXライブラリのChangeWindowMode関数につきまして    
こんにちは。
いつもお世話になります。

今読んでる本のソースに

(略)
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
    if(strcmp(lpC, "-f") != 0) ChangeWindowMode(TRUE);
    if( DxLib_Init() == -1 ) return -1;

(略)

エラーも無く、デバッグできるのですが
今まで、こちらのサイトや本家で見たソースは
ChangeWindowMode(TRUE); のみで通常にプログラムが起動していたのですが
 if(strcmp(lpC, "-f") != 0)
を付ける意味と言うか、本当は付けた方が良いのかどうか?など
解らないので質問させて頂きました。

もし、lpC と -f の値が同じでない時、この関数を実行する。
逆に、同じ時って、どう言う時が考えられるのでしょう?
一応、ブレークポイント付けて lpC を調べてみたのですが
型は char型で、値は 0x00233310 でした。

ご解説頂ける方がいらっしゃいましたら
ご指導の程、宜しくお願い致します。
また、参考サイトをご存知の方がいらっしゃいましたら
ご紹介の程、宜しくお願い致します。


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


Name: シエル  ..中級者(12,448ポイント)   Date: 2010/06/21(月) 18:42   No:54994     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
コマンドライン引数に-fを指定して起動すれば、ウィンドウモードで起動する
ってことだと思われます。

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
↑こいつのLPSTR lpCのことだと思います。

追記:
すいません。逆ですね。-f以外だとウィンドウモードで起動ですね。 編集済み


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

Name: ムンバ  ..比類無きプログラマー(72,252ポイント)   Date: 2010/06/21(月) 20:05   No:55006     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
シエルさん、早速のご解説どうもありがとうございます。

すみません。私の聞き方にまとまりがなく
この質問で何を聞きたいかが解りにくいですね。^^;

if(strcmp(lpC, "-f") != 0)

・ChangeWindowMode(TRUE); の前に
 必要なのか?
 あっても無くてもどっちでもいいのか?
 あった方が安全なのか?
 その他

・strcmp(lpC, "-f") != 0
 上述のソースの通りだと
 lpC と -f が 0 でない場合(strcmpの戻り値が 0 で無い場合)
 ChangeWindowMode関数が実行されますが
 この、strcmp(lpC, "-f") 
 の戻り値が 0 (lpC と -F の辞書式の値が 同じだと戻り値が 0 になると思うのですが )
 になる場合、どういう状況が考えられるのか?

もっと、解りづらくなってしまったでしょうか?^^;
意味の解らない文章などありましたら、修正しますので
ご指摘・ご指導の程、宜しくお願い致します。


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

Name: y  ..初心者(5,788ポイント)   Date: 2010/06/21(月) 20:26   No:55008     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
どう見ても、コマンドライン引数に-fが指定されたときにフルスクリーンで起動する
という処理に見えます(full screenのfだと思います)。

まず、strcmp(lpC, "-f")が何をしているのかを調べてみると良いですよ。
そうすれば必要かどうかわかると思います。

関数については、その名前で調べればいくらでも出てきますよ(^^


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

Name: シエル  ..中級者(13,291ポイント)   Date: 2010/06/21(月) 20:30   No:55009     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
strcmpの関数が何をしているものなのか分かりますでしょうか?
strcmpの戻り値が0になる場合(つまり-f)を指定して起動した場合は、
フルスクリーンモードで起動するということです。


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

Name: シエル  ..中級者(13,469ポイント)   Date: 2010/06/21(月) 20:32   No:55010     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
追記:
すいません。被りました。。。


>ChangeWindowMode(TRUE); の前に 
>必要なのか? 
>あっても無くてもどっちでもいいのか? 
>あった方が安全なのか? 
>その他 
フルスクリーン起動にするかしないのかを、指定するためのものなので
別に無くてもかまわないと思います。
安全であるとかないとかはまったく関係ないと思われます。


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

Name: ムンバ  ..比類無きプログラマー(73,070ポイント)   Date: 2010/06/21(月) 22:28   No:55024 解決!     
Title: Re:DXライブラリのChangeWindowMode関数につきまして    
yさん、シェルさん、ご解説・ご指導ありがとうございます。

>>yさん

<<どう見ても、コマンドライン引数に-fが指定されたときにフルスクリーンで起動する 
<<という処理に見えます(full screenのfだと思います)。

 ありがとうございます!
 yさんとシェルさんの、ご解説を何度も読み返して、理解できました。(涙 ---←修正行---

if(strcmp(lpC, "-f") != 0) ChangeWindowMode(TRUE);

ChangeWindowMode(TRUE);
 ↑今まで、DXライブラリを使ったソースでは、このソースは独立?して1行あって
 if(strcmp(lpC, "-f") != 0)
 が、ChangeWindowMode関数を制御してるソースを、今読んでる本で初めて見たのです。
 最初の疑問は、この制御文の動きでは無く
 このソースが、今後勉強していく上で
 ChangeWindowMode関数を制御する事が必要かどうか?
 疑問に思った次第です。

 この本にも解説は無いし、ネットで検索しても(先週の木曜日から)
 見つからなかったので、こちらで質問させて頂きました。
 本来なら、本家で聞くべき事なのかもしれませんね。
 本家の更新履歴とか、リファレンス
 DXライブラリのヘッダファイルなども調べてみましたが
 私には解りませんでした。

 簡単に言うと
 if(strcmp(lpC, "-f") != 0)があっても無くてもプログラムは動くので
 「今更、何でこんなソースが出てくるんだ?これって必要あるのかな〜?」
 と思って調べてみたら、自力では見当たらない。
 そこで、こちらで質問させて頂きました。
 うまくお伝えできなくて、すみませんでした。(謝

if につきましては
http://www6.airnet.ne.jp/rinoa/programing/wakaranai-c/wakaranai-c.html#015

strcmp につきましては
http://www6.airnet.ne.jp/rinoa/programing/wakaranai-c/wakaranai-c.html#strcmp

ChangeWindowMode につきましては
http://www6.airnet.ne.jp/rinoa/programing/DxLib_kansuu/DxLib_kansuu.htm#ChangeWindowMode

それぞれ、自分なりにまとめてありますので(ほとんどパクリですが^^;)
もし覗かれて、何かご指摘が御座いましたら
お手数ですが再度、ご指導の程、宜しくお願い申し上げます。


>>シェルさん

 何度もお手数をお掛けして大変申し訳御座いませんでした。
 yさんのご解説も含めまして、理解できました。
 (また余計な事言っちゃうと、馬鹿だな!こいつ!って思われそうですが)

<<すいません。逆ですね。-f以外だとウィンドウモードで起動ですね

 いえいえ、こちらこそ。(謝
 このご解説で、最終的に理解できました。
 それと
<<strcmpの戻り値が0になる場合(つまり-f)を指定して起動した場合は、 
<<フルスクリーンモードで起動するということです。
 の、ご解説。
 どうもありがとうございます!

<<strcmpの関数が何をしているものなのか分かりますでしょうか?

strcmp につきましては
http://www6.airnet.ne.jp/rinoa/programing/wakaranai-c/wakaranai-c.html#strcmp

 の様に理解してますが、ご指摘箇所など御座いましたら
 お手数ですが再度、ご指摘頂けます様、宜しくお願い致します。

<<安全であるとかないとかはまったく関係ないと思われます。

 最終的には、お聞きしたかった事はここなのですが
 どうにもうまくお伝えできなくて、すみませんでした。(自爆
 今後も、気をつけます。(_ _)


シェルさん、yさん
 
私が理解できるまで、ご解説頂きましてどうもありがとう御座いました。
また何か御座いましたら宜しくお願い致します。 編集済み


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



Name: DecentLove  ..初心者(5,776ポイント)   Date: 2010/06/21(月) 01:01   No:54944       
Title: 画面サイズ取得    
毎日のようにすみません。
今、時計を制作していまして、ソフトを起動したとき、デスクトップの右下にいつも表示したいと考えました。
しかし、人によってデスクトップの大きさはまちまちで僕のデスクトップのサイズに合わせて設定しても意味がありません。
それで、
最初に表示できる領域のサイズを取得し、そこから時計表示位置を計算してその場所に時計を表示しようと考えました。

そこで、添付した画像のように、黒く塗ったところだけ(下のタスクバー、Vistaの場合はガジェット領域を除いた部分。)画面のサイズを取得したいのです。
ちなみに、ゲームプログラミングの館のサイトの画像を塗りつぶしたのには悪意はありません。誤解を招くと困るので、先に断っておきます。

さて、自分でできるだけしらべた結果。
GetSystemMetrics関数を使用するということが分かりましたが、いまいちよくわかりません。
    
    // デスクトップ領域サイズの高さを取得
    int nHeight = GetSystemMetrics( SM_CYSCREEN );
    DrawFormatString(0,0,GetColor(125,125,125),"%d",nHeight);

で結果がどうなったか確認しようとしたのですが、画面に文字が描画されずに結果が分かりません。
もし、関数の使い方が違っていたり、考え方自体が根本的に違っていたらご指摘ください。

よろしくお願いします。
なお、返信が明日になってしまうことをあらかじめ断っておきます。


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


Name: シエル  ..中級者(11,924ポイント)   Date: 2010/06/21(月) 07:31   No:54952     
Title: Re:画面サイズ取得    
関数の使い方はあっていると思います
実際にコピペして、ウィンドウの左上に文字が表示されました。

ですが、タスクバーを除いた高さではなく、画面全体の高さが取得されていると思います。
タスクバーの長さを取得する方法は…分かりません…


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

Name: shiro4ao  ..初心者(6,221ポイント)   Date: 2010/06/21(月) 14:49   No:54978     
Title: Re:画面サイズ取得    
タスクバーの大きさは以下のようにして取得できるようです。
目的が間違っていたらすみません。

==============GetTaskBarRect.cpp========================
#include <stdio.h>
#include <windows.h>
int main() 
{
    HWND hWndTaskBar;
    RECT rc;
    int x,y;

    //タスクバーのウィンドウハンドルを探してくる
    hWndTaskBar = FindWindow("Shell_TrayWnd", NULL);

    //タスクバーの領域の大きさをもらい、計算する
    GetClientRect(hWndTaskBar, &rc);
    x = rc.right - rc.left;
    y = rc.bottom - rc.top;

    //表示する
    printf("x座標ー>%d     y座標ー>%d",x,y);
    return 0;
}
===============ここまで===================================

もっとエレガントな方法があるかもしれません・・・・

追記:よく考えたら、タスクバーがいろいろな場所にあったり自動で隠
   すようになっていたら、タスクバーの位置も考慮に入れる必要が
   ありそうです。 編集済み


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

Name: シエル  ..中級者(12,387ポイント)   Date: 2010/06/21(月) 14:58   No:54980     
Title: Re:画面サイズ取得    
タスクバーのウィンドウクラス名って「Shell_TrayWnd」なんですね。
勉強になりました。

>>DecentLoveさん
GetSystemMetrics( SM_CYSCREEN)から、上記のようにタスクバーの高さを求めて引けば、
タスクバーを除いた高さが取得できると思いますよ。


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

Name: DecentLove  ..初心者(5,934ポイント)   Date: 2010/06/21(月) 18:55   No:54998     
Title: Re:画面サイズ取得    
シエルさん。shiro4aoさん。
ありがとうございます!

さっそくshiro4aoさんにいただいたソースを使って試しに計算したサイズを表示させてみたところ。

 //タスクバーの領域の大きさをもらい、計算する
    GetClientRect(hWndTaskBar, &rc);
    x = rc.right - rc.left;
    y = rc.bottom - rc.top; 
  
  〜〜〜〜〜中略〜〜〜〜〜
    
    DrawFormatString(0,0,GetColor(125,125,125),"%d テスト。横:縦 %d",x,y);


として、実行してみました。ちなみにDx_Libを使用しているのでDrawFormatStringで描画しました。
そしたら、僕のディスプレイの解像度は1440*900なのですが、横(x)は「1440」と縦(y)は何故か「40」としか表示されませんでした。
なぜだかわかりますでしょうか?

それと僕はまだプログラミングには疎く、素人なので
 HWND hWndTaskBar;
    RECT rc;
    int x,y;

    //タスクバーのウィンドウハンドルを探してくる
    hWndTaskBar = FindWindow("Shell_TrayWnd", NULL);

    //タスクバーの領域の大きさをもらい、計算する
    GetClientRect(hWndTaskBar, &rc);
    x = rc.right - rc.left;
    y = rc.bottom - rc.top;
;

の辺りがいまいちよくわかりません。
解説していただければ幸いです。

わがままばかり申し訳ありません。
よろしくお願いします。


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

Name: シエル  ..中級者(13,201ポイント)   Date: 2010/06/21(月) 19:15   No:55001     
Title: Re:画面サイズ取得    
>>そしたら、僕のディスプレイの解像度は1440*900なのですが、横(x)は「1440」と縦(y)は何故か「40」としか
>>表示されませんでした。
正しいのでは?
「タスクバー」の横の長さは1440で、縦は40ぐらいだと思われますが。
shiro4aoさんが提示してくださったソースは、タスクバーの長さを求めているので間違いないと思います。

それと、

HWNDという型はウィンドウハンドルと呼ばれる型で、
ウィンドウ一つ一つにある、ウィンドウそれぞれを識別するための番号みたいなものです。

それを↓のFindWindow(ウインドウクラス名、ウインドウテキスト)という関数を使用して、
引数に指定したウインドウクラス名とウィンドウテキストのペアの
ウィンドウを探してきて、そのウィンドウハンドルを変数に入れてます。
hWndTaskBar=FindWindow("Shell_TrayWnd", NULL)

GetClientRect(ウィンドウハンドル, RECT構造体のポインタ)関数を使って、
そのウィンドウのクライアント領域の大きさをRECT構造体に格納します。

そして、↓の計算で実際の横の長さと縦の長さを求めてます。
x = rc.right - rc.left; 
y = rc.bottom - rc.top;

超大雑把に説明するとこんな感じです。

これらはWindowsAPIの関数です。
私は下記のサイトで勉強しました。参考にしてみてください。
全部やるとしんどいので、必要なところだけでいいです><
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html

追記:
WindowsAPIを勉強すると、DXライブラリを使うよりも細かい制御がしやすくなりますが、
ちょっと難しいかもしれないので、無理に勉強しなくてもいいですよ。


 編集済み


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

Name: DecentLove  ..初心者(6,037ポイント)   Date: 2010/06/21(月) 22:14   No:55021 解決!     
Title: Re:画面サイズ取得    
シエルさん。
ありがとうございます。
なるほど。タスクバーの方を求めていたんですね。
では、取得した値の中に縦サイズ(900px)があってそこから40px引くような感じのソースを組めばいいのですね。

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

では、これにて解決としたいと思います。
ありがとうございました。

APIについては、随時自分のしたいことに合わせて学んでいこうと思います。
そのかていで、わからないことなどをまた、ココで機構と思います。
有難うございました。


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



Name: るー  ..入門者(4,127ポイント)   Date: 2010/06/21(月) 15:45   No:54986       
Title: DirectXでのセーブデータの作り方    
ゲームプログラミングの館のミニテクニック編にセーブデータの作り方が載っていますが、
これはDirectXでも通じるやり方なのでしょうか?


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


Name: TKOZ  ..熟練のプログラマー(63,934ポイント)   Date: 2010/06/21(月) 18:47   No:54995     
Title: Re:DirectXでのセーブデータの作り方    
fopen,fread,fwriteなどはC言語の標準ライブラリ関数を使っているので、
使えると思います。


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

Name: シエル  ..中級者(12,513ポイント)   Date: 2010/06/21(月) 18:50   No:54996     
Title: Re:DirectXでのセーブデータの作り方    
あれはC言語の関数ですので、使えます。
DirectXでも使えるというか、DirectXを使用したプログラムでも使えますという表現かな。


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

Name: るー  ..入門者(4,137ポイント)   Date: 2010/06/21(月) 19:50   No:55004 解決!     
Title: Re:DirectXでのセーブデータの作り方    
返信ありがとうございます。
さっそくやってみます。


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



Name: MUN  ..かけだし(1,201ポイント)   Date: 2010/06/21(月) 16:30   No:54990       
Title: NTPサーバから時刻を取得する    
毎度すみません。

VC++のアンマネージドで作成しています。

NTPサーバから時刻を取得するため、
NetRemoteTOD関数を使ってみようと思ったのですが、
サーバへ接続出来ずタイムアウトしているのです。
C#.NETで試したところ、サーバにアクセスする事が出来たので、
関数コールの方法が良くないのだと思うのですが、
ご指摘や解決策をご教授頂けると助かります。

※サーバ名は「*」で隠しています。
WCHAR serverName[] = { '*', '*', '*', '.', '*', '*', '*', '*', '.', '*', '*' };
LPTIME_OF_DAY_INFO pBuf = NULL;
NET_API_STATUS nStatus = ::NetRemoteTOD(serverName, (LPBYTE *)&pBuf);
if(nStatus == NERR_Success)
{
    if(pBuf != NULL)
    {
        char d[1024];
        sprintf(d, "%d/%d/%d %d:%d:%d", pBuf->tod_month, pBuf->tod_day, pBuf->tod_year, pBuf->tod_hours, pBuf->tod_mins, pBuf->tod_secs);
        ::MessageBox(NULL, d, "", MB_OK);
    }
}


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


Name: シエル  ..中級者(12,733ポイント)   Date: 2010/06/21(月) 19:01   No:54999     
Title: Re:NTPサーバから時刻を取得する    
MSDNを見ると、第一引数の先頭は[\\]でないと駄目となってますが、関係ありますかね?

=====================================================================================================
UncServerName
この関数を実行するリモートサーバーの名前を表す、Unicode 文字列へのポインタを指定します。この文字列の先頭は "\\" でなければなりません。このパラメータが NULL の場合、ローカルコンピュータを使います。
=====================================================================================================


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



Name: MUN  ..ぴよぴよ(35ポイント)   Date: 2010/06/20(日) 00:21   No:54836       
Title: DLLで呼び出し元のウィンドウハンドルを取得したい    
VC++2008にてアンマネージドのDLLを作成しているのですが、
行き詰ってしまったので御教授下さい。

DLL側で呼び出しもとのウィンドウハンドル(HWND)を取得したいのですが、
取得で出来ずに悩んでいます。
事情により、引数にウィンドウハンドルを貰う事ができないため、どうして良いか悩んでます。
というのもDllMainで取得する必要があるからです。
呼び出し元がウィンドウであり、プロセスアタッチ時に呼び出し元のウィンドウハンドルを取得したいと考えて射ます。 編集済み


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


Name: へろり  ..中級者(11,909ポイント)   Date: 2010/06/20(日) 06:19   No:54855     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
ずばっと出来るスマートな方法はないはずです。

EnumWindows()とか、FindWindow()とかでウィンドウハンドルを列挙したあと、GetWindowThreadProcessID()あたりで、呼び出し側のプロセスID等を比較して探し出すしかないかと思われます。

どういう使われ方をするDLLなのか解りませんが、初期化関数でも定義して、その関数に引数として与え、記憶させておくのが一番スマートな気がします。


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

Name: シエル  ..中級者(11,303ポイント)   Date: 2010/06/20(日) 08:36   No:54859     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
呼び出し側からウィンドウハンドルをファイルに特定の名前で書き出し、
DLL側でそれを呼んで取得するしか思いつきません。


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

Name: MUN  ..ぴよぴよ(800ポイント)   Date: 2010/06/20(日) 22:49   No:54925     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
返信有難う御座います。

> EnumWindows()とか、FindWindow()とかでウィンドウハンドルを列挙したあと、GetWindowThreadProcessID()あたりで、呼び出し側のプロセスID等を比較して探し出すしかないかと思われます。 
何も書かないですみませんでした。
私もそう思って色々試してみました。
下記コードであればEnumProcessModulesまでは成功しますが、モジュール名が取得で失敗する様です。
取得したいウィンドウハンドルのアプリは既に出来上がったものでして、何も出来ないのが現状です。

何をしたいのかともうしますと、呼び出し元のタイトルバーのTEXTを取得したいのです。
しかしながら、複数インストールが可能で、複数起動するWindowアプリケーションのため、
このDLLが呼ばれた際に呼び出し元のアプリケーションが分かればと思ったのです。

下記コードでやりたい事は、呼び出し元のEXEのPATHとDLLのPATHを比較して特定しようと考えているものです。
GetModuleFileNameExで失敗するため、EXEのPATHと比較できずにいます。
ご教授御願いします。

char g_mName[MAX_PATH];
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    //クラス名取得
    char name[1024];
    ::GetClassNameA(hWnd, name, sizeof(name));
    if(::strcmp("アプリケーションクラス名", name) != 0)
    {
        return TRUE;
    }

    //プロセスID取得
    DWORD pid = 0;
    ::GetWindowThreadProcessId(hWnd, &pid);
    if(pid == 0)
    {
        return TRUE;
    }

    //プロセスハンドル取得
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if(hProcess == 0)
    {
        return TRUE;
    }

    //プロセス内のモジュールのハンドルリストを取得
    DWORD size = 0;
    HMODULE hModule[1024];
    if(::EnumProcessModules(hProcess, hModule, sizeof(hModule), &size) == 0)
    {
        return TRUE;
    }

    //モジュール名取得
    int len = 0;
    char path[MAX_PATH];
    if(::GetModuleFileNameEx(hProcess, hModule[0], path, len) == 0)
    {
        ::MessageBoxA(NULL, "GetModuleFileNameEx NG", "", MB_OK);
        return TRUE;
    }
    ::MessageBoxA(NULL, path, "", MB_OK);

         //モジュール(又はEXEのPATH)とDLLのPAYHを比較する。
    return TRUE;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            ::GetModuleFileName(hModule, g_mName, MAX_PATH);
            ::EnumWindows(EnumWindowsProc, NULL);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }

    return(TRUE);
編集済み


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

Name: MUN  ..ぴよぴよ(824ポイント)   Date: 2010/06/20(日) 23:30   No:54930 解決!     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
GetModuleFileNameExで最後引数で0を指定していたのが原因でした^^;

有難う御座いました。


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

Name: YuO  ..熟練のプログラマー(46,259ポイント)   Date: 2010/06/21(月) 00:05   No:54935     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
解決となっていますが,なんだか大回りしているようなので……。


EnumWindows + GetWindowThreadProcessId + GetCurrentProcessId
で終わる話ではありませんか。

> //プロセスハンドル取得
から
> //モジュール(又はEXEのPATH)とDLLのPAYHを比較する。
までが全て削除し,
pidと::GetCurrentProcessId()が等しいものを探せば良くなります。

MSDN: GetCurrentProcessId Function (Windows)
http://msdn.microsoft.com/en-us/library/ms683180.aspx


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

Name: MUN  ..ぴよぴよ(863ポイント)   Date: 2010/06/21(月) 16:22   No:54989     
Title: Re:DLLで呼び出し元のウィンドウハンドルを取得したい    
YuOさん>

返信ありがとうございます。

ご指摘の通り思った事が出来ました!
有難う御座いました。


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



Name: shiro4ao  ..初心者(6,523ポイント)   Date: 2010/06/21(月) 15:18   No:54981       
Title: Cはもう時代遅れなのでしょうか    
最近C#に少し触れました。
ウィンドウアプリケーションも、簡単にできて、必要な部分だけに
集中でき、生産性の高さに驚きました。
知り合い曰く、「C#は強力だから早くこちらにおいでよ」とのことです。
しかし、オブジェクト指向に馴染めず、なんだかおまじないを唱えて(書き込んで)
いるような違和感がありました。
(一時期、C++の勉強もしていたのですが、いざ書こうとなると手が進まなくなってしまい
挫折しました。)

CからC#に乗り換えるべきでしょうか?
C#にはない良い点はCにあるのでしょうか?


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


Name: Dixq (管理人)  ..ウィザード(1,224,670ポイント)   Date: 2010/06/21(月) 15:28   No:54982     
Title: Re:Cはもう時代遅れなのでしょうか    
時代遅れというか、言語を学ぶための基礎学習だと思えばいいのではないでしょうか?

乗り換えるという認識ではなく、新しく使える言語を増やして可能性を広げると思ったらいいと思います。
別にCが使えなくなるわけではないのですから
C#は簡単にGUIが作れますし、XNAがあるので本格的なゲーム製作も可能です。
短所を言えばCほど参考文献が無いことや、プラットフォームがwindowsのみに限られる事などがあるでしょうが、
非常に魅力的な言語だと思いますよ。

そういえばC#でiphoneアプリを作ったという記事をどこかで見たような…。


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

Name: バグ  ..ハッカー(197,948ポイント)   Date: 2010/06/21(月) 15:37   No:54983     
Title: Re:Cはもう時代遅れなのでしょうか    
どのようなものを開発するかにもよるのではないかと思います。
どちらの言語にも一長一短で良いところも悪いところもありますし…
どちらかの言語でしかやれない事ってのは、少ないと思いますよ。

個人的な感想ですが、Cはパーツからオーダーメイドで全てを自分好みに作り上げていく感じで、C#(.Net)は出来合いのパーツを組み合わせたり、カスタマイズしていきながら理想に近付けていく感じだと思っています。



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

Name: バグ  ..ハッカー(198,014ポイント)   Date: 2010/06/21(月) 15:39   No:54984     
Title: Re:Cはもう時代遅れなのでしょうか    
>>管理人さん

最近(でもないか…)はこんなのもあるようですよ。

http://ja.wikipedia.org/wiki/Mono_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)


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

Name: 御津凪 [URL]  ..ハッカー(142,754ポイント)   Date: 2010/06/21(月) 15:43   No:54985     
Title: Re:Cはもう時代遅れなのでしょうか    
C は昔も今も Windows や Linux 等の OS を動かしている言語です。
時代遅れというわけではありませんよ。

どの言語も得手・不得手があります。
C# には C にはない得意とする分野がありますし、
C でしか出来ない分野もあります。

そもそも C# で作ったアプリが動かしているのは C のコードです(C++ や アセンブラも含む)。

> Dixq さん
> そういえばC#でiphoneアプリを作ったという記事をどこかで見たような…。

以前 iphone アプリの開発環境を一つに(Mac OS X のXccodeのみに)制限するという出来事がありましたが、
先月下旬あたりに Visual Studio で公式に開発できるのではとの噂が立ったりもしましたね。
(真相は知りませんが)


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

Name: shiro4ao  ..初心者(6,336ポイント)   Date: 2010/06/21(月) 15:46   No:54987 解決!     
Title: Re:Cはもう時代遅れなのでしょうか    
ご回答ありがとうございます。
確かにCはC++やjava(?),C#にも影響を与えているので使える言語を増やしやすい
気がします。インターフェースだけC#でつくって面倒そうな処理はCのdllを使うなど
出来そうです…(初心者なのでCのdllがないと困るような処理を書いたことはないのですが…)
C#も、配布時には.NET FrameWork を要求してくるので一長一短のような気もします。

とはいえ、使い分けができればベストなので、ひとつに凝り固まらず
少しづつ勉強していこうとおもいます。


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

Name: 天空橋  ..かけだし(1,655ポイント)   Date: 2010/06/21(月) 15:54   No:54988     
Title: Re:Cはもう時代遅れなのでしょうか    
私もDixq様と同様の考えです。

CとC#は求められる場面が違います。
生産性の高さで言うと間違いなく、C#に軍配があがると思います。
ただ、メモリ管理が詳細に出来たり、Nativeなものを操作したりとC言語にしか出来ないこともあります。

それと、若干Dixq様の説明に、補足さしていただきます。

iPhoneアプリの開発はNovelが出しているMono Touchを使えば、C#でも可能かと思います。

http://monotouch.net/

ただ、Appleは、主にAdobe Flashの締め出しを行うために、開発規約に「Objective-C以外の言語で記述されたコードを変換して実行ファイルを作ることを禁止する」を加えたため、Novelは問題ないと言っているが、いつ、利用できなくなるかわからない状態です。

また、Novelを中心としたオープンソースコミュニティが、Linux、MacOSなどのWindowsプラットフォーム以外の環境で.Net Frameworkが動作するように、CLRと互換性のあるMono VMを提供しています。
このMono VMを利用すると、Javaのように、様々なプラットフォーム上で、.Netのアプリを動作させることが出来ます。



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



Name: sun  ..ぴよぴよ(395ポイント)   Date: 2010/06/21(月) 14:12   No:54974       
Title: ボス撃破後クリア画像を出すにはどうするの?    
龍神録47章まで出来たのですが2回目のボス戦後クリア画像を出したいのですがどうしたら良いのでしょうか?


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


Name: シエル  ..中級者(12,295ポイント)   Date: 2010/06/21(月) 14:16   No:54975     
Title: Re:ボス撃破後クリア画像を出すにはどうするの?    
クリア画像を描画するだけですが…
47章までやったのであれば、今までの技術で何とかできませんか?
もう少し、具体的な質問でないとこれぐらいしか答えようがありません。。。


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

Name: sun  ..ぴよぴよ(429ポイント)   Date: 2010/06/21(月) 14:54   No:54979 解決!     
Title: Re:ボス撃破後クリア画像を出すにはどうするの?    
返信遅れてすみません
なんとか出来ました。御手数お掛けしましてすみませんでした。


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



Name: 中村  ..ぴよぴよ(33ポイント)   Date: 2010/06/21(月) 13:08   No:54969       
Title: イニシャルによって選び出す(例題)    
はじめまして、お世話に様になります。C言語BorlandC++コンパイラを使用しています。
C言の学習は6ヶ月位です。下記内容の例題をコンパイルしますと、

警告 W8068 sinko.c 11: 比較において定数が範囲外(関数 main)
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland  と表示されます。exe ファイル作成を行っても c:\mysrc> が帰ってくるだけです。警告文中 11; 比較において定数が範囲外 (関数 main)の意味が理解できません。”定数が範囲外”の意味と本文の訂正の仕方が分かりましたら教えてください。

参照例題:

#include <stdio.h>
void main()

{
    char *namae[]={"コバヤシヨシヒコ", "オクヤマケイゾウ", "モリヤマカンジ", "オオエタカシ",};
    int kaisuu;
    for (kaisuu=0; kaisuu<4; kaisuu++)
         if (namae[kaisuu] [0] =='オ')
         printf("イニシャル「オ」=%s\", namae[kaisuu]);

}
本では実行結果は イニシャル「オ」= オクヤマケイゾウ
         イニシャル「オ」= オオエタカシ と書いてあります。





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


Name: へろり  ..中級者(13,070ポイント)   Date: 2010/06/21(月) 13:16   No:54971     
Title: Re:イニシャルによって選び出す(例題)    
 printf("イニシャル「オ」=%s\", namae[kaisuu]); 
において、第一引数に与えられている文字列定数が閉じられていません。

"イニシャル「オ」=%s\"" とするか、"イニシャル「オ」=%s" としてください。


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

Name: toyo  ..熟練のプログラマー(50,004ポイント)   Date: 2010/06/21(月) 13:57   No:54973     
Title: Re:イニシャルによって選び出す(例題)    
警告の意味は
 if (namae[kaisuu] [0] =='オ') 
において char 型の変数 namae[ ][ ]との比較に char型で表現できる範囲を超えた定数値 'オ' (0x4983)を使用しているという意味です
シフトジス限定ということなら
if (namae[kaisuu][0] == (char)0x83 && namae[kaisuu][1] == 0x49)
でしょうか


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

Name: toyo  ..熟練のプログラマー(50,192ポイント)   Date: 2010/06/21(月) 14:34   No:54976     
Title: Re:イニシャルによって選び出す(例題)    
>本では実行結果は イニシャル「オ」= オクヤマケイゾウ
>         イニシャル「オ」= オオエタカシ と書いてあります。
本では半角カナを使っているのかもしれません(Shift JIS限定は変わりないですが)
#include <stdio.h>
void main()
{
    char *namae[]={"コバヤシヨシヒコ", "オクヤマケイゾウ", "モリヤマカンジ", "オオエタカシ",};
    int kaisuu;
    for (kaisuu=0; kaisuu<4; kaisuu++)
        if (namae[kaisuu][0] == 'オ')
            printf("イニシャル「オ」=%s\n", namae[kaisuu]);

}


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

Name: toyo  ..熟練のプログラマー(50,245ポイント)   Date: 2010/06/21(月) 14:36   No:54977     
Title: Re:イニシャルによって選び出す(例題)    
ここは自動的に半角カナが全角カタカナに変換されてしまうみたいですね
上の投稿のカタカナは半角カナで投稿したものです


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



Name: 爺プログラマー  ..ぴよぴよ(290ポイント)   Date: 2010/06/21(月) 10:15   No:54959       
Title: コンボボックスについて    
複数のアイテム(項目)が切れないように高さを設定しているのですが・・・

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
X, Y, X_Size, CBS_NOINTEGRALHEIGHT,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

上記のように記述すると、全てのリストが表示されます。

しかし、下記のようにすると、リストが開きません。

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT,
X, Y, X_Size, 0,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);


CBS_NOINTEGRALHEIGHTはスタイルの指定のはずですが原因を教えてください。


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


Name: へろり  ..中級者(12,484ポイント)   Date: 2010/06/21(月) 10:26   No:54960     
Title: Re:コンボボックスについて    
>CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT, 
X, Y, X_Size, 0, 
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL); 


第8引数が0になってますね。 これはウィンドウの高さです。 コンボボックスの場合は、リストを開いたときの総合的な高さになります。

また、CBS_NOINTEGRALHEIGHTの定義は
#define CBS_NOINTEGRALHEIGHT  0x0400Lとなっています。 リストの件数が何件かは知りませんが、おそらくは0x400Lという数値は、すべてのリストを表示するに十分な高さなのでしょう。

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST, 
X, Y, X_Size, CBS_NOINTEGRALHEIGHT, 
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL); 

というコードでは、コンボボックスの高さに0x400Lと指定しています。


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

Name: 爺プログラマー  ..ぴよぴよ(478ポイント)   Date: 2010/06/21(月) 10:45   No:54961     
Title: Re:コンボボックスについて    
早速の回答ありがとうございます。
CBS_NOINTEGRALHEIGHTは機能指定ではなく単なる数値に過ぎなかったのですね?
でもCBS_NOINTEGRALHEIGHTはスタイル指定の項目に記述するはずですが今回の私の様にここに記述するのは一般的ではないとおいます。

逆にCBS_NOINTEGRALHEIGHTはスタイル指定の場所に記述するだけでは何の意味も持たないと考えますが?
間違っているでしょうか?
見解をお願いします。


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

Name: へろり  ..中級者(12,799ポイント)   Date: 2010/06/21(月) 11:14   No:54962     
Title: Re:コンボボックスについて    
>CBS_NOINTEGRALHEIGHTは機能指定ではなく単なる数値に過ぎなかったのですね? 

その数値を使い機能等を指定します。


>でもCBS_NOINTEGRALHEIGHTはスタイル指定の項目に記述するはずですが今回の私の様にここに記述するのは一般的ではないとおいます。 

もちろんその通りです。 ですが、スタイル指定に0x400などと書いても、0x400というのがどんな機能だかスタイルだか解りませんね? だから、#define でわかりやすい名前を与えています。
可読性の問題です。



>逆にCBS_NOINTEGRALHEIGHTはスタイル指定の場所に記述するだけでは何の意味も持たないと考えますが? 
>間違っているでしょうか? 
>見解をお願いします。 


とりあえず、

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT,  
X, Y, X_Size, 1000,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);  

と、

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,  
X, Y, X_Size, 1000,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);  

とした場合の違いを見てみてください。
上記の違いは第4引数にCBS_NOINTEGRALHEIGHTを指定しているかしていないかの違いだけです。


追記:
何を言ってるんでしょうね私。 1000なんて数値がどこから出てきたのか自分でも謎です。
50あたりから100ぐらいまでの間を5刻みで少しずつ見ていってください。
CBS_NOINTEGRALHEIGHTを指定した場合としない場合の違いは一目瞭然です。 編集済み


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

Name: 爺プログラマー  ..ぴよぴよ(552ポイント)   Date: 2010/06/21(月) 11:58   No:54964     
Title: Re:コンボボックスについて    
丁寧にありがとうございます。
CBS_NOINTEGRALHEIGHTがある場合が行の半分でも表示されますが無ければ切り捨てられているようです。
やはり高さ指定が絶対的意味を持つようです。
とりあえず、デスクトップの縦の長さを指定しておきます。


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



Name: shuto  ..ぴよぴよ(760ポイント)   Date: 2010/06/20(日) 15:37   No:54884       
Title: Dxlibでの3dモデルの表示    
はじめまして shutoと申します。C言語は二年前から授業で扱っていて
入門書に書いてあるようなことは理解できていますが3Dの知識をあまり持っていません。
ベクトルについては授業でベクトル解析を習い、
gradやdiv、rotなどが出ていますがふつうに理解できています。
(そんな知識はこの話ではいらない気もしますが一応空間ベクトルの話なので)

自宅のwindowsVistaにインストールしたVC2008で色々試していたところ
自分ではどうすべきか判断に困ったので質問します。


DXライブラリをつかって3Dモデルの表示をしようとして
MV1LoadModel でメタセコイアで作成したxファイルのモデルを読み込み、
SetCameraPositionAndTarget_UpVecY でカメラを調整して
MV1DrawModel でモデルを表示しました。

コンパイル時にエラーは無く普通に動作しモデルの表示もされるのですが、
モデルの位置ベクトルを
SetCameraPositionAndTarget_UpVecY に与える引数の
引数1 VECTOR Position : カメラの位置 を VGet( 0.0f, 2000.0f, 0.0f )
引数2 VECTOR Target : カメラの注視点 を VGet( 0.0f, 0.0f, 0,0f )
にして、真上からカメラを向けるとモデルが表示されませんでした。
引数2をVGet( 1.0f, 2000.0f, 0,0f )にして、ほんの少しずらすと正しく表示されました。


原因を予想するとカメラを真下に向けるとカメラの上下がおかしくなっているんだと思うのですが、
もしかして自分だけこの状況になるのかもしれないと思い質問しました。

原因がしっかりわかる方・考えてくれる方が居ましたら教えてほしいです。
それと3Dゲーム内では真上からの視点で操作するということもあると思うので
これが正しい動作なのであればどう対処するのがよいのか教えてほしいです。



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


Name: shuto  ..かけだし(1,001ポイント)   Date: 2010/06/20(日) 16:17   No:54890     
Title: Re:Dxlibでの3dモデルの表示    
すみません、xファイルじゃなくてmqoファイルでした。
しかし、やっぱり表示できない現象は起こるので
同じ現象が起こるコードを載せます。



#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode( TRUE ) ;
        if( DxLib_Init() == -1 ) return -1;

    int        ModelHandle = MV1LoadModel( "../stage1.mqo" );
    VECTOR        Camera = VGet( 0.0f, 2000.0f, 0.0f );

    
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
    {
        ClearDrawScreen() ;

        if( CheckHitKey( KEY_INPUT_UP ) == 1 ){
            Camera.x += 1.0f ;
        }
        if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ){
            Camera.x -= 1.0f ;
        }



        SetCameraPositionAndTarget_UpVecY( Camera, VGet( 0.0f, 0.0f, 0.0f ) );


        MV1DrawModel( ModelHandle );

        DrawFormatString( 0, 0, GetColor(0,0,255),"Camera.x = %f",Camera.x) ;

        ScreenFlip();
    }

    // DXライブラリの後始末
    DxLib_End() ;

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


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

Name: Justy  ..伝説なるハッカー(547,875ポイント)   Date: 2010/06/20(日) 17:47   No:54901     
Title: Re:Dxlibでの3dモデルの表示    
 その関数を使って真下に向けると内部でビュー行列の計算が破綻します。
 
 SetCameraPositionAndTarget_UpVecY関数は SetCameraPositionAndTargetAndUpVec関数の
第三引数の上方ベクトル指定を [0, 1, 0]としたもの、つまりカメラの上方向がワールドのY軸の方向に
あることを前提とした関数だからです。


 例えば通常カメラが真正面を向いているとき、カメラの向き(カメラベクトル)は [0, 0, 1]、
カメラの上の方向(上方ベクトル)は [0, 1, 0]になっているはずです。
 当然向いている向きとカメラの上方向の向きは異なりますし、直行しています。
 
 しかしカメラを下を向ける時に SetCameraPositionAndTarget_UpVecYを使ってしまうと
カメラベクトルが [0, -1, 0]、上方ベクトルは [0, 1, 0]となり完全に正反対の方向を向いてしまいます。
 内部的には指定した上方ベクトルを補正して最終的な上方ベクトルを計算しているのですが
カメラベクトルと同じ方向や 180度反対の方向を指しているとその計算に失敗し、破綻してしまうというわけです。

 従って、改善方法としては

・ SetCameraPositionAndTargetAndUpVecを使って(ある程度)正しい上向きのベクトルを指定する
 例)SetCameraPositionAndTargetAndUpVec( Camera, VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 0.0f, 1.0f ) ); 

・ SetCameraPositionAndAngleを使う
 例)SetCameraPositionAndAngle( Camera, PHI_F/2, 0, 0 ); 

・ SetCameraViewMatrixを使う
 自前でビュー行列を計算して設定します。

あたりがいいかと思います。


 ちなみに SetCameraPositionAndTarget_UpVecY関数の内部処理を再現したコードを載せておきます。
 最終的に CreateLookAtMatrixでビュー行列を求めて matCamera変数に代入しています。
 引数 posや targetにいろいろな値を入れて、どう破綻しているか調べて見るといいでしょう。

int SetCameraPositionAndTarget_UpVecY_(VECTOR pos, VECTOR target)
{
    VECTOR vecAt, vecRight, vecUp = { 0.0f, 1.0f, 0.0f };
    VectorSub(&vecAt, &target, &pos);
    VectorOuterProduct(&vecRight, &vecAt, &vecUp);
    VectorOuterProduct(&vecUp, &vecRight, &vecAt);
    VectorNormalize(&vecUp, &vecUp);
    
    MATRIX matCamera ;
    CreateLookAtMatrix(&matCamera, &pos, &target, &vecUp);
    
    SetTransformToView(&matCamera);
    return 0;
}



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

Name: shuto  ..かけだし(1,253ポイント)   Date: 2010/06/21(月) 01:37   No:54946 解決!     
Title: Re:Dxlibでの3dモデルの表示    
なるほど・・・Justyさん解説ありがとうございました。
おかしくなってしまう理由が自分なりに十分理解できました。

確かにカメラの上をY軸にしてしまうとカメラを下向きにしたときにおかしくなってしまいますね。
よく考えればカメラに対してカメラの座標と注視点の二つしか無ければカメラの捻りが作りでせなく
さらにカメラを真上・真下に向ければカメラの捻りがないと写せませんね。
自分をカメラにして上向いたり(物理的な意味で)頭ひねったりして考えてました。


自分のプログラムではSetCameraPositionAndTargetAndUpVecを通常では使い
視点が完全には対象の真上・真下に行かないようにし、
真上からの視点のときはSetCameraPositionAndAngleを使おうと思います。

自分はまだまだ3Dの知識や考え方などに慣れていないので
また質問することがありそうですがその時はまたよろしくお願いします。

では、これで解決とさせていただきます。ありがとうございました。


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



Name: team f  ..ぴよぴよ(151ポイント)   Date: 2010/06/20(日) 00:10   No:54831       
Title: max の出し方    
maxを出したいのですが、終了に-999を入力をするようにしています。その-999がデーターとして数えれております。よろしくお願いします。


#include<stdio.h>
main(void)
{
    float cm,kg,m,bmi,max;
    int nin;
    cm=kg=nin=0;
    max=-100;
        
    printf("身長(cm)と体重を入力してください。\n");
    while (cm=999,kg=999){
    
        scanf("%f  %f",&cm , &kg);
        nin ++;
        if(cm>max) {
            max=cm;
        }
    if(cm == -999,kg == -999) 
                    break;             /*-999で終了 */
    m=cm/100.0 ;       /* Mに変換 */
    bmi=kg / m / m;    /* BMIの計算 */
    
    
    printf("身長%5.1f ",cm);
    printf("体重%5.1f ",kg);
    printf("BMI値%7.1f",bmi );
    
    
    if(bmi>=25)
        printf("肥満です。\n");
        
    if(bmi<18.5)
        printf("低体重です。\n");
    
    if(bmi <25 && bmi>=18.5)
        printf("**.* \n");
        }
        
    printf("総人数%d\n",nin-1);
    printf("最大身長%f",cm);
    
    return 0;
}    
 


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


Name: パコネコ  ..かけだし(2,054ポイント)   Date: 2010/06/20(日) 00:20   No:54834     
Title: Re:max の出し方    
      scanf("%f  %f",&cm , &kg); 
        nin ++; 
        if(cm>max) { 
            max=cm; 
        } 
    if(cm == -999,kg == -999)  
                break;             /*-999で終了 */ 
scanfでcmとkgに入れてますからですね
めんどうだけどなんかの変数に先に値を入れてそれがー999出ないならcmとkgに入れる、というのはダメですか?
    


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

Name: ookami  ..プログラマー(25,196ポイント)   Date: 2010/06/20(日) 00:20   No:54835     
Title: Re:max の出し方    
 nin ++; 

    if(cm == -999,kg == -999)  
                    break;             /*-999で終了 */ 
の後に移動してはどうですか?

--- 追記

あぁっ こんどはパコネコさんとかぶりました...;; スルーしてください; 編集済み


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

Name: box  ..ハッカー(154,780ポイント)   Date: 2010/06/20(日) 00:23   No:54837     
Title: Re:max の出し方    
ざっと見たところの問題点。

1)意味不明なwhile文
    while (cm=999,kg=999){

2)最大でない値を出力している
   printf("最大身長%f",cm); 

3)字下げが乱れていて、コードが読みづらい


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

Name: パコネコ  ..かけだし(2,092ポイント)   Date: 2010/06/20(日) 00:27   No:54838     
Title: Re:max の出し方    
よく読んでみるとちょっと勘違いしてました
最後の人数に入るのが嫌だったんですね
ookamiさんのやり方のほうがよかったですね…残念


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

Name: パコネコ  ..かけだし(2,124ポイント)   Date: 2010/06/20(日) 00:31   No:54840     
Title: Re:max の出し方    
ほんとだ
やってみたら間違ってた…下は問題ないと思ってたから見てなかった…
===============================
ループ自体はしてるから…でもどうせなら無限ループのほうがいいのかな? 編集済み


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

Name: パコネコ  ..かけだし(2,184ポイント)   Date: 2010/06/20(日) 00:35   No:54841     
Title: Re:max の出し方    
    if(bmi <25 && bmi>=18.5) 
        printf("**.* \n"); 
        } 
 ちなみにこれは**.*はどういう意味ですか?
ワイこれだったけど…普通ぐらいって意味?


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

Name: シエル  ..中級者(11,671ポイント)   Date: 2010/06/20(日) 00:36   No:54843     
Title: Re:max の出し方    
 if(cm == -999,kg == -999) を

if(cm == -999 || kg == -999)にすれば、とりあえずループからは抜けます。

それ以外に問題が山ほどありますが。。


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

Name: team f  ..ぴよぴよ(300ポイント)   Date: 2010/06/20(日) 06:53   No:54856     
Title: Re:max の出し方    
> ざっと見たところの問題点。

> 1)意味不明なwhile文
>     while (cm=999,kg=999){

> 2)最大でない値を出力している
>    printf("最大身長%f",cm); 

> 3)字下げが乱れていて、コードが読みづらい

素人の質問にありがとうございます。
1) 自分もわかりません。ただ、ネットであったのをいれるとなんとなく動いたのです。
   どうすればいいんでしょうね。
2) 理解しました。
3) そのとおりかと。

パコネコさんの回答は当たりです。LOTO買ってはどうでしょう。
プログラマーさん、そのとおりでした。
シエルさん、山ほどなんですよね。


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

Name: パコネコ  ..かけだし(2,316ポイント)   Date: 2010/06/20(日) 22:21   No:54923     
Title: Re:max の出し方    
>1) 自分もわかりません。ただ、ネットであったのをいれるとなんとなく動いたのです。 
   どうすればいいんでしょうね。
特に使わないならwhile(1)でいいと思います
無限ループになります。
どういう意味なんだろ〜
だれかわかります?

>LOTO買ってはどうでしょう
何ですか?それ?


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

Name: asdf  ..入門者(3,692ポイント)   Date: 2010/06/20(日) 23:19   No:54928     
Title: Re:max の出し方    
>while (cm=999,kg=999){ 

これは、コンマ演算子です。まず、cmに999を代入し、続いてkgに999を代入します。
そして、式全体の評価値は、kgすなわち999となります。
よって、これは無限ループとなります。



くわしくは、ググってください。


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

Name: パコネコ  ..かけだし(2,398ポイント)   Date: 2010/06/20(日) 23:30   No:54931     
Title: Re:max の出し方    
つまり毎回代入してくれるということでしょうか?
うまく使えば便利かもしれませんね。
無限ループの1つ下に書いてもいいけど…短くなりますし
asdsさんありがとうございます
ためになりました。


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

Name: asdf  ..入門者(3,774ポイント)   Date: 2010/06/21(月) 00:00   No:54934     
Title: Re:max の出し方    
一応・・・

if(cm == -999,kg == -999)

でのcm == -999は全くの無意味です。

結局、

if (kg == -999)

と同じです。

理由は上記の通りです。



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

Name: パコネコ  ..入門者(2,898ポイント)   Date: 2010/06/21(月) 00:13   No:54938     
Title: Re:max の出し方    
なるほど
つまり1つ目は代入されず最後のものだけ実行&考慮するということでいいですか?


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

Name: asdf  ..入門者(3,989ポイント)   Date: 2010/06/21(月) 00:29   No:54940     
Title: Re:max の出し方    
ちょっと違います。

まず、1番目の式を評価し、2番目の式を評価します。そして、式全体の評価値は、2番目の式の型と値となります。
例えば、i = 0, j=1(両方int型)とします。

i++, j

という式は、まず、iをインクリメントします。(つまり、i=1)そして、この式全体の評価値は、int型の1(jの型と値)となります。

上で述べたif(cm == -999,kg == -999) は、1番目の式が代入でなく、==となっています。
この場合、まずcm==-999の判定を行います。続いて、kg==-999の判定を行います。
式全体の評価値は、2番目の式のみに依存するので、結局、kg==-999しか判定されていないことになります。


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

Name: パコネコ  ..入門者(3,184ポイント)   Date: 2010/06/21(月) 00:33   No:54941     
Title: Re:max の出し方    
>if(cm == -999,kg == -999)
この場合cm==-999を行う意味はありますか
もしくはどういう時ならこれを使うことができますか?
たびたびすいません


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

Name: asdf  ..入門者(4,097ポイント)   Date: 2010/06/21(月) 00:48   No:54943     
Title: Re:max の出し方    
>この場合cm==-999を行う意味はありますか 
上の回答を参照してください。

>もしくはどういう時ならこれを使うことができますか? 
コンマ演算子のことですよね。
例えば、for文です。

ちょうど良いサイトがありました。
http://www7b.biglobe.ne.jp/robe/cpphtml/html03/cpp03006.html

ここで勉強なさってください。






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

Name: パコネコ  ..入門者(3,253ポイント)   Date: 2010/06/21(月) 01:02   No:54945     
Title: Re:max の出し方    
なるほどfor文で使うとおっしゃっていた意味がわかりました。
これなら何度か見たことがあるのでなんとなく両方「行うのか」っと思っていましたが
これは応用に過ぎなかったんですね
もう少し読んで勉強してきます
ありがとうございました。


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



Name: nayo  ..上級者(16,353ポイント)   Date: 2010/06/19(土) 16:29   No:54733       
Title: PHPとMySQLによるタグ検索について    
こんにちは、お世話になっております
先日皆様に教えて頂いた書籍やサイトでPHPやMySQLに対する理解が深まりました
おかげさまでサンプルを利用して保存されてる情報が画像だけの画像アップローダ的なものは作れました
これをさらに拡張して画像にタグを付け、検索できるようにするには一般的にどのような手法が使われているのでしょうか
(例えばpixivやニコニコ動画のような)

検索方法が下手なため上手く見つけきれませんでした
キーワードだけでも良いのでどなたかご教授願います

環境はXAMPPのver 2.5をWindows7にインストールした状態です


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


Name: たいちう  ..比類無きプログラマー(97,623ポイント)   Date: 2010/06/19(土) 19:56   No:54770     
Title: Re:PHPとMySQLによるタグ検索について    
必要な機能ですが、まず表面的には、タグの編集・タグの表示・タグによる検索ですね。
MySQLに、タグ管理用のテーブルも必要です。

ニコ動をモデルにして、実装の簡単な方法を考えると、
画像のIDとタグ文字列を主キーにしたテーブルがあれば良いでしょう。
タグの表示が一番簡単でしょうから、テーブルを作成して、
適当なデータを入れて、表示から試してみて下さい。

# 効率面ではベターな方法があると思いますが、最も簡単な方法がこれだと思いますので、
# 負荷が気になるようになるか、大規模なサービスを開始するような時に、再度検討してください。


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

Name: nayo  ..上級者(16,439ポイント)   Date: 2010/06/19(土) 21:24   No:54781     
Title: Re:PHPとMySQLによるタグ検索について    
遅れましてすみません
ありがとうございます

なるほどまずはそこからですね
ちょっと作ってみようと思います
また出来たらそのソースを元にアドバイスをもらいに来ようと思います


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

Name: nayo  ..上級者(17,351ポイント)   Date: 2010/06/20(日) 15:33   No:54883     
Title: Re:PHPとMySQLによるタグ検索について    
おかげさまで一応タグの表示のみは出来るようになりました
現在の状態をテキストファイルにて添付しましたので見てもらってもよろしいでしょうか

現在不具合としては
 ・画像をアップした瞬間に画面に反映されない
 ・画像をアップした後更新ボタンを押すと前回アップされた画像がもう一度アップされたことになる

また、ここから拡張したい内容としては
 ・既にアップされた画像のタグ編集
 ・タグによる検索

以上のような感じです

念のためこのファイルのためのデータベースとテーブル作成用のphpファイルの内容も余分なものもありますが記述しておきます
文字列型などこれで良いか、他に必要な情報はないかアドバイスお願いします

---ここから---
<?php

    // 文字コードの変更
    mb_internal_encoding( "UTF-8" );

    $DBSERVER   = "localhost" ;    // 
    $DBUSER        = "root" ;        // 
    $DBPASSWORD = "" ;        // 
    $DBNAME     = "testdb" ;    // 

    $sql = "DROP DATABASE $DBNAME" ;

    // 
    if ( ! $con = mysql_connect( $DBSERVER, $DBUSER, $DBPASSWORD ) )
    {
        exit( "MySQLに接続できませんでした" ) ;
    }
    else
    {
        print "MySQLに接続成功<br />";
    }

    // 
    $sql = "CREATE DATABASE $DBNAME" ;

    if ( mysql_query( $sql, $con )  )
    {
        print "データベース testdb の作成に成功しました<br />";
    }
    else
    {
        print "データベース testdb の作成に失敗しました<br />" ;
    }

    // データベースを選択
    mysql_select_db( $DBNAME ) ;

    // 文字コード設定
    mysql_query( "set names UTF8" ) ;

    // テーブルを新規作成
    $sql = "CREATE TABLE upload_file_info (
              tag      varchar(255),
              org_name varchar(255),
              thm_name varchar(255)
            ) engine=MyISAM;";

    if ( mysql_query( $sql ) )
    {
        print "upload_file_infoテーブルを作成しました<br /><br />" ;
    }
    else
    {
        print "upload_file_infoテーブルの作成に失敗しました<br /><br />" ;
    }

    // テーブルの一覧を取得
    $tbllist = mysql_list_tables( $DBNAME ) ;
    while ( $col = mysql_fetch_array( $tbllist ) )
    {
        print $col[ 0 ] . "<br />" ;
    }

    // フォルダ新規作成
    if ( mkdir( "test" ) )
    {
        print "ディレクトリ test を作成しました<br />" ;
    }
    else
    {
        print "ディレクトリ test の作成に失敗しました<br />" ;
    }

    // クローズ
    mysql_close();

?>
---ここまで---


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

Name: たいちう  ..比類無きプログラマー(98,282ポイント)   Date: 2010/06/20(日) 16:17   No:54889     
Title: Re:PHPとMySQLによるタグ検索について    
> 現在の状態をテキストファイルにて添付しましたので見てもらってもよろしいでしょうか

ソースファイルのみでは私には困難です。
せめて問題点をもっと絞り込んでください。

まず現在の不具合についてですが、タグとは関係ないように思われます。
タグを表示するようになったために、不具合が発生するようになったのですか?
それとも、画像をアップした瞬間に、何らかのタグが表示される、という仕様ですか?

状況の説明と、現象を再現できる最小限のソースコードをお願いします。


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

Name: nayo  ..上級者(17,467ポイント)   Date: 2010/06/20(日) 16:34   No:54893     
Title: Re:PHPとMySQLによるタグ検索について    
申し訳ないです
不具合については画面を更新する際にF5キーなどで行っていたので

「このページを再表示するには、以前送信した情報を再送信する必要があります。(中略)
その他の場合は、[再試行]をクリックして Web ページを再表示してください。」

と出てきていたところを[再試行]していたために起こった現象でした
お騒がせしました

恐れ入りますが拡張したい内容やその他ソースの細かな改善点などについてアドバイスをお願いします


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

Name: たいちう  ..比類無きプログラマー(98,504ポイント)   Date: 2010/06/20(日) 19:20   No:54909     
Title: Re:PHPとMySQLによるタグ検索について    
> 恐れ入りますが拡張したい内容やその他ソースの細かな改善点などについてアドバイスをお願いします

具体的に何に困っているのですか?
私はPHPに関しては、数年前の一時期いくつかの仕事をしていて、
その時にニコ動のタグのようなものも実装したことがありますが、
経験は限られているうえ、自己流です。
具体的な問題点があれば解決の手助けをすることができるかもしれませんが、
潜在的な問題点を見つけるのには自信がありません。

そんな私でも言えることとしては、ソースコードを見ると
セキュリティ面が全く考慮されていないようですので、
何らかの形で公開するのでしたら、セキュリティ対策についてのポリシーを決定し、
それに沿って全て作り直す必要があるでしょう。


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

Name: nayo  ..上級者(17,727ポイント)   Date: 2010/06/20(日) 20:32   No:54913     
Title: Re:PHPとMySQLによるタグ検索について    
>たいちうさん
ありがとうございます
確かにセキュリティの面に関しては全く考えてませんでした
書籍を買うなどして対策を考えようと思います
また、後からさらに編集していたらミスが多々…もう少しテストしておくべきでした

質問が曖昧過ぎましたね
すみません

具体的には
 ・テーブルに登録されたデータのタグを利用して検索する方法

…と、まだ曖昧ですね

一応現在データ固有の値としてauto incrementのidがフィールドとして登録されてます

タグの編集については自分の考えてるものとして
 画像タグ表示部分にフォームを設置、idを同時にそこに記述してテーブルデータと対応できるようにする(できるのか分からない)
 新しくタグ登録があった場合、そのidを利用してデータを参照、UPDATE文で書き換える
というもので出来るかな、と思ったのですが検索についてはどのような関数を使えばいいか分からないという状況です

そして分からないことが

SELECT文で文字列型内に特定の文字列が入っているものだけをチョイスするにはどうすれば良いか
また、代替案はないか

ということです
分かりにくくて申し訳ないです


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

Name: ぽこ  ..上級者(16,886ポイント)   Date: 2010/06/20(日) 20:54   No:54915     
Title: Re:PHPとMySQLによるタグ検索について    
> SELECT文で文字列型内に特定の文字列が入っているものだけをチョイスするにはどうすれば良いか
> また、代替案はないか

SQLのLIKE演算子が使えませんか? 編集済み


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

Name: nayo  ..上級者(17,602ポイント)   Date: 2010/06/20(日) 21:05   No:54917 解決!     
Title: Re:PHPとMySQLによるタグ検索について    
>ぽこさん
検索してみたらそれらしいことが出来そうです
おかげさまでなんとかなりそうです
ありがとうございます

これ以上のことはC言語の掲示板ですし、まだプログラムで実装チャレンジしてないのに続けるとご迷惑かと思うので一旦〆させて頂きます

たいちうさん、ぽこさん改めてありがとうございました 編集済み


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

Name: たいちう  ..比類無きプログラマー(98,627ポイント)   Date: 2010/06/20(日) 21:15   No:54918     
Title: Re:PHPとMySQLによるタグ検索について    
> これ以上のことはC言語の掲示板ですし、
> まだプログラムで実装チャレンジしてないのに続けるとご迷惑かと思うので一旦〆させて頂きます

C言語どころかプログラミングとも関係ない質問も歓迎されていますので迷惑でないでしょう。
C/C++に比べると回答できる人は少ないですが、もっと良い掲示板が見つからなければ、
また質問してください。

最後に書籍の紹介。

『PHPサイバーテロの技法―攻撃と防御の実際』
http://www.amazon.co.jp/dp/4883374718


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

Name: ぽこ  ..上級者(16,919ポイント)   Date: 2010/06/20(日) 21:25   No:54919     
Title: Re:PHPとMySQLによるタグ検索について    
私もWebページの紹介をば。

IPAセキュア・プログラミング講座
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html


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

Name: nayo  ..上級者(17,701ポイント)   Date: 2010/06/20(日) 23:01   No:54926     
Title: Re:PHPとMySQLによるタグ検索について    
>たいちうさん
参考になりそうな書籍ありがとうございます
来週にでも購入してみようと思います

>ぽこさん
おお、ありがとうございます
お気に入り登録させて頂きました

お二方重ね重ねありがとうございました
またお世話になるかもしれませんがそのときはよろしくお願いします


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



Name: タマ  ..ぴよぴよ(740ポイント)   Date: 2010/06/20(日) 17:49   No:54902       
Title: アルファベット順のソート    
#include <stdio.h>
#include <string.h>

#define NMAX 10

int main(void)
{
    char *p[] = { "one", "two", "three", "four", "five",
                  "six", "seven", "eight", "nine", "ten"
                };
    char *temp;
    int i, j, min;

    for (i=0; i<NMAX-1; i++) {
        /* find the smallest remaining string */
        min = i;
        for (j = i+1; j<NMAX; j++) {
            /* comparing two strings */
            if (strcmp(p[min], p[j]) > 0) {
                min = j;
            }
        }

●        *temp=*p;
●        ;
●        ;
    }

    for (i=0; i<NMAX; i++)
        puts(p[i]);

    return 0;
}

アルファベットの早い順にソートするプログラムで悩んでいます。
●の部分のみを変更します。
出力で、eight,five,four,nine,one,seven,six,ten,three,twoの順番が目標です。
tempはpの文字を入れる役割だと思うのですが…


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


Name: シエル  ..中級者(11,667ポイント)   Date: 2010/06/20(日) 17:58   No:54903     
Title: Re:アルファベット順のソート    
どこまでが分かって、どこが分からないのですか?

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

Name: タマ  ..ぴよぴよ(818ポイント)   Date: 2010/06/20(日) 18:29   No:54904     
Title: Re:アルファベット順のソート    
strcmpで比較した最小の値をtempに代入していくのだろうと考えてますが、
2回目以降でそれ以前に代入した小さい値を除いて最小を調べていく仕組み(?)が良く分かりません。


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

Name: シエル  ..中級者(11,841ポイント)   Date: 2010/06/20(日) 18:54   No:54907     
Title: Re:アルファベット順のソート    
これって何かの課題の問題ですか?
それとも自分が一から考えて書いたプログラムですか?


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

Name: 組木紙織  ..比類無きプログラマー(87,596ポイント)   Date: 2010/06/20(日) 19:18   No:54908     
Title: Re:アルファベット順のソート    
整数のソートはできますか?
出来るならコードを見せてください。


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

Name: タマ  ..ぴよぴよ(898ポイント)   Date: 2010/06/20(日) 20:40   No:54914 解決!     
Title: Re:アルファベット順のソート    
自己解決出来ました。わざわざ質問したのにすみません…

●      temp=*(p+min);
●      *(p+min)=*(p+i);
●      *(p+i)=temp;


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



Name: atpiza  ..ぴよぴよ(50ポイント)   Date: 2010/06/20(日) 14:48   No:54880       
Title: ウィンドウの初期位置    
こちらに質問するのは初になります。atpizaです。

プログラムの起動時の初期位置を自由に設定したいのですがですが、まったくわかりません。
自分は、PCのディスプレイで言う画面の右下に表示させたいです。
方法をご存知の方、よろしくお願いします・・・。

それと、その自作したやつを、
常に他のアプリケーション等より上におきたい(常に最優先に表示させたい)のですが、
こちらもご存知の方よろしくお願い致します。 編集済み


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


Name: シエル  ..中級者(11,503ポイント)   Date: 2010/06/20(日) 14:57   No:54881     
Title: Re:ウィンドウの初期位置    
DXライブラリをお使いですか?

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

Name: atpiza  ..ぴよぴよ(98ポイント)   Date: 2010/06/20(日) 15:02   No:54882     
Title: Re:ウィンドウの初期位置    
ええ。
DXライブラリでコンパイラはvisualC++ 2010 Expressです。
詳しく書かなくてすみません。


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

Name: スキマ妖怪  ..かけだし(1,920ポイント)   Date: 2010/06/20(日) 15:56   No:54885     
Title: Re:ウィンドウの初期位置    
Dxライブラリをお使いということでこちらの関数でどうでしょうか。

// ウインドウの初期位置を設定する
int SetWindowInitPosition( int x , int y ) ;

// ウインドウモードのウインドウの位置を設定する( 枠も含めた左上座標 )
int SetWindowPosition( int x, int y ) ;


DxLib.hの中を見てみるといいかもしれませんよ、他にも色々ありますので。
最前面表示については、軽く見た感じではDxライブラリ内にはないみたいです。
(よく探せば見つかるかもしれませんが。)

WinAPIとか使わないとダメかなぁ…
その場合は、

HWND hWnd = 変更したいウィンドウハンドル;
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

みたいに書けばいいと思いますよ。
(間違ってたらすいません;)


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

Name: シエル  ..中級者(11,605ポイント)   Date: 2010/06/20(日) 16:17   No:54888     
Title: Re:ウィンドウの初期位置    
DXライブラリだとちょっと分かりません。
たぶん専用の関数があると思いますが。。
WinAPIであれば、ウインドウ作成時に設定できるんですけどね。
あとMoveWindowを使うとか。

最前面表示については、スキマ妖怪さんの方法で良いと思います。

でもウィンドウハンドルの取得方法分かりますか?

P.S.
DXライブラリって細かい制御の時に困りそうですね。
HPのリファレンスに載ってない関数もたくさんありそうなので、
よく探せば専用の関数があるのかもしれないけど。


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

Name: MNS  ..プログラマー(36,578ポイント)   Date: 2010/06/20(日) 16:47   No:54895     
Title: Re:ウィンドウの初期位置    
スキマ妖怪さんのを使わせていただくと、
SetWindowPos( GetMainWindowHandle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
これで常に最前面に出来ますね。


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

Name: atpiza  ..ぴよぴよ(349ポイント)   Date: 2010/06/20(日) 16:56   No:54896 解決!     
Title: Re:ウィンドウの初期位置    
>>スキマ妖怪さん
>>シエルさん

回答ありがとうございます。初期位置設定のほうは無事解決しました。
最前面表示の件は
専用の関数など個人でできるかぎり調べようと思います。
DXライブラリではどうしても解決できない場合はそちらの方法をとらせていただこうと思います。

とりあえず一応なにかしらの方法があるということなので解決とさせていただきます。

また、これからも行き詰るところがあると思いますが、
その際も協力していただけると非常に助かります。
何卒宜しくお願い致します。


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

Name: atpiza  ..ぴよぴよ(700ポイント)   Date: 2010/06/20(日) 17:05   No:54897     
Title: Re:ウィンドウの初期位置    
>>MNSさん
回答ありがとうございます!!
なんですが、そちらのコードでは解決できませんでした。
私の入力が悪いんでしょうか?

#include "DxLib.h" 
  
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ 

    DATEDATA Date;            //時刻取得するための変数 
     
    SetGraphMode( 223, 45, 32); 
    
     ChangeWindowMode(TRUE);    //ウィンドウモードに変更する為の関数 
    
    SetWindowPos( GetMainWindowHandle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); 

     SetWindowStyleMode(1)    //ウィンドウ枠消す
    
         // ウインドウの初期位置を設定する 
     ;SetWindowInitPosition( 1050, 946); 
     

    ;if( DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
    ・
    ・
    ・なんちゃらかんちゃら
    ・
    ・
    
    DxLib_End();    //DXlib終了 
    return 0; 




こんなかんじなんですけど・・・
入れる場所に問題が?





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

Name: atpiza  ..ぴよぴよ(720ポイント)   Date: 2010/06/20(日) 17:06   No:54898     
Title: Re:ウィンドウの初期位置    
あ 時刻取得の変数と画面サイズの設定はどうでもよいです

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

Name: シエル  ..中級者(11,640ポイント)   Date: 2010/06/20(日) 17:09   No:54899     
Title: Re:ウィンドウの初期位置    
DxLib_Initのあとで呼び出せばよいかと

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

Name: atpiza  ..ぴよぴよ(743ポイント)   Date: 2010/06/20(日) 17:20   No:54900 解決!     
Title: Re:ウィンドウの初期位置    
で、できました!!
これで本当に解決です!

協力してくれた皆様本当に感謝いたします!


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



Name: タマ  ..ぴよぴよ(563ポイント)   Date: 2010/06/20(日) 08:58   No:54861       
Title: 関数の訂正    
#include <stdio.h>

void swap (int x, int y)
{
    int temp;

    temp = x;
    x = y;
    y = temp; 
}

int main (void)
{
    int a = 1, b = 2;
    swap(a, b);

    printf("a = %d, b = %d\n", a, b); /* expected output: a = 2, b = 1 */
}

このままのプログラムだと出力がa=1、b=2になり、求められている数値と違います。
ヒントでvoid swap(int *a, int *b)というのが与えられましたが、xとyを全部*a、*bに
置き換えたりしてもうまくいきませんでした。


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


Name: fatens  ..中級者(13,984ポイント)   Date: 2010/06/20(日) 09:03   No:54862     
Title: Re:関数の訂正    
そのうまくいかなかったプログラムを貼ってみてください。


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

Name: シエル  ..中級者(11,462ポイント)   Date: 2010/06/20(日) 09:04   No:54863     
Title: Re:関数の訂正    
swap関数にaとbのアドレスを渡して、それをswap関数側でポインタ変数で受け取り、
下記のようにすれば、aとbの値が入れ替わります。

#include <stdio.h> 

void swap (int *x, int *y) 

    int temp; 

    temp = *x; 
    *x = *y; 
    *y = temp;  


int main (void) 

    int a = 1, b = 2; 
    swap(&a, &b); 

    printf("a = %d, b = %d\n", a, b); /* expected output: a = 2, b = 1 */ 


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

Name: シエル  ..中級者(11,494ポイント)   Date: 2010/06/20(日) 09:07   No:54864     
Title: Re:関数の訂正    
この辺のページを見ればよくわかるかも。
http://9cguide.appspot.com/15-06.html


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

Name: タマ  ..ぴよぴよ(579ポイント)   Date: 2010/06/20(日) 13:24   No:54879 解決!     
Title: Re:関数の訂正    
良く分かりました。ありがとうございますっ

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



Name: DecentLove  ..かけだし(2,370ポイント)   Date: 2010/06/19(土) 20:15   No:54773       
Title: 論理積と論理和    
質問です。

@
ゲームプログラミングの館 13bの
条件分(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
の所と、
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
の所の意味が分かりません。

自分なりに調べようとしたんですが、
A
論理和(「||」の事だと思います)・論理積(「&&」)の意味がわかりません。
どなたかこの2つの解説をお願いします。

B
!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]の所は、
!がついているので「0ではないとき…」という意味になると解釈したのですが、それならわざわざ「!」などつけなくとも、「−1の時…」とすればいいんじゃないんでしょうか?
ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1
は、ChangeWindowMode(TRUE)はif文の中に入れる必要はないと考えたのですが…。

今、僕が知りたいのは、上に書いた3つの項目です。
どなたか、教えていただけないでしょうか?
よろしくお願いします。 編集済み


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,222,084ポイント)   Date: 2010/06/19(土) 20:56   No:54776     
Title: Re:論理積と論理和    
論理和と論理積については、情報数学に縁の無い方だと解りにくいかもしれませんね。
"||"は論理和ではないので(論理和は "|" )省略しますのでもし知りたければまた聞いて下さい。

"||"は"または"を意味します。

if( [1] || [2] )

とかけば[1]か[2]どちらかの条件を満たせば真となります。一方
"&&"は"かつ"を意味します。

if( [1] && [2] )

は[1]も[2]も両方条件を満たさなければ真となりません。
では例題です。

例題(1)

int a=1;

if( a==1 || a==2 ){
    a=3;
}

の実行結果、aはいくつでしょうか?

答えはaが1ならばaが2でなくてもifの条件式を満たすのでa=3が実行されて3になります。
まぁaが1でも2でもある場合などありえないのですがね。
ということでこれはどうでしょう。

例題(2)

int a=?;

if( a==1 && a==2 ){
    a=3;
}
else{
    a=0;
}

上の通り、aが1でも2でも無ければならない場合なんてありえないので、aがいくつか解らなくてもa=0が実行されると解ります。
ではちょいとひねってみましょう。

問題(1)

int a=1;

if( a==1 || a==2 && a==3 ){
    a=3;
}

問題(2)


int b=1;

if( b==1 && b==2 || b==3 ){
    b=3;
}

これはどうなるでしょう?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,354ポイント)   Date: 2010/06/19(土) 21:00   No:54777     
Title: Re:論理積と論理和    
> !がついているので「0ではないとき…」という意味になると解釈したのですが、それならわざわざ「!」などつけなくとも、「−1の時…」とすればいいんじゃないんでしょうか? 

まさしく仰る通りですね。
しかし、毎回必ず書くおきまりの部分はなるべく隠ぺいしたいもので、ifなどの条件式の中に詰め込んで、
他を見やすくしたいという気持ちがありました。
毎回書く部分なら少々解りにくくても問題は無い、それより他を見やすくしようという事です。

で、「a == -1」と書くより「!a」と書く方が短く掛けるんですよね。

違いますね、「a == -1」に対応するのは「a」でしたね。
「!a」に対応するのは「a == 0」です。
whileに入れているのは「0である間ループ」を意味します。



条件式に詰め込むせいで、横に長くなるのを防いでいます。
しかし最初はちゃんと書いた方がいいですね。
どちらの書き方にしようか悩んだのですが現状こうなっています。

> ChangeWindowMode(TRUE)はif文の中に入れる必要はないと考えたのですが…。 

そうですね、ifから出してもいいです。
しかし理由は前述の通り、毎回書く部分はなるべくまとめたいという気持ちで書きました。


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

Name: box  ..ハッカー(154,691ポイント)   Date: 2010/06/19(土) 21:20   No:54780     
Title: Re:論理積と論理和    
> B
> !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]の所は、
> !がついているので「0ではないとき…」という意味になると解釈したのですが、それならわざわざ「!」などつけなくとも、「−1の時…」とすればいいんじゃないんでしょうか?

「0でないとき」と「-1のとき」が等価であるとは限りません。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,487ポイント)   Date: 2010/06/19(土) 21:25   No:54782     
Title: Re:論理積と論理和    
各関数の仕様を確認してみます。

ProcessMessage
ClearDrawScreen
GetHitKeyStateAll

いずれも

-1:エラー
0:正常

です。Keyに入っている値は

1:押している
0:押していない

となっています。
== -1
の方が解りやすく、仕様変更時のバグの元にもならず、適切かもしれませんね。


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

Name: DecentLove  ..入門者(2,673ポイント)   Date: 2010/06/19(土) 22:05   No:54786     
Title: Re:論理積と論理和    
管理人さん。boxさん。
わかり易い解説ありがとうございます!

(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
ですが、これは「それぞれの関数すべてが、0のとき…」という解釈でいいんでしょうか?

それで、ChandeWindowMode(TRUE)は、ifに入れなくてもどちらでも良い。
!をつけなくとも、==-1としても良い。
ということですね。

問題の答えですが、
問題(1)
int a=1;

if( a==1 || a==2 && a==3 ){
    a=3;
}


A, a==1の方が満たされているので実行されるのではないかと思います。

問題(2)
int b=1;

if( b==1 && b==2 || b==3 ){
    b=3;
}

A, bは1なのでb==1は満たされていますが、同時にb==2は満たせないない。b==3でもないので実行されないと思います。


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

Name: ムンバ  ..比類無きプログラマー(70,942ポイント)   Date: 2010/06/19(土) 22:06   No:54787     
Title: Re:論理積と論理和    
こんばんは。

>>○1
>>ゲームプログラミングの館 13bの(略)

私も最初は全く理解できませんでした。
頭がごちゃごちゃになってしまうんですよね。^^;
汚いソースになっていると思うのですが、ちょっと散らばしてみました。

//DX_Dixq_try001.cpp

#include "DxLib.h" //DXライブラリのヘッダファイルの取り込み

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) //アプリケーションの開始
{
    ChangeWindowMode(TRUE); //画面モード変更関数・TRUE:ウインドモード FALSE:フルスクリーンモード
    
    if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化処理 エラーが起きたら終了
    
    int gazou001 = LoadGraph("char.png"); //画像を読み込む関数
    //↑↓型宣言 ←ちょっと編集しました。
    int x = 0;
    char keybuf[256];
    
    SetDrawScreen(DX_SCREEN_BACK); //裏画面を描画対称にする
    
    while(1) //無限ループ
    {
        GetHitKeyStateAll(keybuf);
        
        if (keybuf[KEY_INPUT_ESCAPE] == 1)
            break; //↑Escキーが押されたら終了(while文を抜ける)
        
        ClearDrawScreen(); //画面消去
        
        if(x <= 320) x = x + 2; //画像を移動
        
        DrawGraph(x, 224, gazou001, TRUE); //画像を表示する関数
        
        ScreenFlip(); //画面入れ替え
        
        if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了
    }
    
    DxLib_End(); //DXライブラリを終了する関数
    
    return 0; //プログラムを終了
}

//(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])

//if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

//if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了

//while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) //Escキーが押されたら終了

//int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

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


画像は、「ゲームプログラミングの館」の画像「char.png」を使用して下さい。
邪魔なコメント(//)は削除して下さい。
一つずつ、関数や && || 0 -1 などを移動して組み込んでまとめていけば
○1(@)の様になります。

誤字・脱字等ありましたら修正させて頂きますので、ご指摘下さい。(笑

---編集・追加---
かぶってしまいました。ごめんなさい。
Q∩A中と知らず、長々とすみませんでした。
先程、見た時にはどなたからもレスが無かったもので
ソースを分解するのに時間がかかり過ぎてしまいました。(言い訳)
私のコメント無視して下さい。
確認不足で、すみませんでした。(謝

↓さらに、追記(_ _)
このソースだと DX_CHANGESCREEN_OK が抜けてますね。^^;
詳細は、DXライブラリ本家のリファレンス
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R11N1
を、ご参照下さい。
がんばって下さい!^^ 編集済み


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

Name: DecentLove  ..入門者(2,746ポイント)   Date: 2010/06/19(土) 22:23   No:54791     
Title: Re:論理積と論理和    
ムンバさん。

いえいえ、わざわざありがとうございます。
せっかくですから、分解してくださったこのソース、参考にさせていただきたいと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,704ポイント)   Date: 2010/06/19(土) 22:27   No:54792     
Title: Re:論理積と論理和    
いや〜最後までドキドキの試合だったのに負けちゃいましたね〜(T_T
最後PKだったら同点だったかもしれないのに・・。

=================================

> これは「それぞれの関数すべてが、0のとき…」という解釈でいいんでしょうか?

そういう事ですね。
「0は偽」「0以外は真」ですから、「!0は真」という事になります。よって

while( !0 && !0 ){
}

はループしますよね。

> 問題の答え

OKですね。
こういう優先順位を考えなければならないもの大丈夫でしょうか?

問題(3) 
int a=1, b=2, c=3;
if( a==2 && b==2 || c==3 && a==1  ){ 
    a=3; 


問題(4)
int a=1, b=2, c=3;
if( a==2 && (b==2 || c==3) && a==1  ){ 
    a=3; 
}

これが解ればもうこの件は大丈夫ですね。


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

Name: DecentLove  ..入門者(2,839ポイント)   Date: 2010/06/19(土) 22:38   No:54793     
Title: Re:論理積と論理和    
ですよねぇ…。でも、よく頑張ったと思います。
実況でPKを一瞬期待したんですが…。
=========================================================================

問題(3) 
int a=1, b=2, c=3;
if( a==2 && b==2 || c==3 && a==1  ){ 
    a=3; 


は、a==2 && b==2は満たされていませんが c==3 && a==1が満たされているので実行されると考えます。

問題(4)
int a=1, b=2, c=3;
if( a==2 && (b==2 || c==3) && a==1  ){ 
    a=3; 
}

はちょっと難しかったですが。
(b==2 || c==3) && a==1が満たされているので動くと考えました。
(b==2 || c==3)は1つの物として考えていいんですよね?
だから
a==2 && (b==2 || c==3)か、(b==2 || c==3) && a==1の条件として考えていいんですよね?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,847ポイント)   Date: 2010/06/19(土) 22:58   No:54795     
Title: Re:論理積と論理和    
う〜おしい!

>(b==2 || c==3)は1つの物として考えていいんですよね?

そうです、だから

if( @ && (A||B) && C )



if( @ && D && C )

  ※ D = (A||B)

だと置き換えれば@もDもCも満たさないといけない事が解りますよね?
・・ということは?


#自分で使っといてなんですが、@ABのような文字は機種依存文字なので、例えばMacを愛用されているたかぎさんとかがお困りになるのであまり使わない方がいいです^^;


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

Name: DecentLove  ..入門者(3,226ポイント)   Date: 2010/06/19(土) 23:08   No:54796     
Title: Re:論理積と論理和    
>だと置き換えれば@もDもCも満たさないといけない事が解りますよね?
>・・ということは?

A, 実行されない!

( a==2 && b==2 || c==3 && a==1  ) 
では「||」で左右別々に考えるけど
( a==2 && (b==2 || c==3) && a==1  )
だと、全部ひとつの条件として考えるわけですね。
では、&&の方が優先順位は高いと、言う事ですね。

あと、
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
の条件文ですが、
!=で「正しくない」だったように思うので
ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK←スクリーンモードの変更ができなかったとき。
 DxLib_Init() == -1初期化エラーの時
のどちらかが起これば終了。
ということですよね?

その中のreturn -1;
ってどういう事でしょうか?
ゲームプログラミングの館の2、でも解説がされていなかったので。


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

Name: たかぎ [URL]  ..ハッカー(208,852ポイント)   Date: 2010/06/19(土) 23:10   No:54798     
Title: Re:論理積と論理和    
> 例えばMacを愛用されているたかぎさんとかがお困りになるのであまり使わない方がいいです^^;

全然問題なく表示できています。

ところで...

論理演算子は難しいですね。
結構ベテランでもちゃんと理解できていなかったりします。
例えば || 演算子であれば、lhs || rhs とした場合、lhs が偽であれば rhs を評価しません。
rhs が副作用を伴う式の場合は要注意です。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,907ポイント)   Date: 2010/06/19(土) 23:13   No:54800     
Title: Re:論理積と論理和    
>たかぎさん

あれ・・Macでは文字化けすると聞いていたんですが、違っていましたか^^;
機種依存文字っていつ不具合があるんですかね。

> lhs || rhs とした場合、lhs が偽であれば rhs を評価しません。 

lhsが真であればではなく・・ですか?


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

Name: たかぎ [URL]  ..ハッカー(208,873ポイント)   Date: 2010/06/19(土) 23:15   No:54801     
Title: Re:論理積と論理和    
> lhsが真であればではなく・・ですか?

すみません。逆です。
うっかりしていました。


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

Name: DecentLove  ..入門者(3,491ポイント)   Date: 2010/06/19(土) 23:17   No:54803     
Title: Re:論理積と論理和    
機種依存文字なんてどこでも表示出来るだろ!?
と、たかをくくっていたのですが、Macユーザー、Linuxユーザーさんの事を全く考えていませんでした。
今度からは気を付けたいと思います。

たかぎさん。
>例えば || 演算子であれば、 lhs || rhs とした場合、lhs が真であれば rhs を評価しません。
>rhs が副作用を伴う式の場合は要注意です。 

なんだかとても難しい言い回しですね。
lhs || rhs とした場合、lhs が偽であれば rhs を評価しません。
ココはどういう事でしょうか?偽であれば評価しない…。僕の頭ではよくわかりませんでした。
副作用とはどういう事ですか?
ご教授お願いします。

直前に更新されたコメントを読んでいませんでした。
そのため、偽を真に書き換えました。
それでも2つともいまいちよくわかりませんでした。
ご教授お願いします 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,223,209ポイント)   Date: 2010/06/19(土) 23:19   No:54804     
Title: Re:論理積と論理和    
はい、
&&の方が優先順位は高いと、言う事ですね。 
しかしそれ以上に括弧の優先順位が高いのです。
フィーリング的に

&&は「掛け算」
||は「足し算」

みたいに覚えておけば、論理和、論理積を覚える時すんなりいくかもしれません。

1 + 2 * 3

これって2*3を先にしますよね。でも

(1 + 2) * 3

こうしてあれば1+2を先にしますよね。これと一緒です。
演算子の優先順位については

http://c-production.com/special/04092101.html

こういう所を見ると良いですよ。
しかし解りにくい時は明確に括弧を付けるようにした方が無難です。
例えば


1 + (2 * 3)

この括弧は書く必要ありませんが、
複雑な式が入り組んだ時は省略すると間違いの要因になったりします。


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

Name: DecentLove  ..入門者(3,542ポイント)   Date: 2010/06/19(土) 23:24   No:54807     
Title: Re:論理積と論理和    
管理人さん。

なるほど、算数に置き換えて考えるんですね。
よく分かりました。
ありがとうございます!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,223,363ポイント)   Date: 2010/06/19(土) 23:27   No:54810     
Title: Re:論理積と論理和    
> DecentLoveさん

例えば以下のようなプログラムを書いてみました。
実行してみて下さい。
何と表示されるでしょう?

#include <stdio.h> 
int main(){
    int a;

    if( 1 || (a=1) ){
        printf("aの値は=%d\n",a);
    }

    return 0; 
}

実行結果
"エラー"もしくはでたらめな数字


条件式にこんな事を書くべきではないですが、
例えば評価されるかどうか解らない所で初期化などを行い、
後の処理に続くような場合は後の処理に影響を及ぼします。

今回はaに何の値も入れていないのにaを表示させようとしたのでエラーになりました。
これは

if( @ || A )

において、@は必ず実行される真の値だからAが評価されなかったため起こったのです。


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

Name: たかぎ [URL]  ..ハッカー(209,137ポイント)   Date: 2010/06/19(土) 23:27   No:54811     
Title: Re:論理積と論理和    
> Macユーザー、Linuxユーザーさんの事を全く考えていませんでした。 

MacでもLinuxでもちゃんと表示できています。
ただ、常に表示されるとは限らないので、避けた方が無難なのは間違いありません。
丸付き数字より、むしろ円記号と逆斜線のほうが問題ですね。
ソースコードの場合は大した問題ではありませんが、ネットショップの値段表示がすべて逆斜線になっていたりするので...

> lhs || rhs とした場合、lhs が偽であれば rhs を評価しません。 

まず、すでに指摘があるように、

lhs || rhs とした場合、lhs がであれば rhs を評価しません。 

の間違いです。
これはどういうことかというと、lhs が真、つまりゼロ以外に評価された場合、rhs が何であっても lhs || rhs は真になります。
だから、rhs は評価されません。
具体的には、

a || b++

のような式があった場合、a がゼロ以外であれば b++ は評価されませんので、b はインクリメントされないことになります。
b++ が必ず評価されることを期待しているととんでもないことになります。


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

Name: DecentLove  ..入門者(3,695ポイント)   Date: 2010/06/19(土) 23:32   No:54814     
Title: Re:論理積と論理和    
たかぎさん。
>lhs が真、つまりゼロ以外に評価された場合、rhs が何であっても lhs || rhs は真になります。
>だから、rhs は評価されません。

ということは、lhsが真と評価された場合は、rhsは無視されるわけですね?

先程のコメントにありました、副作用、というのは何のことでしょう?
少し気になっているので。教えてください。お願いします。


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

Name: たかぎ [URL]  ..ハッカー(209,256ポイント)   Date: 2010/06/19(土) 23:33   No:54817     
Title: Re:論理積と論理和    
> なんだかとても難しい言い回しですね。

普通の言い回しですよ。
最初に言語を勉強するときに、ちゃんとした入門書を使わないと後々こういったところで苦労します。

「わかりやすい」といわれる入門書や入門サイトの中には、必要な解説を省くことでわかった気にさせるものが少なくありません。
用語やその概念は正確に解説しておかないと、その時点ですでに間違った認識をしてしまいますし、その後も話が通じなくなってしまいます。


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

Name: 組木紙織  ..比類無きプログラマー(87,562ポイント)   Date: 2010/06/19(土) 23:38   No:54819     
Title: Re:論理積と論理和    
>副作用
関数が、戻り値を返すこと以外の動作をすることです。


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

Name: たいちう  ..比類無きプログラマー(97,660ポイント)   Date: 2010/06/19(土) 23:40   No:54820     
Title: Re:論理積と論理和    
> ココはどういう事でしょうか?偽であれば評価しない…。僕の頭ではよくわかりませんでした。
> 副作用とはどういう事ですか?
> ご教授お願いします。

たかぎさんの説明で理解できたと思いますが、
念のため演習問題をやりましょう。

「lhs && rhs とした場合、どのような場合にrhsが評価されないか?」


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

Name: たかぎ [URL]  ..ハッカー(209,450ポイント)   Date: 2010/06/19(土) 23:41   No:54821     
Title: Re:論理積と論理和    
> 副作用、というのは何のことでしょう? 

式のオペランドを使って評価結果を計算する以外の振る舞いのことだと思ってください。
例えば、

1 + 2

であれば、評価結果の 3 というのは、オペランドである 1 と 2 を計算して求められますね。
そして、それ以外の振る舞いというのはとくにありません。
ところが、

1 + a++

だとどうでしょうか?
1 と a を足した値を評価結果とする以外に、a の値を更新しますね。
この a の値を更新するというのは、オペランドを使って評価結果を計算する以外の振る舞いです。
こういうのを副作用といいます。
ほかには、printf で出力するものなども副作用にあたります。


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

Name: ムンバ  ..比類無きプログラマー(71,390ポイント)   Date: 2010/06/20(日) 00:28   No:54839     
Title: Re:論理積と論理和    
<<DecentLoveさん

>>その中のreturn -1;
 DXライブラリ本家のリファレンス
 http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R1N1
 を参照してみて下さい。

自分のやり方ですが
良く解らなくなったら、コメントと関数を逆転させて
関数や演算子・その他を、日本語にしてます。

例えば
 int gazou001 = LoadGraph("char.png"); //画像を読み込む関数、でしたら
画像をメモリーに読み込むには、LoadGraph関数で 画像ファイル(char.png)を読み込み
int型に宣言した 変数gazou001 に代入する。
(↑勘違いがあるかもしれませんが、こんな感じという事で。^^;)

とか

 if( 1 && 2 ) //もし 1 かつ 2 だったら(1 と 2 の両方の条件を満たしたら)
もし、1 と 2 の両方とも、条件が満たされていたら・・・

 if( 1 || 2 ) //もし 1 または 2 だったら(1 か 2 のどちらか一つの条件を満たしていたら)
もし、1 か 2 のどちらか一つの条件を満たしていたら・・・

ちなみに
 if( 1 || 2 )
の場合、1 の条件が満たされたら(1 だったら) || の後ろの 2 は無視されます。

という事だと、思います。

PS:何か突っ込まれそうなので逃げたい気持ちで一杯です。(自爆



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,223,518ポイント)   Date: 2010/06/20(日) 00:44   No:54844     
Title: Re:論理積と論理和    
>ムンバさん

> 関数や演算子・その他を、日本語にしてます。

一応VisualC++だとこうすれば、例えば上のプログラムは全部日本語に出来たりします。
これでコンパイル通るのは何とも違和感がありますが^^;

#include <stdio.h> 

#define 代入 =
#define 整数型 int
#define もし if
#define または ||
#define 変数の中身 "%d"
#define 値を返す return
#define 正常 0
#define 真 (!0)
#define 偽 (0)
#define 1 1

#define 表示する printf

int main(){

    整数型 変数;

    もし( 偽 または ( 変数 代入 1 ) ){
        表示する("変数のの値は="変数の中身, 変数);
    }

    値を返す 正常; 
} 

 
使う機会は無いと思いますがもし日本語に置き換えたい時があれば・・。


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

Name: ムンバ  ..比類無きプログラマー(71,504ポイント)   Date: 2010/06/20(日) 01:00   No:54845     
Title: Re:論理積と論理和    
あらら〜?(汗

ご掲示頂いたソース、うちの環境で試してみました。
try.c
でも
try.cpp
でも

何のエラーも無く、通過してしまいました。

日本語が無視されてるのか、日本語パッチ?が含まれてるせいなのでしょうか?

ご指導ありがとうございます。
時間がある時にでも、遊んでみたいと思います。
面白そうですね。w


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

Name: シエル  ..中級者(11,247ポイント)   Date: 2010/06/20(日) 01:08   No:54847     
Title: Re:論理積と論理和    
#defineで日本語に置き換えられるんですね!面白そう!

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

Name: ムンバ  ..比類無きプログラマー(71,691ポイント)   Date: 2010/06/20(日) 01:32   No:54848     
Title: Re:論理積と論理和    
<<#defineで日本語に置き換えられるんですね!面白そう!

 そういう事なのですね。ご解説どうもありがとうございます。
 やっぱり面白そうですね〜♪

あっ?すみません。^^;

<<DecentLoveさん 

>>その中のreturn -1; 
 その後、如何ですか?

勝手ながら寝てしまいます。
自分も、がんばります!(笑
おやすみなさい。



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

Name: pie  ..ぴよぴよ(950ポイント)   Date: 2010/06/20(日) 02:03   No:54850     
Title: Re:論理積と論理和    
>環境依存文字
私もつい最近Macを使い始めた者ですが
普通に丸付き数字が見えたので少し驚きました。
(月)とか(火)とか表示されるものだと聞いた記憶がありますが・・・

ついでに、一言だけ。
>DecentLoveさん
> なるほど、算数に置き換えて考えるんですね。

置き換えるというよりも算数そのものです。
”&&”も”||”も、”*”や”+”と同じように値を返す単なる演算子の1つです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,223,752ポイント)   Date: 2010/06/20(日) 02:28   No:54851     
Title: Re:論理積と論理和    
> pieさん
> 環境依存文字

気になってLinux立ち上げてみました。
現在Linux(Ubuntu)から書き込みしています。

if( @ && D && C ) 

とか普通に見えてますし、使えますね。
ただ「いち」とかで変換しても出てこないのです・・。

ということでかなり特殊な文字が使われていそうなmixiの顔文字コミュからちょっと顔文字をコピペ・・。

(*^ิu^ิ*)(*◡ฺܫ◕ฺ)✿ฺ♡♥
♡(。→ˇ艸←) 
ヾ(♥ó㉨ò)ノ♡ 
♡(。→ˇ艸←) 
♡→ܫ←♡

こちらではどれも化けていますが、化けたままで投稿してもwindowsから見たら正常に見えるんですかね。
しかしハートはちゃんと見えています。掲示板でハートとか書く人あまりいないでしょうけど^^;

※トピの内容と外れてすみません;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,223,880ポイント)   Date: 2010/06/20(日) 02:33   No:54852     
Title: Re:論理積と論理和    
windowsに帰ってきました。
ちゃんと見えていますね。
とりあえず@やAは使っても大丈夫そうですね。
それ以外で表示できない物はありそうですが、通常の使用範囲では障害にならないみたいですね。

ところで、記事を編集しようとしたら上記の顔文字の部分は添付画像のようになっていました。


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

Name: DecentLove  ..入門者(4,521ポイント)   Date: 2010/06/20(日) 10:49   No:54867     
Title: Re:論理積と論理和    
みなさん、返事が遅れてしまいもうしわけありません。
同じ方に複数回コメントいただいたようですが、時系列に沿ってコメント順に返事させていただきたいと思います。

たかぎさん
 >普通の言い回しですよ。
 >最初に言語を勉強するときに、ちゃんとした入門書を使わないと後々こういったところで苦労します。
なるほど、わかりやすいサイトに頼りすぎるのも良くないんですね。今度入門書を購入してみたいと思います。


たいちうさん
 >「lhs && rhs とした場合、どのような場合にrhsが評価されないか?」
たぶんlhsが真でなかった場合に条件から外れてしまうので、
答えは、 lhsが真でない場合にrhsは評価されない。です。


たかぎさん
 >1 と a を足した値を評価結果とする以外に、a の値を更新しますね。
 >この a の値を更新するというのは、オペランドを使って評価結果を計算する以外の振る舞いです。
 >こういうのを副作用といいます。 
つまり、計算やその他の関数などの影響でaの値が書き換えられてしまう、ということですよね?


ムンバさん
 >自分のやり方ですが
 >良く解らなくなったら、コメントと関数を逆転させて
 >関数や演算子・その他を、日本語にしてます。 
なるほど!いいやり方かもしれません。
それでは、return -1 は終了させるための物。ということでしょうか。

 >ちなみに
 > if( 1 || 2 )
 >の場合、1 の条件が満たされたら(1 だったら) || の後ろの 2 は無視されます。 
では、優先して評価してもらいたい方を1の場所におくべき、ということですか。


管理人さん
 >一応VisualC++だとこうすれば、例えば上のプログラムは全部日本語に出来たりします。
 >これでコンパイル通るのは何とも違和感がありますが^^; 
驚きました!VisualC+++にはそんな仕様があったんですね!
豆知識として覚えておきたいと思います。


ムンバさん
 >その中のreturn -1; 
 >その後、如何ですか?
 >勝手ながら寝てしまいます。
 >自分も、がんばります!(笑
 >おやすみなさい。 
前述のとおりだいたい理解できました!有難うございました。
質問した身の僕がいちはやく寝てしまいました。すみませんでした。


pieさん
 >普通に丸付き数字が見えたので少し驚きました。
 >(月)とか(火)とか表示されるものだと聞いた記憶がありますが・・・ 
次からは一応(1)などというふうに表記したいと思います。
 
 >置き換えるというよりも算数そのものです。
 >”&&”も”||”も、”*”や”+”と同じように値を返す単なる演算子の1つです。 
そうですね、そのように考えた方が、理解もしやすいと思いますし。


管理人さん
 >(*^ิu^ิ*)(*◡ฺܫ◕ฺ)✿ฺ♡♥
 >♡(。→ˇ艸←) 
 >ヾ(♥ó㉨ò)ノ♡ 
 >♡(。→ˇ艸←) 
 >♡→ܫ←♡ 
mixiはやったことありませんがなかなかすごいですね。
最近掲示板を騒がせているトピのなかに度々出てきた2chとはまた違った感じの顔文字ですね。
コッチのほうが可愛らしいというか、暖かいですね。
ちなみに、今返信のため、引用で顔文字持ってきましたが、画像の様にはなってないですよ。

もう修正しましたが、先程みなさんの名前を赤で書くという大変な無礼をしてしまいました。
本当にもうしわけありませんでした。 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,224,200ポイント)   Date: 2010/06/20(日) 11:06   No:54869     
Title: Re:論理積と論理和    
> DecentLoveさん

おはようございます。

丁寧なお返事ありがとうございます^^
ところで、私のこちらの投稿はご覧になりました?
http://www.play21.jp/board/formz.cgi?action=res&resno=54773&page=&id=dixq&rln=54867#54810
副作用について聞いていらっしゃったので、もし気になればこちら参考にして頂ければと思います。

> 絵文字
> ちなみに、今返信のため、引用で顔文字持ってきましたが、画像の様にはなってないですよ

記事を「編集」する時に上記のようになるようです。
恐らく投稿した後にcgiが不具合を起こさないように特定のデータを変換しているのではないかと思います。
文字コードについてはYuOさんが新しくトピを立てて教えて下さっているようです。

# すみませんが、出かける用事があるので、YuOさんのトピは帰宅してから拝見します^^;


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

Name: たかぎ [URL]  ..ハッカー(209,625ポイント)   Date: 2010/06/20(日) 11:18   No:54870     
Title: Re:論理積と論理和    
> DecentLoveさん

おそらく知らないと思うので、将来的なこともあるのでアドバイスしておきます。
朱筆訂正のような状況を除いて、人の名前を赤字で書くべきではありません。

なぜかというと、赤字で名前を書くのは故人であったり、死を願って呪うときだからです。
例えば、果たし状は宛名を赤字で書きます。
つまり、相手に喧嘩を売るときの作法であり、社会に出てこういうことをやっていると恥をかきます。


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

Name: DecentLove  ..入門者(4,935ポイント)   Date: 2010/06/20(日) 11:31   No:54871 解決!     
Title: Re:論理積と論理和    
たかぎさん。
すみませんでした。
高校生にもなりながらそんな重要なことも全く知らず、みなさんには無礼なことをしてしまいました。
みなさんの名前を目立たせてわかりやすくしようと思ったのですが…次からは太字にするなりします。
赤字は修正しておきました。


みなさんへ。
僕のマナー不足でご迷惑をお掛けしました。
本当にすみませんでした。


このトピックですが、これにて解決とさせていただきます。
さっき僕が書いた返答の中にあったいくつかの疑問に対する答えが戻ってき次第このトピは終了とさせていただきます。


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

Name: DecentLove  ..初心者(5,143ポイント)   Date: 2010/06/20(日) 11:36   No:54872     
Title: Re:論理積と論理和    
管理人さん。

 >丁寧なお返事ありがとうございます^^
 >ところで、私のこちらの投稿はご覧になりました?
 >http://www.play21.jp/board/formz.cgi?action=res&resno=54773&page=&id=dixq&rln=54867#54810
 >副作用について聞いていらっしゃったので、もし気になればこちら参考にして頂ければと思います。 
すみません。全く気づいてませんでした。
では、変数の値を操作するときには、条件文の中に入れない、もしくは条件の先頭に持ってくるべき。
という事ですね?
ありがとうございました。

行ってらっしゃい。


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

Name: Dixq (管理人)  ..ウィザード(1,224,492ポイント)   Date: 2010/06/20(日) 13:06   No:54878     
Title: Re:論理積と論理和    
そうですね。
コーディング規約によっては条件式の中で代入はしてはならないとかあるので、なるべく単純な比較に留めるのが良いでしょう。

そういう意味では私が書いたwhileに全部突っ込むのはどうなのって感じですが、あれは副作用が無いので(順番はある)そのままにしてます^_^;

>赤字

確かにお墓に赤字で彫ったりしますよね。
それにこの不景気の中赤字って文字は見たくn(ry

>みなさんには無礼なことをしてしまいました。

悪意が無い分には誰も不快な思いはしないと思うので大丈夫ですよ^_^;


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



Name: YuO  ..熟練のプログラマー(46,127ポイント)   Date: 2010/06/20(日) 04:10   No:54854       
Title: 【雑談】丸囲み数字の話    
元スレッド : http://www.play21.jp/board/formz.cgi?action=res&resno=54773&page=&id=dixq

返信しようと思いましたが,スレッドの内容からずれていたので新規に立てています。


丸囲み数字,昔からの取り扱いが面倒な文字の一つですね……。
# 鄧 などよりましですが (U+9127 : Win31j/X0213:1-92-80,X0212:98-71 ←EUC-JP系で本来のEUC-JPにするとIEで読めず,MS系でCP51932にすると非Windowsで読めない可能性)


・Webサイト側の対策
UTF-8/16で作ってしまう
少なくとも,Form要素のあるページとそれを受け付けるページはこれにしておくだけで,
丸囲み数字からハートマークから果てはアラビア文字までValidな状況になります。
# 表示できるかは別問題。それは表示環境側のフォントの問題なので。

・ユーザー側の対策
(このページのエンコーディングはShift_JISだから) JIS X 0201/0208に無い文字は全て数値文字参照にしてしまう。
これによって,丸囲み数字から (以下略)
# このページのCGIが数値文字参照について透過であることを突いた方法ではありますが。

・ブラウザ側が行っている対策
現在のページのエンコーディングであらわすことが不可能な文字は数値文字参照にして送る


現状のHTML,つまりはHTML 4.01やXHTML (というかXMLですが) は,文字集合としてISO 10646-1を指定しています。
これはほぼUnicodeを指定していることに等しくなります。
このため,数値参照であれば,Unicode上の文字は一応全て使えることになります。

さて,このページについてみると,エンコーディングとしてはShift_JISということになっています。
Shift_JISの文字集合は,
http://www.iana.org/assignments/character-sets
によれば,
・JIS X 0201
・JIS X 0208
ですから,この状況は
・文字集合としてはISO 10646-1を指定
・エンコーディングはShift_JISを指定
という不思議な状態に見えます。
実際には,JIS X 0201およびJIS X 0208はISO 10646-1のサブセットになっているので,マッピングによって解決されています。
# 上記から,このページ中の0x5CはYEN SIGN,つまりはU+00A5へのマッピングが望ましいことになります。


さて,元記事でdixqさんが54851で試した各種文字ですが,54852の画像にあるようにブラウザが数値文字参照に置き換えてくれています。
この機能も問題になる (U+0026 AMPERSANDをエスケープする場合,&#9825;のように展開されたまま残る) 可能性はあるのですが,この掲示板では起きないので,気にしないでおきます。

問題は,丸囲み数字などの,Windows-31jに含まれる文字です。
これらは,大抵のWindowsのブラウザが数値文字参照に置き換えずに送信してしまいます。
ところが,① (U+2460 CIRCLED DIGIT ONE) はJIS X 0201およびJIS X 0208に含まれない文字です。
# JIS X 0213に含まれるほか,ISO 10646-1互換のJIS X 0221に含まれます。
しかし,規格上不正な文字なので,どう扱われるかはCGIやUAに依存します。
大多数のCGIは黙って受け入れ,UAは①に置き換えると思います。
ただし,Shift_JISをx-mac-japanese (IANA未登録につき探していたら出てきた名前を利用) として扱うUAであれば,
㈰ (U+3230 PARENTHESIZED IDEOGRAPH SUN) にマッピングされるでしょうし,
純粋なShift_JISとして解釈するなら,未規定文字なので,U+FFFD (REPLACEMENT CHARACTER) に置き換えるかもしれません。
# Mac OS X の状況は,ソフトウェア次第のようです。 http://oku.edu.mie-u.ac.jp/~okumura/xhtml/encoding.html


ぐだぐだ書いてきましたが,結論としては,
「ここはエンコーディングがShift_JISなんだから,いわゆる『機種依存文字』と呼ばれる文字の使用は控えるのが安全」
だったりします。

ところで,phpBBの表側はUTF-8ですね。
裏側 (DB) もUTF-8であれば,これらの問題はほぼ気にする必要がないのですが……。
表はUTF-8,裏がなぜかShift_JISとかいうシステムがなぜかあるので……。


1,159ポイント を落としてしまった。


Name: たかぎ [URL]  ..ハッカー(209,682ポイント)   Date: 2010/06/20(日) 11:57   No:54873     
Title: Re:【雑談】丸囲み数字の話    
別に文字だけのことではないんですが、世の中のすべての人がWindowsを使っているという思い込みをしている人は少なくありませんね。


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

Name: DecentLove  ..初心者(5,205ポイント)   Date: 2010/06/20(日) 12:04   No:54874     
Title: Re:【雑談】丸囲み数字の話    
>別に文字だけのことではないんですが、世の中のすべての人がWindowsを使っているという思い込みをしている人は少なくありませんね。 

僕も最近LinuxやMacに触れてみるまでそう思い込んでました。


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

Name: Dixq (管理人)  ..ウィザード(1,224,341ポイント)   Date: 2010/06/20(日) 12:55   No:54875     
Title: Re:【雑談】丸囲み数字の話    
情報ありがとうございます。

私は現在windowsとLinuxの使用頻度は半々位でしょうか。
まぁLinuxはあまり使われていないにしてもiPadやiPhoneがこれだけヒットしているので、そのうちマックがシェアを伸ばして来るかもしれませんね。

そうなると作る側は常にマルチプラットフォームを意識しないといけなくなるのでそれはそれで何だか…


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

Name: たかぎ [URL]  ..ハッカー(209,754ポイント)   Date: 2010/06/20(日) 13:01   No:54877     
Title: Re:【雑談】丸囲み数字の話    
> まぁLinuxはあまり使われていないにしてもiPadやiPhoneがこれだけヒットしているので、そのうちマックがシェアを伸ばして来るかもしれませんね。 

iPadやiPhoneはともなく、セキュリティ面への考慮からシェアを伸ばしてくる可能性は十分あります。
WindowsにくらべてMacのセキュリティがすば抜けて高いとは思いませんが、少なくとも現時点では驚異そのものが少ないですからね。

> そうなると作る側は常にマルチプラットフォームを意識しないといけなくなるのでそれはそれで何だか…

携帯電話やゲームは今でもそういう状態です。
スマートフォンだけでも、Android、Windows Mobile、iPhoneといったまったく異なるプラットフォームで、それぞれ開発言語からして違いますからね。


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



Name: taketoshi  ..ぴよぴよ(170ポイント)   Date: 2010/06/19(土) 22:08   No:54788       
Title: 画面に雪を降らせたいのですが、理論が判りません    
はじめまして、ご質問があります。

C言語を勉強しはじめて4ヶ月くらい経つのですが、現在スクリーンセーバーを作っています。
その中で画面上に雪を降らせたいのですが、コードの書き方が判りません。

ひとつの画像を読み込んで、TIMERを用いてx,y軸をずらしながら描画して一粒降らせる事はできたのですが
これが複数となったときの描画方法のコードの書き方が判りません。。。
Bitbltを何個も書いて複数降らせることも出来たのですが、もう少し良いやり方はありませんか?
乱数を使って画面のあちこちから出現させて消えていくみたいなプログラムを書きたいのです。

サンプル等ありましたらご教授お願いします。


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


Name: ookami  ..上級者(24,939ポイント)   Date: 2010/06/19(土) 23:25   No:54808     
Title: Re:画面に雪を降らせたいのですが、理論が判りません    
こんばんは。

一粒ができたなら、

@各パラメータ(x,yなど)をそれぞれ配列にしてforループで回すか、

A各パラメータを一つのクラスにまとめて、配列にしてforループで回すか、

どちらかが良いと思います。

あと、開発環境なども書いた方がよいですよ。


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

Name: シエル  ..中級者(11,601ポイント)   Date: 2010/06/19(土) 23:32   No:54816     
Title: Re:画面に雪を降らせたいのですが、理論が判りません    
forループ文の中に、BitBltを一つだけ書いて、ループの中で座標をばらばらに散らして
ループの回数だけ描画させればいいと思います。


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

Name: シエル  ..中級者(11,225ポイント)   Date: 2010/06/20(日) 01:04   No:54846     
Title: Re:画面に雪を降らせたいのですが、理論が判りません    
超簡単に作ってみましたが、イメージはこんな感じですか?
(完全にシューティングの応用)

注意:
各種ハンドルやメモリデバイスコンテキストなどは、破棄しといてください。

typedef struct {
        int x,y,flag;
        double rad;
}DATA;

DATA data[100];

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
    PAINTSTRUCT ps;
    static HDC hdc,mhdc;
    HBITMAP hbmp;;
    HBRUSH hbrush;
    switch(msg){
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_CREATE:
            hdc = GetDC(hwnd);
                        //白ブラシ作成
            hbrush = CreateSolidBrush(RGB(255,255,255));
            SelectObject(mhdc,hbrush);
            mhdc=CreateCompatibleDC(NULL);
            hbmp=CreateCompatibleBitmap(hdc,700,640);
            SelectObject(mhdc,hbmp);
            SetTimer(hwnd,1,60,NULL);
            return 0;

        case WM_TIMER:
            PatBlt(mhdc,0,0,700,640,BLACKNESS);
            for(int i=0;i<100;i++){
                if(data[i].flag==0){
                    data[i].flag=1;
                    data[i].x=rand()%700;
                    data[i].y=0;
                    data[i].rad=2.0f;
                    break;
                }
            }

            for(int i=0;i<100;i++){
                if(data[i].flag==1){
                    Ellipse(mhdc,data[i].x,data[i].y,data[i].x+10,data[i].y+10);
                    data[i].x+=6.0f*cos(data[i].rad);
                    data[i].y+=6.0f*sin(data[i].rad);
                    if(data[i].x<0 || data[i].y>400){
                        data[i].flag=0;
                    }
                }
            }
            InvalidateRect(hwnd,NULL,FALSE);
            return 0;
            
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            BitBlt(hdc,0,0,700,640,mhdc,0,0,SRCCOPY);
            EndPaint(hwnd,&ps);
            return 0;



追記:
画面の背景は真っ黒にしないと、雪が見えません。 編集済み


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

Name: taketoshi  ..ぴよぴよ(164ポイント)   Date: 2010/06/20(日) 13:01   No:54876 解決!     
Title: Re:画面に雪を降らせたいのですが、理論が判りません    
お二方、お返事ありがとうございます。

昨晩遅くにお二人のレスを見させていただいてから、悩みながら書いてみました。
シエルさんのサンプルソースを参考にしながら書き進めたところ、
なんとか複数個の雪を同時に降らして延々とループさせることができました。構造体って便利ですねー。

これから画像を透過させたり、X軸方向に揺らしたりと手を加えて行きたいと思います。
本当にありがとうございました。またよろしくお願いします。


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



Name: 五反田  ..ぴよぴよ(219ポイント)   Date: 2010/06/19(土) 22:57   No:54794       
Title: 穴掘り法による迷路作成アルゴリズムに関する質問    
2chで質問したのですが、ミスのせいでまともな答えがもらえなさそうなので、こちらで質問させてください。

穴掘り法でコンソールの迷路を作成しようとしたのですが、参考にしたソースと同じ様に動かすつもりで 
書いたのに、なぜか、掘られていない壁が残ってしまいます。 
ソースを載せますので、自分のソースのどこに問題があるのか指摘してください。 

参考にしたもの 
ttp://codepad.org/9iaa2YAs 
自分で書いたヤツ 
ttp://codepad.org/DYLuK5Ca 

よろしくお願いします。 


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


Name: たいちう  ..比類無きプログラマー(97,732ポイント)   Date: 2010/06/19(土) 23:30   No:54813     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
while(1){
    i=0;
    y=1;
    while(y<SizeY-1){
        x=1;
        while(x<SizeX-1){

とりあえず、↑このように変更したら良いと思う。
forをwhileに変更した際のミスですね。
元のプログラムもそうなってましたが、
srandはプログラムの最初で一回だけ呼べばよいです。
丁寧に見てないので、他にも問題はあるかも。


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

Name: パコネコ  ..かけだし(1,990ポイント)   Date: 2010/06/19(土) 23:45   No:54823     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
int dig(int x,int y){
    int dx,dy,r;
    c=0;
    r=rand();
    printf("%d\n",r);
のrって何に使われてるんですか?
同じ数がいっぱい出てくるので気になって…ランダムなのに…
プログラムが動いてるからこれで正常なんでしょうがわかりません
質問スレに質問するのもどうかと思いましたがいいでしょうか?


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

Name: たいちう  ..比類無きプログラマー(97,776ポイント)   Date: 2010/06/19(土) 23:51   No:54826     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
srandの使い方を間違えているため、同じ数字になってしまいます。
dig()を呼ぶ直前に、その時の時刻で乱数を初期化してますので、
一瞬で終わるプログラムの場合は、毎回同じ時刻で初期化され、
常に同じ乱数を使うことになってしまいます。

main()の最初に一度だけsrand()を呼ぶように変えて下さい。


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

Name: パコネコ  ..かけだし(2,176ポイント)   Date: 2010/06/20(日) 00:10   No:54830     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
おおできた
ばらばらだ〜
五反田さんもできたかな〜
たいちうさんありがとうございます
これでもやもやが晴れました


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

Name: ookami  ..プログラマー(25,144ポイント)   Date: 2010/06/20(日) 00:13   No:54833     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
見ましたが、
for( x=0; x<SizeX; x++ ){
    for ( y=0; y<SizeY; y++ ){
        map[x][y]=1;
    }
}

for(x=0;x<=SizeX-1;x++){
    for(y=0;y<=SizeY-1;y++){
        map[x][y]=1;
    }
}
とか、
++i;

i++;
など、「そこ変えても意味なくないか?」と思うところが多くてまどわされるんですが...

x=1;
y=1;
while(y<SizeY-1){
    while(x<SizeX-1){
        :
        x=x+2;
    }
    y=y+2;
}
を、元のソースの
for(y=1; y<SizeY-1 ; y += 2 ){
    for(x=1; x<SizeX-1 ; x += 2 ){
        :
    }
}
に変えてはどうでしょうか。

(個人的には、135行もあって2重ループがあちこちにあって、コメントが皆無で開発環境も明示されていないプログラムの間違いを探せと言ったら、まともな答えが帰ってこないのも無理ないと思います。)

--- 追記

たいちうさんが43分も(23:30〜0:13)前に回答されていたのに気付かず同じ回答をしてしまいました... スルーしてください;; 編集済み


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

Name: 五反田  ..ぴよぴよ(559ポイント)   Date: 2010/06/20(日) 09:33   No:54865     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
>>たいちうさん
ありがとうございます。
無事に臨むような結果が得られました。
なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
見落としていました。

>>パコネコさん
>>ookamiさん
質問の仕方とか、書いたコードが分かりにくい感じでしたね。すいません。
自分でもところどころどうなっているのか分かりづらいと思いました。


while(y<SizeY-1){
    while(x<SizeX-1){
        :
        x=x+2;
    }
    y=y+2;


↑のコードなんですが、実はもとのソースを参考にしてartisocというソフトでvisual basic的なコードを使って、シミュレーション用のマップ生成のコードを書いていたのですが、その仕様の関係でfor文が

for x=0 to 6
      :
next x

のような書き方しか出来なかったので無理やりwhileにしようとして、さらにそれがまともに動かなかったので、自分が書いたやつをcに書き直してアドバイスを伺おうと思ったらこうなってしまったんです。
でも、artisocのほうはやっぱり掘り残しが残ってしまうorz
もう少し考えてみます。

何はともあれ皆さんアドバイスありがとうございました。


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

Name: たいちう  ..比類無きプログラマー(98,104ポイント)   Date: 2010/06/20(日) 09:53   No:54866     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
解決したのならば解決マークをチェックしてください。


> なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
> 見落としていました。

正常に動作するプログラムAと、何故か正常に動作しないプログラムBがあり、
Bのデバッグをする、という状況はよくあります。

Aは正常・Bは異常という状態を保ったまま、両者を近づけていくことで、
Bが異常になってしまう原因を絞り込むことができます。
例えば今回の場合は、AのmainからBのdigを呼んだり、その逆を試すことで、
原因はmainにあることがすぐに分かります。

今回のような小さなプログラムでは、慣れれば困難はないのですが、
もっと大きなプログラムの場合は、DF.exeというファイル比較の
フリーウェアを使ったりしながら、地道な作業を行うことになります。
原理的には必ず解決します。

「Aは正常・Bは異常という状態を保ったまま両者を近づける」ということが重要で、
少し近づけては実行して状態を確認するということを繰り返します。
i++と++iの違いとか、for(とfor (の違いとか、原因でないことが明らかなものも、
直していきます。もし可能ならば、ついでにプログラム全体を小さくすることで、
作業も楽になります。


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

Name: 五反田  ..ぴよぴよ(630ポイント)   Date: 2010/06/20(日) 10:54   No:54868 解決!     
Title: Re:穴掘り法による迷路作成アルゴリズムに関する質問    
>>たいちうさん
解決マーク忘れてました。たびたびすいません。

なるほど、正常動作するものと異常動作するものは、そうやって比較していくんですね。
プログラム全体を小さくするのはなかなか難しいんですが、頑張って正常動作するように近づけたいと思います。


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



Name: ふがふが  ..ぴよぴよ(253ポイント)   Date: 2010/06/19(土) 16:56   No:54737       
Title: 配列    
char array[5][4];
多次元配列array[1]には1〜1000までの整数が入ります。
array[1][0]=>1
array[1][1]=>null
かもしれないし、
array[1][0]=>1
array[1][1]=>0
array[1][2]=>0
array[1][3]=>0
array[1][4]=>null
かもしれません。
ランダムにしてるので私も何が入るのかわかりません。

とりあえず整数(int)配列ではなく
文字列(char)配列ということで。

そこで
arrayに1のとき(array[1][0]=>1,array[1][1]=>null)
if文で処理をしたいのですが、
どのようにしたらよろしいですか?

if(array[1] == "1")
このようにしても上手く動作しません。

初歩的なことで申し訳ないのですが
おしえてください。


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


Name: ぽこ  ..上級者(16,442ポイント)   Date: 2010/06/19(土) 17:05   No:54739     
Title: Re:配列    
> arrayに1のとき(array[1][0]=>1,array[1][1]=>null)
> if文で処理をしたいのですが、
> どのようにしたらよろしいですか?

> if(array[1] == "1")
> このようにしても上手く動作しません。

文字列の比較は関数strcmp()を使ってください。

if ( ! strcmp( array[1], "1" ) ){
// 文字列が等しい場合の処理
・・・
}


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

Name: ふがふが  ..ぴよぴよ(272ポイント)   Date: 2010/06/19(土) 17:08   No:54741 解決!     
Title: Re:配列    
>ぽこさん
ありがとうございます。


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

Name: 組木紙織  ..比類無きプログラマー(87,520ポイント)   Date: 2010/06/19(土) 17:13   No:54742     
Title: Re:配列    
とりあえず
こんな感じで
if(array[1][0] == '1' && array[1][1] == NULL)

やっていくと別の方法が欲しくなって区ので文字列操作関係の標準関数を調べてみてください。
strcmp()などの。

また。
文字と文字列の違いをしっかり把握してください。


/************************/
追記

先を越されてしまいましたね。
無意味なレスつけてすみません。 編集済み


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

Name: dic  ..比類無きプログラマー(75,451ポイント)   Date: 2010/06/19(土) 17:20   No:54743     
Title: Re:配列    
別の方法ですが
if( array[1] == "1" )
ではなく
if( array[1] == '1' )
でも できます
char の一文字の時だけですけどね


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

Name: フリオ  ..プログラマー(32,802ポイント)   Date: 2010/06/19(土) 17:58   No:54744     
Title: Re:配列    
 
 ちょっと気になったので、
char array[5][4]; 
で、 
array[1][4]=>null 
はだめです。
 


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

Name: dic  ..比類無きプログラマー(75,483ポイント)   Date: 2010/06/19(土) 18:27   No:54751     
Title: Re:配列    
あ、多次元配列ですね
if( array[0][1] == '1' )
です


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

Name: へろり  ..中級者(12,311ポイント)   Date: 2010/06/20(日) 07:22   No:54857     
Title: Re:配列    
すでに解決しているところを、重隅をつつくようで申し訳ないのですが。

文字が必要なところで null とか NULL がちらほらと出てきていますが。


nullについては、ANSI-C の規格には無いようなのでちょっとスルーしますが、新ANSI C言語辞典によれば、NULLとは次のようにあります。

NULL[ヌル](=空) (1)空ポインタ (2)[マクロ/空ポインタ定数- | <stddef.h>,<stdio.h>,<stdlib.h>,string.h>,<time.h> | 値0の汎整数定数式か、void*型にキャストした式] 空(null) ポインタを示す空ポインタ定数である。

とあります。


また空ポインタについては次の通りです。

空ポインタ(null pointer) いかなるオブジェクト(記憶域)へのポインタとも、いかなる関数へのポインタとも区別され、比較しても等しいことはないポインタ。


C言語では、ポインタが現れるべき場所に定数0が現れると、それは空ポインタであると読み替えられます。
ですから、#define NULL  0x12345 といったあまり一般的でない定義の処理系であっても、char *hoge = 0; というコードと、char *hoge = NULL; というコードは等価となります。


だもので、本来char型と比較したり代入したりする物ではないと思うのですが。
一連の流れの中で、さもあって当然のように扱われていたので、ちょっと気になった次第です。


最近の規格は解らないのですが、実際のところどうなんでしょう。


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



Name: タマ  ..ぴよぴよ(222ポイント)   Date: 2010/06/19(土) 23:11   No:54799       
Title: 奇数のみを出力するプログラム    
#include <stdio.h>
#define NMAX 10

int main(void) {
    int data1[NMAX];
    int data2[NMAX], i, cnt = 0;
    int *p1, *p2;

    p1 = data1;
    p2 = data2;

    for (i=0; i<NMAX; i++)
        scanf("%d", data1+i);

    for (i=0; i<NMAX; i++) {
●      if (data1[i]%2=1) {
●          data1[i]=data2[cnt];
●          ???????????;
            cnt++;
        }
        p1++;
    }

    p2 = data2;

    for (i=0; i<cnt; i++) {
        printf("%d\n", *p2);
        p2++;
    }

    return 0;
}
10個の数字を入力し、奇数のみを出力するプログラムを作る問題です。
●の部分は元々???しか書かれてなく、そこだけを変更するように指示されていたので
自分なりに埋めてみました。が、うまくいきませんでした…


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


Name: パコネコ  ..かけだし(1,664ポイント)   Date: 2010/06/19(土) 23:16   No:54802     
Title: Re:奇数のみを出力するプログラム    
if()って=じゃなくて==だって思っていたのですが…関係ないですか?

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

Name: パコネコ  ..かけだし(1,749ポイント)   Date: 2010/06/19(土) 23:22   No:54805     
Title: Re:奇数のみを出力するプログラム    
描写されるのはp2(data2)ですよね
つまり奇数のデータをP2に入れていくプログラムですね
data1[i]=data2[cnt]; 
逆なのでは?
これでは2のデータを1に入れているように思いました
間違ってたらごめんなさい


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

Name: fatens  ..中級者(13,801ポイント)   Date: 2010/06/19(土) 23:23   No:54806     
Title: Re:奇数のみを出力するプログラム    
=だと代入になるので、この場合は==ですね。

●の部分ですが、何のために
>p1 = data1;
>p2 = data2;
としているのか考えてみると良いのでは。



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

Name: パコネコ  ..かけだし(1,790ポイント)   Date: 2010/06/19(土) 23:25   No:54809     
Title: Re:奇数のみを出力するプログラム    
忘れてました
    for (i=0; i<NMAX; i++) { 
●      if (data1[i]%2=1) { 
●          data1[i]=data2[cnt]; 
●          ???????????; 
            cnt++; 
        } 
        p1++; 
    } 
はdata1[i]ではなくp1を使ってあらわしたほうがいいです
多分そういう問題だと思う
iとポインタをうまく使って頑張ってください


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

Name: パコネコ  ..かけだし(1,849ポイント)   Date: 2010/06/19(土) 23:29   No:54812     
Title: Re:奇数のみを出力するプログラム    
ヒントで
 for (i=0; i<NMAX; i++) 
        scanf("%d", data1+i); 
          ___
dataをp1にするかんじ
この部分が参考になると思います
余計な事だったらごめんなさい

==================
間違えてしまいました
すいません。忘れてください 編集済み


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

Name: fatens  ..中級者(13,821ポイント)   Date: 2010/06/19(土) 23:32   No:54815     
Title: Re:奇数のみを出力するプログラム    
>パコネコさん
p1++;
がありますよ。


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

Name: パコネコ  ..かけだし(1,882ポイント)   Date: 2010/06/19(土) 23:35   No:54818     
Title: Re:奇数のみを出力するプログラム    
ヒントのつもりで書いたほうですよね
ちょっと失敗
iは使わないのが「あたり」でしたね。
すいません


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

Name: タマ  ..ぴよぴよ(253ポイント)   Date: 2010/06/19(土) 23:41   No:54822     
Title: Re:奇数のみを出力するプログラム    
●の部分
        if (*(p1+i)%2==1) {
            *(p2+cnt)=*(p1+i);
こんな感じで良いでしょうか?


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

Name: fatens  ..中級者(13,860ポイント)   Date: 2010/06/19(土) 23:46   No:54824     
Title: Re:奇数のみを出力するプログラム    
>こんな感じで良いでしょうか?
●の部分にはiもcntも入りません。
 編集済み


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

Name: パコネコ  ..かけだし(2,025ポイント)   Date: 2010/06/19(土) 23:49   No:54825     
Title: Re:奇数のみを出力するプログラム    
ワイはあれでいいと思ってたけど…プリンタを使うなら
もう一つの???を使うんですね。
================
iはどっちにしても違いましたね 編集済み


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

Name: fatens  ..中級者(13,955ポイント)   Date: 2010/06/19(土) 23:55   No:54827     
Title: Re:奇数のみを出力するプログラム    
    for (i=0; i<NMAX; i++) {
●      if (data1[i]%2=1) {
●          data1[i]=data2[cnt];
●          ???????????;
            cnt++;
        }
        p1++;
    }

    p2 = data2;

この部分で、for文の中にp1++があり、外でp2 = data2としている理由を考えてみましょう。
iはただのカウンタで、cntは最後のループの上限として使うだけです。


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

Name: パコネコ  ..かけだし(2,116ポイント)   Date: 2010/06/20(日) 00:06   No:54828     
Title: Re:奇数のみを出力するプログラム    
    for (i=0; i<NMAX; i++) { 
●      if (???????%2==1) { 
●          ??????=??????; 
●          ???????????; 
            cnt++; 
        } 
        p1++; 
    } 

    p2 = data2; 

data1[i]でもできる気はしますけど…p1,p2が含まれますね全部


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

Name: タマ  ..ぴよぴよ(329ポイント)   Date: 2010/06/20(日) 00:09   No:54829     
Title: Re:奇数のみを出力するプログラム    
今の状態↓
●      if (*p1%2==1) { 
●          *p2=*p1; 
●          ???????????;
p1++はdata1内に入る数値を、順番に入れていく役割ですかね?
p2=data2は初期化しているのでしょうか?


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

Name: パコネコ  ..かけだし(2,215ポイント)   Date: 2010/06/20(日) 00:12   No:54832     
Title: Re:奇数のみを出力するプログラム    
data2のアドレスをp2に再入力?しているんですよ。多分
p2は値変わってますから
残りの??????で!
================
>p1++はdata1内に入る数値を、順番に入れていく役割ですかね? 
そうですね次のアドレスに移動?しているんですね。 編集済み


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

Name: タマ  ..ぴよぴよ(406ポイント)   Date: 2010/06/20(日) 00:35   No:54842 解決!     
Title: Re:奇数のみを出力するプログラム    
        if (*p1%2==1) {
            *p2=*p1;
            p2++;

チェックシステムに送信した所、うまくいけました。
教えてくださって、ありがとうございます!


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



Name: しろ  ..中級者(12,944ポイント)   Date: 2010/06/19(土) 19:33   No:54765       
Title: GetHitKeyStateAll_2関数について    
&DXライブラリ初心者です。

GetHitKeyStateAll_2関数がよく理解できません。(GetHitKeyStateAll関数は一応理解しています)

下記の説明は一応読んだのですが、私の理解力不足のせいか、どうもいまいち……
http://dixq.net/g/41.html

そこで、理解することはとりあえず後においといて、試しに下記のようなプログラムをつくりました。

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

(GetHitKeyStateAll_2関数を定義)


中略

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

        

           if(a_1==0){

            描画など //プログラム1
            
        }

    

        if(Key[KEY_INPUT_DOWN]==1 || a_1==0){

            a_1=1;

            描画など //プログラム2
            


        }

        if(Key[KEY_INPUT_DOWN]==1 && a_1==1){

        
            描画など //プログラム3
            

            

        }


}

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

要は↓を押せば次のif文にいく(はずの)プログラムなのですが、真ん中のプログラムがスルーされてしまいます。(通過はするのですが、↓ぼたんを押すとプログラム2は一瞬で通過し、プログラム3へ移行します)

上のプログラムと絡めながらGetHitKeyStateAll_2についてご説明していただけますと大変助かります。何とぞよろしくお願いいたします。

※一部訂正します。すいません。上のプログラムは変ですね。とりあえずプログラムはおいておいて、関数について教えてください。
 編集済み


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,220,899ポイント)   Date: 2010/06/19(土) 19:41   No:54767     
Title: Re:GetHitKeyStateAll_2関数について    
作りたいプログラムが大体解りました。
ifを連続して書くとよく陥るワナ(?)ですね。
私も困った経験が昔あります。
こういう時は

if
else if

を使います。
switch文でも出来るかもしれませんね。
以下41章に仰るプログラムを追加しました。
下ボタンが押されるたびにaの値が1つずつ増加します。


#include "DxLib.h"
 
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 WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    int a=0;

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        if( Key[KEY_INPUT_DOWN] == 1 ){
            if( a==0 ){
                a=1;
            } else if( a==1) {
                a=2;
            } else if( a==2) {
                a=3;
            } else if( a==3) {
                a=0;
            }
        }
        DrawFormatString(0,0,GetColor(255,255,255),"%d",a);
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,221,081ポイント)   Date: 2010/06/19(土) 19:46   No:54769     
Title: Re:GetHitKeyStateAll_2関数について    
普通にaを増加させればいいだけならば

if( Key[KEY_INPUT_DOWN] == 1 )
    a = (a+1) % 10;

でもいいですね。
10の値を変えれば好きな周期でループします。


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

Name: しろ  ..中級者(13,306ポイント)   Date: 2010/06/19(土) 19:58   No:54771     
Title: Re:GetHitKeyStateAll_2関数について    
ご回答ありがとうございます。

下記のようにwhile文内のプログラムを変更してみたら解決しました。

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


 if( Key[KEY_INPUT_DOWN] == 1 ){ 

            if( a_1==0 ){ 

                a_1=1; 
            }
            else if( a_1==1) { 
                a_1=2; 
            }
            else if( a_1==2) { 
                a_1=0; 
            }
            
        } 


        if(a_1==0){

            DrawGraph(35,10,select1,TRUE);
            DrawGraph(30,50,bar1,TRUE);


            DrawGraph(32,68,tuduki0,TRUE);
            DrawGraph(31,115,bar0,TRUE);

            DrawGraph(35,135,SOS_kiroku0,TRUE);
            DrawGraph(31,175,bar0,TRUE);

            
            
        }

        else if(a_1==1){
            
            DrawGraph(38,11,select0,TRUE);
            DrawGraph(30,50,bar0,TRUE);


            DrawGraph(32,68,tuduki1,TRUE);
            DrawGraph(30,115,bar1,TRUE);


            DrawGraph(35,135,SOS_kiroku0,TRUE);
            DrawGraph(31,175,bar0,TRUE);

            


        }

        else if(a_1==2){
            
        

            DrawGraph(38,11,select0,TRUE);
            DrawGraph(30,50,bar0,TRUE);


            DrawGraph(32,68,tuduki0,TRUE);
            DrawGraph(30,115,bar0,TRUE);


            DrawGraph(35,135,SOS_kiroku1,TRUE);
            DrawGraph(30,175,bar1,TRUE);

            

        }

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

しかし、なぜ解決したかが理解ができません。そもそも勉強不足のせいかelse ifとifの違いがわかりません。Cを勉強した当初は2個以上続くときはelse ifを使ってたんですが、いつのまにかifしか使わないようになってしまいました。

いろいろ教えてもらえるとうれしいです。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,221,535ポイント)   Date: 2010/06/19(土) 20:05   No:54772     
Title: Re:GetHitKeyStateAll_2関数について    
例えば

int a=1;

if( a==1 ){
  a=2;
}

上記のプログラムでは「a=2」を通りますよね?
ですから、
最後にaは2になります。

int a=1;

if( a==1 ){
  a=2;
}
if( a==2 ){
  a=3;
}

このプログラムでは最初の条件式で真になり、a=2が行われ、
2つ目のifに差し掛かった時はaが2ですから、こちらの条件文も真になってしまい、両方実行されてしまいます。
では
「aが1の時処理(1)、それ以外の場合でもしaが2なら処理(2)」
というプログラムを書いてみましょう。
ifは「もし」を、elseは「それ以外」を意味しますよね。


int a=1;

if( a==1 ){
  a=2;
}
else if( a==2 ){
  a=3;
}

ですから、上のようにに書けば、

「aが1の時処理a=2、それ以外の場合でもしaが2なら処理a=3」

となります。
ここで、最初のifに入りますから、「それ以外の場合」にはあてはまりません。
よってelse ifの条件式は評価されなくなります。

従って、最初のifの中身しか実行されず、aが2になるというわけです。


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

Name: しろ  ..中級者(13,544ポイント)   Date: 2010/06/19(土) 20:26   No:54774     
Title: Re:GetHitKeyStateAll_2関数について    
なるほど、わかりやすい説明ありがとうございました。理解できました。

ついでにといっては恐縮なのですが、上のプログラムはゲームのOP画面の制作に使っています。OPでBGMを流すためwhile文より前で


        int main_sound=LoadSoundMem( "music\\OP.mp3" );

        PlaySoundMem(main_sound, DX_PLAYTYPE_LOOP );//ループ再生

というプログラムを書きました。

        SetGraphMode(1024, 768 , 16 );    //画面サイズを変更

もその前で書いているのですがプログラムを実行すると画面が大きくなるところで一瞬固まります。(その後は問題なくwhile文に入ります)。ちなみに上にある最初の2行を書かないと、固まる症状は発生しません。

これはどうしようもない現象なのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,222,358ポイント)   Date: 2010/06/19(土) 21:07   No:54778     
Title: Re:GetHitKeyStateAll_2関数について    
まず、SetGraphMode関数の仕様を確認してみましょう。

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html こちらで
「SetGraphMode」で検索してみて下さい。

何やら注意事項が出てきませんか?

省略しますので確認しておいてくださいね。

この関数はDxLib_Iniの前に呼ぶ必要があります。
もし呼んでから使用したい場合は、全てのロードしたデータをリロードしなければなりません。


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

Name: しろ  ..中級者(13,569ポイント)   Date: 2010/06/19(土) 22:20   No:54790 解決!     
Title: Re:GetHitKeyStateAll_2関数について    
いろいろありがとうございました。

早速確認してみます。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +