C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   テンプレートメタプロ ....   
     ・[7235] Justy 
     ・[7236] 組木紙織 
     ・[7237] Justy 
     ・[7240] 組木紙織 
     ・[7243] Justy 
   またまた・・・・・   
     ・[7222] 組木紙織 
     ・[7226] 大工 
     ・[7227] box 
     ・[7228] 大工 
     ・[7229] なぎ 
     ・[7230] 大工 
     ・[7239] なぎ 
     ・[7242] 大工 
   ウィンドウのクライア ....   
     ・[7224] Justy 
     ・[7225] GPGA 
     ・[7238] ルファー 
   境界調整について   
     ・[7233] box 
   N-Queen   
     ・[7231] 管理人 
   ×ボタンで終了しても ....   
     ・[7216] Justy 
     ・[7217] ariel 
   いったいどっちが・・ ....   
     ・[7210] なぎ 
     ・[7214] 大工 
   C言語レベル多分7です ....   
     ・[7053] Justy 
     ・[7055] 2年生 
     ・[7056] むつ 
     ・[7059] 2年生 
     ・[7061] Justy 
     ・[7064] 2年生 
     ・[7065] むつ 
     ・[7066] Justy 
     ・[7070] Justy 
     ・[7081] 2年生 
     ・[7083] Justy 
     ・[7130] 2年生 
     ・[7131] りむ 
     ・[7152] 2年生 
     ・[7154] Justy 
     ・[7179] 2年生 
     ・[7184] Justy 
     ・[7213] 2年生 
   テキストリーダーを作 ....   
     ・[7202] なぎ 
     ・[7203] 雪中 蓮 
     ・[7204] バグ 
     ・[7209] なぎ 
     ・[7211] 雪中 蓮 
   雑談スレ//VS2005 C#が ....   
     ・[7206] 管理人 
     ・[7207] バグ 
   サンプル用実行フォル ....   
     ・[7191] 管理人 
   構造体リスト   
     ・[7128] box 
     ・[7134] 管理人 
     ・[7137] 困ったさん 
     ・[7139] なぎ 
     ・[7141] 困ったさん 
     ・[7190] 管理人 
   Audioの入力   
     ・[7186] Justy 
     ・[7188] mac 
   NULL領域について   
     ・[7158]   
     ・[7160] なぎ 
     ・[7161] 大工 
   遅い処理を速くする方 ....   
     ・[7107] Justy 
     ・[7108] ま〜く 
     ・[7111] meigin 
     ・[7112] keichan 
     ・[7113] keichan 
     ・[7118] meigin 
     ・[7132] Justy 
     ・[7135] meigin 
     ・[7146] meigin 
     ・[7147] keichan 
     ・[7148] Justy 
     ・[7150] meigin 
     ・[7156] Justy 
     ・[7159] meigin 
   INIファイルの値をタイ ....   
     ・[7098] ま〜く 
     ・[7100] ルファー 
     ・[7101] バグ 
     ・[7126] ルファー 
     ・[7144] Blue 
     ・[7151] ルファー 
   malloc関数について   
     ・[7116] keichan 
     ・[7117] keichan 
     ・[7124] 困ったさん 
     ・[7127] box 
     ・[7129] 困ったさん 
     ・[7136] 困ったさん 
     ・[7149] なぎ 
   ループ処理について…   
     ・[7138] なぎ 
     ・[7140] にゃんこ 
     ・[7142] なぎ 
     ・[7143] なぎ 
   初めまして   
     ・[6951] box 
     ・[6952] @とんぷぅ〜 
     ・[6953] バグ 
     ・[6954] @とんぷぅ〜 
     ・[6955] バグ 
     ・[6956] @とんぷぅ〜 
     ・[6959] フリオ 
     ・[6962] 組木紙織 
     ・[7001] @とんぷぅ〜 
     ・[7002] バグ 
     ・[7003] @とんぷぅ〜 
     ・[7008] Hermit 
     ・[7009] @とんぷぅ〜 
     ・[7010] @とんぷぅ〜 
     ・[7011] Hermit 
     ・[7029] @とんぷぅ〜 
     ・[7037] Hermit 
     ・[7038] Justy 
     ・[7039] GPGA 
     ・[7040] @とんぷぅ〜 
     ・[7041] Justy 
     ・[7042] @とんぷぅ〜 
     ・[7043] GPGA 
     ・[7046] Justy 
     ・[7047] Hermit 
     ・[7052] Justy 
     ・[7058] Hermit 
     ・[7091] @とんぷぅ〜 
     ・[7096] Hermit 
     ・[7102] @とんぷぅ〜 
     ・[7114] @とんぷぅ〜 
     ・[7123] @とんぷぅ〜 
   ディレクトリの一括削 ....   
     ・[7120] box 
     ・[7121] GPGA 
     ・[7122] バグ 
   ファイルに関する質問 ....   
     ・[7005] Justy 
     ・[7006] GPGA 
     ・[7024] バグ 
     ・[7028] ま〜く 
     ・[7031] GPGA 
     ・[7032] バグ 
     ・[7033] Justy 
     ・[7034] GPGA 
     ・[7035] バグ 
     ・[7036] Justy 
     ・[7044] バグ 
     ・[7045] Justy 
     ・[7049] ま〜く 
     ・[7054] Justy 
     ・[7057] ま〜く 
     ・[7063] Justy 
     ・[7067] ま〜く 
     ・[7071] Justy 
     ・[7072] ま〜く 
     ・[7073] 大工 
     ・[7079] Justy 
     ・[7080] バグ 
     ・[7082] Justy 
     ・[7084] バグ 
     ・[7103] Justy 
   stringクラスについて   
     ・[7092] バグ 
     ・[7093] GPGA 
     ・[7094] バグ 
     ・[7095] keichan 
   画像処理について。   
     ・[7078] ぽん太 
     ・[7088] asd 
     ・[70771178689791] らんえぼ 
     ・[70771178695606] asd 
   ネストについて   
     ・[7068] Justy 
     ・[7069] 大工 
     ・[7086] なぎ 
     ・[7087] 大工 
   敵弾幕について質問で ....   
     ・[6871] 管理人 
     ・[6874] 管理人 
     ・[6876] kaoru 
     ・[6877] 管理人 
     ・[6878] 管理人 
     ・[6884] 管理人 
     ・[6886] 管理人 
     ・[6889] kaoru 
     ・[6891] 管理人 
     ・[6892] 管理人 
     ・[6893] kaoru 
     ・[6894] 管理人 
     ・[6896] kaoru 
     ・[6900] 管理人 
     ・[6901] 管理人 
     ・[6907] kaoru 
     ・[6908] 管理人 
     ・[6911] kaoru 
     ・[6912] 管理人 
     ・[6913] kaoru 
     ・[6914] 管理人 
     ・[6957] kaoru 
     ・[6958] 管理人 
     ・[7048] kaoru 
     ・[7076] 管理人 
   BBC Developerについ ....   
     ・[7007] 管理人 
     ・[7050] toyo 
   コンパイルすると出て ....   
     ・[6824] Justy 
     ・[7012] @とんぷぅ〜 
     ・[7014] Justy 
     ・[7025] @とんぷぅ〜 
     ・[7026] keichan 
     ・[7027] keichan 
     ・[7030] @とんぷぅ〜 
   配列に順列を入れてル ....   
   2進数表示   
     ・[6964] asd 
     ・[6965] Sena 
     ・[6966] box 
     ・[6967] ぽん太 
     ・[6968] ぽん太 
     ・[6969] フリオ 
     ・[6970] Justy 
     ・[6984] Sena 
     ・[7015] Justy 
   音の操作について   
     ・[6920] 管理人 
     ・[6929] 黒猫 
     ・[6932] 管理人 
     ・[6983] 黒猫 
     ・[6986] 管理人 
     ・[6987] 管理人 
     ・[6988] GPGA 
     ・[6989] 黒猫 
     ・[6993] 管理人 
   質問です。   
     ・[6973] 管理人 
     ・[6974] とんぷ 
     ・[6975] 管理人 
     ・[6982] hoge 
   F5を押しても・・・   
     ・[6867] 管理人 
     ・[6869] 楓華 
     ・[6872] 楓華 
     ・[6880] 管理人 
     ・[6882] 楓華 
     ・[6883] 管理人 
     ・[6919] 楓華 
     ・[6940] 管理人 
     ・[6977] 楓華 
     ・[6978] 管理人 
     ・[6979] 楓華 
     ・[6980] Justy 
     ・[6981] 楓華 
   これって必然?   
     ・[6739] box 
     ・[6770] なぎ 
     ・[6771] box 
     ・[6971] fumu 
   無題   
     ・[6961] 管理人 
   doubleの表示について   
     ・[6925] Blue 
     ・[6926] box 
     ・[6927] box 
     ・[6928] Sena 
     ・[6930] box 
     ・[6931] フリオ 
     ・[6950] Sena 
   たびたびすみません。 ....   
     ・[6945] Blue 
     ・[6946] Blue 
     ・[6947] ももた 
     ・[6948] Blue 
   リンク処理についての ....   
     ・[6899] box 
     ・[6902] 大工 
     ・[6905] box 
     ・[6906] 大工 
     ・[6933] box 
     ・[6936] 大工 
     ・[6937] box 
     ・[6943] 大工 
   始めから躓いてしまっ ....   
     ・[6801] 雷 
     ・[6806] 管理人 
     ・[6862] kgm 
     ・[6863] 管理人 
     ・[6916] kgm 
     ・[6939] 管理人 
   fscanfとsscanfについ ....   
     ・[6918] box 
     ・[6938] けろりん 
   char型の関数について   
     ・[6870] Blue 
     ・[6879] 管理人 
     ・[6885] ben@ 
     ・[6887] 管理人 
     ・[6888] ben@ 
     ・[6898] むつ 
     ・[6904] 管理人 
   計算誤差について   
     ・[6855] 管理人 
     ・[6903] 大工 
   配列数についての質問   
     ・[6848] Justy 
     ・[6851] けんた 
     ・[6854] 管理人 
     ・[6873] けんた 
   キャラクターを歩かせ ....   
     ・[6837] バグ 
     ・[6858] ししん 
     ・[6864] バグ 

Name: 組木紙織  ..中級者(13,906ポイント)   Date: 2007/04/29(日) 15:18   No:7234       
Title: テンプレートメタプログラミング    
現在c++によるテンプレートメタプログラミングについての書籍、サイトを探しているのですが、
ほとんど見つかりません。
見つかったのも十分に説明がなく、これから始めようと思っている私には分からないものばかりです。
テンプレートメタプログラミングについてこれから始めようを思っている人を対象にして書かれているものを知りませんか?

言語は日本語、英語問いません。
出来ればソースコードもしっかりと乗っていて詳しく説明がついているものをお願いします。


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


Name: Justy  ..比類無きプログラマー(90,843ポイント)   Date: 2007/04/29(日) 15:46   No:7235     
Title: Re:テンプレートメタプログラミング    
>ほとんど見つかりません
 本格的になればなるほど第三者には何のコードだからさっぱりになるので
有名なテクニックではあれど、現場ではあまり使われませんからねぇ。

 いくつか探したと言うことでしたが、

Modern C++ Design
http://www.amazon.co.jp/dp/4894714353

 これはダメでしたか?
 多分日本語の書籍でまともに扱っているのは、今のところこれくらいしかないと思います。
 かなり丁寧に書いてあったので、判りやすいですよ。


C++ Template Metaprogramming
http://www.amazon.co.jp/dp/0321227255

 洋書ですがこれもお勧め。


 Webはあんまり知らないですが、これなんてどうでしょう。
http://d.hatena.ne.jp/yotto-k/20061225

 中身は全部読んでませんがここの pdfは結構丁寧に書かれていたような。


 後は Lokiとか boost(mpl/lambda/spirit)関連を扱ってるサイトを探せば
いくつか見つかるかと思います。


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

Name: 組木紙織  ..中級者(13,645ポイント)   Date: 2007/04/29(日) 16:35   No:7236     
Title: Re:テンプレートメタプログラミング    
お返事ありがとうございます。

書籍に関しては、店頭にまったくおいていないので、評判を聞いてからにしようと決めてました。
とりあえずは
>Modern C++ Design
を注文しようかなと思います。


>Webはあんまり知らないですが、これなんてどうでしょう。
http://d.hatena.ne.jp/yotto-k/20061225

そこのサイトは見つけて、見たのですが、boostを利用してという内容だったように思います。
今やろうと思っていることは、STL以外を使わないようにというつもりだったので、boostを利用していたので
別のサイトを探していました。

しばらくこれらの内容で頑張ってみます。


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

Name: Justy  ..比類無きプログラマー(91,088ポイント)   Date: 2007/04/29(日) 17:02   No:7237     
Title: Re:テンプレートメタプログラミング    
STL以外を使わないようにというつもりだったので、boostを利用していたので
別のサイトを探していました

 なるほど。

 そういうことですと、"Modern C++ Design"もちょっとマズイかもしれません。
 この pdfと同じように TMPの基本から説明はしていますが、結局は Lokiの解説になっていますから。

 店頭にあれば手に取ってみて見てみることができますが、店頭にないとなると
もう少しネットの書評とかを見てからの方がいいかもしれません。


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

Name: 組木紙織  ..中級者(13,656ポイント)   Date: 2007/04/29(日) 19:16   No:7240     
Title: Re:テンプレートメタプログラミング    
>そういうことですと、"Modern C++ Design"もちょっとマズイかもしれません。
>この pdfと同じように TMPの基本から説明はしていますが、結局は Lokiの解説になっていますから。

そうですか。単純にc++の基本機能だけでTMPを学びたいと思っただけなのですが。
boostやLokiにも手を出したほうがいいのかな。

かなり一般的に使われているとおもうのですが、職業でないので開発効率はほとんど気にする必要はなく、
自分で実装して初めて学習できる部分もあると思うので、あまり手を出したくはないのです。

>C++ Template Metaprogramming
を入手して頑張ってみようかな。
英語のプログラムの専門書はまだ読んだことがないので、その練習にもなるし。


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

Name: Justy  ..比類無きプログラマー(91,565ポイント)   Date: 2007/04/29(日) 22:30   No:7243     
Title: Re:テンプレートメタプログラミング    
 今の C++で boost/Lokiに全く触れずに TMPを学ぶのはちょっと難しいと思います。
 浅いレベルならともかく深いところは特に。

 "C++ Template Metaprogramming"も中は boostがガンガン出てきます。
3章のサンプル
http://boost-consulting.com/mplbook/metafunctions.html


自分で実装して初めて学習できる部分もあると思うので
あまり手を出したくはないのです
 では、「使う」方向ではなくて、両ライブラリを「研究」して、
TMPを学んでいってはどうでしょうか。

 私も最初に触れたとき、"Modern C++ Design"と Lokiの実装を見ながら
納得がいくまで Lokiを改変してみたり、自分で実装したりして覚えました。


 ただ boostの方はコードが読みづらいので、中身の実装より何をどう利用しているのかとか
最終的にユーザーにどう書かせるのか、どういうクラスがあって
どう組み合わせることで何を実現しているのか、などの仕組みの部分に
注目していくと、自分で書くときに参考になりますね。

 実際、boost::serializationを参考にして(それよりも遙かに低機能な)
超簡易シリアライズライブラリを作ったことがあります。
 serializationの実装がどうなっているかではなく、serializationの
機能(仕様とかユーザーの利用方法など)を把握した上で
そこから実装を推測して、それに近い機能・使わせ方に
なるよう自分で書いていくのは、なかなか勉強になりました。


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



Name: 大工  ..上級者(17,439ポイント)   Date: 2007/04/28(土) 12:27   No:7221       
Title: またまた・・・・・    
基本的なことですみません・・・^^:

自己参照構造体の質問です><。


struct node_tag{
int value;
struct node_tag *next;
}


手持ちの本では「参照先の型が何であろうとも、常にその大きさが決まっているので、構造体メンバの中に自分自身と同じ型のポインタを含めることができるのです。」とありました。

ググってみてもパッとしない理由ばっかりで・・・・struct node_tag next としてはいけない理由は分かるのですが(理由:この時点ではstruct node_tag の大きさがわからないから → 間違ってたらご指摘おねがいします。)派生型(?)だからいいのか? と思うようになりました。

詳しい説明お願いできますでしょうか?


お願いします。m(。。)mペコッ


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


Name: 組木紙織  ..中級者(13,688ポイント)   Date: 2007/04/28(土) 13:46   No:7222     
Title: Re:またまた・・・・・    

struct node_tag{
int value;
struct node_tag *next;
}

の構造体の場合、
[構造体のサイズ] = [intのサイズ] + [構造体へのポインタのサイズ]
となります。
(実際とは違うが、説明の為に単純化していると考えてください。)

intのサイズも、構造体へのポインタのサイズもあらかじめコンパイラは知っているので
構造体のサイズもコンパイラは知ることができ、構造体を作ることができます。
(x = 4 + 2)と同じような感じです。


struct node_tag{
int value;
struct node_tag next;
}

ポインタでない場合ですが、
[構造体のサイズ] = [intのサイズ] + [構造体のサイズ]
となります。
この場合は、あらかじめコンパイラが構造体のサイズを知らないのもありますが、
(コンパイラはこの時点でエラーを出す。)
構造体のサイズはどんなに頑張っても出すことはできません。
(x = 4 + x)のxを求めよ。と同じような感じです。

よって構造体のメンバに自分自身を置くことはできない。
となります。

こんな感じの説明しかできませんが分かりますでしょうか?

>派生型(?)
cの内容なので継承の概念はないと思います。この場合はポインタ型と考えるべきだと思います。


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

Name: 大工  ..上級者(17,538ポイント)   Date: 2007/04/28(土) 20:08   No:7226     
Title: Re:またまた・・・・・    
>intのサイズも、構造体へのポインタのサイズもあらかじめコンパイラは知っているので
>構造体のサイズもコンパイラは知ることができ、構造体を作ることができます。

int型ならまだしも構造体へのポインタのサイズをコンパイラが知っているのが納得いきません><。

構造体は人それぞれが違うものを作るんで大きさは違うはずじゃあ・・・・・・


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

Name: box  ..比類無きプログラマー(64,480ポイント)   Date: 2007/04/28(土) 20:37   No:7227     
Title: Re:またまた・・・・・    
sizeof(char *)
sizeof(int *)
sizeof(double *)
sizeof(struct 何とか *)
sizeof(struct かんとか *)
...

これらは、すべて同じです。
「何かの」型を指すポインタ用に確保する領域の大きさは、
その処理系内で不変です。


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

Name: 大工  ..上級者(17,551ポイント)   Date: 2007/04/28(土) 21:23   No:7228 解決!     
Title: Re:またまた・・・・・    
> これらは、すべて同じです。
> 「何かの」型を指すポインタ用に確保する領域の大きさは、
> その処理系内で不変です。


そうだったんですか!!!

解説ありがとうございます。


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

Name: なぎ  ..上級者(22,138ポイント)   Date: 2007/04/28(土) 21:58   No:7229     
Title: Re:またまた・・・・・    
既に解決している問題ではありますが……

実はこれは、もう少し込み入った事情があります。
一般的に、再帰的な構造は定義できないのですね。

struct node_tag
{
int value;
struct node_tag next;
};

というのが定義できたと仮定しましょう。(ポインタでなく)

struct node_tag x;
という定義は何を引き起こすでしょうか?

構造体ですから、この時点で、
x.value;
x.next;
という2つのメンバーには(自動的に)アクセス可能となります。
ところが後者は struct node_tag 自身ですから、さらに、
x.next.value;
x.next.next;
というメンバーにも(自動的に)アクセス可能なはずです。

以下、同様にして、
x.next.next.value;
x.next.next.next.value;
x.next.next.next.next.value;
というすべての階層に渡ってアクセス可能であることを保証しなければなりません。
つまり、上記の x のサイズは、「無限大」にならざるを得ないのです

これは、ポインタを経由した場合でも、概念的には
x->next->next->next->next->next->next->next->next->value
などにアクセス可能であることと同様です。
ただし、こちらの場合には、各 next には、プログラム上で領域を確保する必要があります。
つまり、(すべての階層ではなくて)明示的に領域を確保した階層までのアクセスを保証すればいいわけです。

このように、再帰的な構造は必然的に、無制限な階層へのアクセスを求めます。
このため、たとえ、構造体のサイズを事前に決定する方法があったとしても、自分自身をメンバーに含む構造体は定義できないのです。


また、構造体のポインタサイズがあらかじめ決定可能であることは、自己参照だけではなく相互参照も可能にします。


struct typeB;

struct typeA
{
int value;
struct typeB *next;
};

struct typeB
{
int value;
struct typeA *next;
};

のようにお互へのポインタをメンバーとする場合、どちらを先に定義しても、未定義な構造体へのポインタが必要となります。
この場合、最初の struct typeB; のように、構造体のタグ名だけを宣言することができます。
これなど、メンバーの具体的な情報が全くないのに、ポインタは定義できるという例になっています。




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

Name: 大工  ..上級者(17,596ポイント)   Date: 2007/04/29(日) 00:15   No:7230     
Title: Re:またまた・・・・・    
むむむむ・・・・

こんな深い話があったなんて・・・・

いったいどこでこんな内容を知ったんですか?


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

Name: なぎ  ..上級者(22,329ポイント)   Date: 2007/04/29(日) 17:51   No:7239     
Title: Re:またまた・・・・・    
> いったいどこでこんな内容を知ったんですか?

いや、それはわからないんですね。いろいろなところからといいますか、どこだかわからないといいますか。
ただ、時々紹介している、

http://www.kouno.jp/home/c_faq/
(C言語 FAQ)は、何度か通読しています。

あと、どこかの段階で専門書
『プログラミング言語C++』
http://www.bk1.co.jp/product/01597800/
とか、
『Effective C++』
http://www.bk1.co.jp/product/2674464
『C++の設計と進化』
http://www.bk1.co.jp/product/2491914
などを読むのは役に立つと思います。




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

Name: 大工  ..上級者(17,605ポイント)   Date: 2007/04/29(日) 21:11   No:7242     
Title: Re:またまた・・・・・    
はい!ありがとうございます。

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



Name: ルファー  ..入門者(3,462ポイント)   Date: 2007/04/28(土) 14:53   No:7223       
Title: ウィンドウのクライアントサイズ    
すいませんアプリケーション起動時のウィンドウのクライアントサイズをぴったり640x480にしたいんですが
どうもうまくいきません。
どうすれば良いんですか?
#include <windows.h>

static TCHAR AppName[274];
HANDLE hFile;
DWORD dwBytes;
BITMAPFILEHEADER bmpFileHeader;
BITMAPINFO bmpInfo;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
static strPath[MAX_PATH];
HDC hdc, hBuffer;
PAINTSTRUCT ps;
LPCREATESTRUCT lpcsWnd;
static HBITMAP hBitmap;
int iScan = 1;
static BYTE * bPixelBits;
const int WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount + 31)/ 32);
switch (msg)
{
case WM_DESTROY:
CloseHandle(hFile);
free(bPixelBits);
PostQuitMessage(0);
return 0;
case WM_CREATE:
bPixelBits = (BYTE *) malloc (WIDTH);
CreateCompatibleDC(hdc);
hBitmap = LoadBitmap(((LPCREATESTRUCT)lp)->hInstance, TEXT("Launcher"));
GetCurrentDirectory(MAX_PATH, strPath);
wsprintf(strPath, TEXT("%s\\%s"), strPath, TEXT("Game.ini"));
GetPrivateProfileString(TEXT("Game"), TEXT("Title"), TEXT("Game"), AppName, 274, strPath);
wsprintf(AppName, TEXT("%s Launcher"), AppName);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for(; iScan <= bmpInfo.bmiHeader.biHeight; iScan++)
{
ReadFile(hFile, bPixelBits, WIDTH, &dwBytes, NULL);
SetDIBitsToDevice(hdc, 0, 0, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, 0, 0, iScan, 1, bPixelBits, &bmpInfo, DIB_RGB_COLORS);
}
SetFilePointer(hFile, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER), NULL, FILE_BEGIN);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS winc;
hFile = CreateFile("Launcher.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) return 1;
ReadFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
if (bmpFileHeader.bfType != 0x4D42) {
MessageBox(NULL, TEXT("This is not a bitmap file"), NULL, MB_OK);
return 1;
}
ReadFile(hFile, &bmpInfo, sizeof (BITMAPINFOHEADER), &dwBytes, NULL);
winc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("MAIN");
if(!RegisterClass(&winc)) return 0;
hwnd = CreateWindow(TEXT("MAIN"), TEXT(""), WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) - (GetSystemMetrics(SM_CXFIXEDFRAME) + GetSystemMetrics(SM_CXEDGE) + 640)) / 2, (GetSystemMetrics(SM_CYSCREEN) - (GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYEDGE) + 480)) / 2, GetSystemMetrics(SM_CXFIXEDFRAME) + GetSystemMetrics(SM_CXEDGE) + 640, GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYEDGE) + 480, NULL, NULL, hInstance, NULL);
SetWindowText(hwnd, AppName);
if (hwnd == NULL) return 0;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}


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


Name: Justy  ..比類無きプログラマー(91,240ポイント)   Date: 2007/04/28(土) 15:10   No:7224     
Title: Re:ウィンドウのクライアントサイズ    
 AdjustWindowRect()を使って計算してみてはどうですか?

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

Name: GPGA  ..プログラマー(32,294ポイント)   Date: 2007/04/28(土) 15:12   No:7225     
Title: Re:ウィンドウのクライアントサイズ    
メニューもスクロールバーも無いのであれば AdjustWindowRect 関数を使用するのが楽だと思います。


RECT rect;

SetRect(&rect, 0, 0, 640, 480);
AdjustWindowRect(&rect, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, FALSE);

int width = rect.right - rect.left; // この変数をCreateWindowのウインドウの幅に該当する部分に当てる
int height = rect.bottom - rect.top; // この変数をCreateWindowのウインドウの高さに該当する部分に当てる
 


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

Name: ルファー  ..入門者(3,488ポイント)   Date: 2007/04/29(日) 17:46   No:7238 解決!     
Title: Re:ウィンドウのクライアントサイズ    
ありがとうございました。ホントにピッタリになりました。

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



Name: りな  ..ぴよぴよ(26ポイント)   Date: 2007/04/29(日) 08:15   No:7232       
Title: 境界調整について    
おはようございます。初めて投稿させていただきます。
境界調整って知っていますか?構造体なんかで使うみたいなのですが。
どなたか知ってる人がいたら教えて下さい。


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


Name: box  ..比類無きプログラマー(64,571ポイント)   Date: 2007/04/29(日) 09:19   No:7233     
Title: Re:境界調整について    
ここの情報が参考になるかもしれません。

「境界調整」「アラインメント」あたりのキーワードで
ググってみるとよいでしょう。



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



Name: 山田  ..かけだし(1,076ポイント)   Date: 2007/04/28(土) 09:36   No:7218       
Title: N-Queen    
#include <stdio.h>

#define N 20

void print_queens(int Q[N][N],int n)
{
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(Q[i][j]==1)
printf("1");
else if(Q[i][j]==0)
printf("0");
}
printf("\n");
}
}

int check(int i,int j,int Q[N][N], int n){
int I,J;
int sum=0;

/*yoko*/
for(J=0;J<n;J++)
if(Q[i][J]==1 && J!=j)
sum++;

/*tate*/
for(I=0;I<n;I++)
if(Q[I][j]==1 && I!=i)
sum++;



/*naname*/
for(I=0;I<n;I++ ){
for(J=0;J<n;J++){
if(i+j==I+J && Q[I][J]==1 && J!=j && I!=i)
sum++;
}
}

for(I=0;I<n;I++ ){
for(J=0;J<n;J++){
if(i-j==I-J && Q[I][J]==1 && J!=j && I!=i)
sum++;
}
}
return (sum);
}


int success(int Q[N][N],int n){
int done=0;
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(check(i,j,Q,n)>0 && Q[i][j])
done==1;
}
}
return(done);
}



int main(void){
int Q[N][N], P[N],n;
int kensaku=1,flag;
int i,j,I,J,a;

printf("クイーンの数を入力しなさい\n");
scanf("%d",&n);

for(i=0;i<n;i++){
for(j=0;j<n;j++){
Q[i][j]=0;
P[i]=0;
}
}

for(i=0;i<n;i++){
for(j=P[i];j<n;j++){
if( check(i,j,Q,n)==0){
Q[i][j]=1;
P[i]=j;

while( flag==1 ){
kensaku++;
flag=0;
}break;
}



}
while( j==n ){
P[i]=0;
j=P[--i];
Q[i][j]=0;
P[i]++;
i--;
flag=1;}


}
if(success(Q,n)==1);{
print_queens(Q,n);
printf("kaisu:%d\n",kensaku);
}
return(0);
}
 
 


----------------------------------------------------------------------------------------------------
実際にこのプログラムで正常に結果は出るのですが、main文の中の二番目のwhile文のi++がプログラムの中でどのような意味を持つのかを教えてほしいです。
これだけがどうしてもわからず悩んでいます。
わかる方がいれば解答お願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(302,154ポイント)   Date: 2007/04/29(日) 02:02   No:7231     
Title: Re:N-Queen    
こんにちは、おかしい箇所がパッと見2箇所あります。

  for(i=0;i<n;i++){ 

for(j=0;j<n;j++){
if(check(i,j,Q,n)>0 && Q[i][j])
done==1;
}
}
 
 
このdoneの比較は代入の間違いですよね?


 if(success(Q,n)==1);{


ここのif文は意味が有りません。
カッコの対応があっているのでコンパイルは通りますが、条件分岐しません。

どのような仕様のものなのか全然わからないので、はっきりいえませんが、
defineで定義されているN以上の数値が入力される事は絶対ないんですか?
もしあるなら用意した配列以上の要素をさす場合があるので、条件分岐させてN以上ならエラーとしましょう。

また、長いプログラムを貼り付けるときは、どんなアルゴリズムなのか、何をするプログラムなのか最低限書いてください。
お願いします。

またローカル変数a,j,Iは一度も使われていません。エラーや警告は出ないように修正してからアップしてください。


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



Name: ariel  ..ぴよぴよ(111ポイント)   Date: 2007/04/27(金) 23:16   No:7212       
Title: ×ボタンで終了してもうまく終わりません    
初めまして。arielと申します。
以前からこちらのサイトは参考にさせていただいておりましたが、質問するのは初めてです。

早速質問です。

現在、DXライブラリとそのサンプルコードを利用して、サウンドノベル風文字列表示のプログラムを作っています。
文字表示などはだましだまし動くようにできたのですが、ウィンドウの『×』ボタンでプログラムを終了した際、
ウィンドウは閉じるのですが、プロセス上では終了していない状態になってしまいます。
(VC++.net上で実行→終了した場合、ウィンドウは閉じても『デバッグ中止』のボタンがついている状態)

ソースを何度も見直してみたのですが、どこに問題があるのか解らなかったので、質問させていただきました。
ソースの方も添付いたしますので、ヒントだけでもいただけると幸いです。


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


Name: Justy  ..比類無きプログラマー(91,218ポイント)   Date: 2007/04/28(土) 01:05   No:7216     
Title: Re:×ボタンで終了してもうまく終わりません    
プロセス上では終了していない状態になってしまいます
 ProcessMessage()がアプリケーションが終了した(或いはエラーが発生した)ことを伝えているのに
その指示に従ってアプリを終了しようとしていないのが原因でしょう。

 ×ボタンが押された場合アプリを終了する必要があるので ProcessMessage()は戻り値として
-1を戻します。

 main関数側では ProcessMessage()が 0以外になれば whileループの実行を抜け、
 そのまま main関数を終了しますが、StShori::shori()内の whileループは
ProcessMessage()が -1を返しても、それを無視してループを継続しようとしています。

 その為いつまで経ってもアプリを終了することができないと思われます。


#根本的にこの規模のプログラムで ClearDrawScreen/ScreenFlip/ProcessMessageが
ソースの複数箇所に登場しなければならない作り方はかなり特殊な感じがします。
 1カ所に纏めてみては?


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

Name: ariel  ..ぴよぴよ(168ポイント)   Date: 2007/04/28(土) 01:26   No:7217 解決!     
Title: Re:×ボタンで終了してもうまく終わりません    
ありがとう御座いました。
なるほど、そこを見逃していたのですね…勉強不足でした。

While文の方は修正したので、次は
ClearDrawScreen/ScreenFlip/ProcessMessageを一箇所に纏めるような形に修正してみようと思います。


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



Name: 大工  ..上級者(17,038ポイント)   Date: 2007/04/27(金) 21:47   No:7208       
Title: いったいどっちが・・・・    
double型 とfloat型についての質問です。

超初歩的なことで申し訳ないんですが・・・・

printf 関数でdouble型を出力するときに %f か %lf かを使うかで迷います。

あるサイトでは「double型なら%fを使えばいい、%lfは間違い」とあり、違うサイトでは「%f、%lfどちらでもよい(または、l←エル は省略可)」とありました。

いったいどちらを信用したらよいのでしょうか??



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


Name: なぎ  ..上級者(21,460ポイント)   Date: 2007/04/27(金) 22:12   No:7210     
Title: Re:いったいどっちが・・・・    
printf() では、"%f" が正解です。(double も float も)
scanf() では、double * は、"%lf", float * は、"%f" です。

実は、printf() のような、「可変長引数」の関数では、float を渡すと、無条件に double に格上げされます。
解説は、
http://www.kouno.jp/home/c_faq/c15.html
など。

ですから、printf() では、float を渡しても、double を渡しても、double に変換されます。
そして、double は、"%f" という書式指定子が対応しています。

一方で、scanf() の場合は、事情が異なります。
scanf() はポインタを受け取ります。ですから、float * を double * に変換するようなことはできません。
ですから、scanf() では、float * と double * は区別する必要があります。
それぞれの(scanf() における)書式指定子は "%f" と "%lf" です。



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

Name: 大工  ..上級者(17,070ポイント)   Date: 2007/04/27(金) 23:46   No:7214     
Title: Re:いったいどっちが・・・・    
なぎ 様>>>>>

なるほど!ありがとうございます。



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



Name: 2年正  ..ぴよぴよ(983ポイント)   Date: 2007/04/21(土) 14:35   No:7051       
Title: C言語レベル多分7です。ダッシュについて。    
今学校っでアクションRPGを作成することになり、私は先頭システムのメインプログラマになりました。
そこで戦闘中のダッシュ判定で苦しんでいます。
DXライブラリを使いタイム関数を使い、キーを押してる時間を検出してダッシュかどうかを判定してます。
ここでの問題はPCの性能が低かったり、ゲーム中に急に処理が重たくなったりしたときに、ダッシュと歩行を
繰り返してしまうと言うことです。
アルゴリズムの考え方じたいを新しくする必要があるのは分かるのですが、新しいアルゴリズムが浮かんできません、何かヒントでもいいので指摘をお願いします。
パット関数はキーボードを入力したらそれに対して値を返す。
キーに何も入力しないとパット関数は0を返す。
アニメカウントは関数に入ってくる前に+1されてくる。

■変数key = パット関数
|▲上 = パット関数
||自キャラ座標上下 = 時キャラ座標 - 4
|+――――――
|▼
|▲下 = パット関数
||自キャラ座標上下 = 時キャラ座標 + 4
|+――――――
|▼

|▲右 = パット関数
||画像送り数 = ダッシュ判定関数(key)
||▲580 > 自キャラ座標左右
|||▲画像送り数 != 0
||||自キャラ左右座標=自キャラ左右座標+6
|||+――――――――――――――――――
||||自キャラ左右座標=自キャラ左右座標+3
|||▼
||+―――――――――――――――――――――――
|||▲画像送り値 != 0 
||||背景ダッシュモード値 = 2;
|||+―――――――――――――――
|||▼
||▼
||柱座標左右=柱画像左右+(3+背景ダッシュモード値)
||背景座標左右=背景座標左右+(1+背景ダッシュモード)
||画像送り値=画像送り値+9
|▼

|▲左 = パット関数
||画像送り数 = ダッシュ判定関数(key)
||▲30 < 自キャラ座標左右
|||▲画像送り数 != 0
||||自キャラ左右座標=自キャラ左右座標−6
|||+――――――――――――――――――
||||自キャラ左右座標=自キャラ左右座標−3
|||▼
||+―――――――――――――――――――――――
|||▲画像送り値 != 0
||||背景ダッシュモード値 = 2;
|||+―――――――――――――――
|||▼
||▼
||柱座標左右=柱画像左右+(3+背景ダッシュモード値)
||背景座標左右=背景座標左右+(1+背景ダッシュモード)
||画像送り値=画像送り値+9
|▼

|▲前回入力キー左右 == 4 && 画像送り値 == 0
||画像送り値 = 前回入力キー左右−1
|+―――――――――――――――――――――――――――
|▼
|画像切り替え時間 = アニメカウント / 6% 自キャラアニメーションに必要な画像枚数
|出力関数 = 自キャラ座標左右・自キャラ上下・自キャラ画像配列[自キャラアニメーションに必要な画|像枚数+画像送り値]

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
DSTIMEを100と見る。
DSTIMEを190と見る。
移動モード=0は歩く 移動モード=1は走る。

移動関数から現在入力された値が来る(key)


|画像送り値 = 0;
|▲ループ時間>現在時間関数 && 移動モード=0 || 前回入力キー左右=key || 現在||時間関数>ダッシュ認識限界時間
||ループ時間 = 現在時間関数 + 100
||ダッシュ認識限界時間 = 現在時間関数 + 190
||移動モード = 0
||前回入力キー左右 = key
|+――――――――――――――――――――――
||ダッシュ認識限界時間 = 現在時間関数 + 100 (一度キーを話したら確実に歩くた|| めにループ時間を代入)
||移動モード = 1
||画像送り値 = 画像送り値 + 24
|▼

|状態を見るために、key・ループ時間・ダッシュ認識限界時間・移動モードを出力。
|移動関数に画像送り値を返す。


void JicharaMove(){
//キャラムーブ
int b=0 , c=0;
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); //方向キー代入判定。
if(key & PAD_INPUT_UP) jikidata.y=jikidata.y-idouryou[4];
if(key & PAD_INPUT_DOWN) jikidata.y=jikidata.y+idouryou[4];
//ダッシュ判定

if(key & PAD_INPUT_RIGHT){ //右キーを押されたら。
b = Ds_Hantei(key); //ダッシュ判定関数
if(580>jikidata.x){ //キャラが右端にいなければ移動させる
if(b){
jikidata.x=jikidata.x+idouryou[6];
}
else{
jikidata.x=jikidata.x+idouryou[3];
}
}
else if(b)c=2; //キャラが右端にいない+ダッシュならc=2
hasira.x=hasira.x-idouryou[3+c],haikei.x=haikei.x-idouryou[1+c],b=b+9;
}

if(key & PAD_INPUT_LEFT){ //左キーを押されたら。
b = Ds_Hantei(key); //ダッシュ判定関数
if(30<jikidata.x){ //キャラが左端にいなければ移動させる。
if(b){
jikidata.x=jikidata.x-idouryou[6];
}
else{
jikidata.x=jikidata.x-idouryou[3];
}
}
else if(b)c=2; //キャラが右端にいない+ダッシュならc=2
hasira.x=hasira.x+idouryou[3+c],haikei.x=haikei.x+idouryou[1+c],b=b+6;
}

if(lr==4&&b==0)b=lr-1;//停止時の向き判別

int a = animcounter / 6 % jikidata.animpat; //キャラ画像切り替え時間
DrawGraph(jikidata.x, jikidata.y, jikidata.ghandle[a+b], TRUE);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
int Ds_Hantei(int key){
int b = 0;

if((D_time_l>GetNowCount() && D_mod==0)|| lr!=key || GetNowCount()>D_time_h){
D_time_l= GetNowCount()+DSTIME_L; //ループ時間代入
D_time_h= GetNowCount()+DSTIME_H; //ダッシュ判定時間限界代入
D_mod = 0;
lr = key;

else{
D_time_h= GetNowCount()+DSTIME_L; //ループ時間代入
D_mod = 1;
b = b + 24;
}
printfDx("%d %d %d %d\n",key,D_time_l,D_time_h,D_mod); //明細出力
return(b);
}


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


Name: Justy  ..比類無きプログラマー(84,031ポイント)   Date: 2007/04/21(土) 15:48   No:7053     
Title: Re:C言語レベル多分7です。ダッシュについて。    
 いくつか不明点もあるので、勘違いしているところがあるかもしれません、と断った上で。

 実時間(ms)ベースで処理しているところと、毎フレーム毎固定値の処理が
混在しているのが、その原因なのは既に判っているかと思います。
 であればどちらかに統一すればうまくいくのではないでしょうか。

 例えば、GetNowCount()を使うのを止めて、毎フレーム1ずつ加算される
カウンターを使って判定すればいいのではないかと。

 ただPCにスペックによっては何秒押せばダッシュになるのか
変わってしまいます(フレームレートが安定していれば別です)が、
ダッシュと歩行を繰り返すようなことはなくなるかと思います。


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

Name: 2年生  ..ぴよぴよ(130ポイント)   Date: 2007/04/21(土) 17:35   No:7055     
Title: Re:C言語レベル多分7です。ダッシュについて。    
ご返答ありがとうございます。
GetNowCount()をやめて、フレーム数で判定をするソースを考えて見ます。

後説明不足で申し訳ありません。
結果として欲しい状態が、左右のどちらか一方方向に、Wクリックしたように、
「方向キーを押した後すばやく押しなおして最後に押しっぱなし」で、ダッシュとして判定してたいのです。
その後方向キーを押しなおしたら、歩行にとして判定したいのです。
ですので・・・
D_time_h= GetNowCount()+DSTIME_L;
[GetNowCount()>D_time_h]判定が出てくるのです。

分かり難い説明っで申し訳ありません。