C言語何でも質問掲示板


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

 
   構造体   
     ・[24120] Dixq (管理人) 
     ・[24125] chunezu 
     ・[24127] Dixq (管理人) 
     ・[24159] chunezu 
   処理の遅れ   
     ・[23886] Dixq (管理人) 
     ・[23888] yu 
     ・[23889] Dixq (管理人) 
     ・[23892] yu 
     ・[23903] Dixq (管理人) 
     ・[23928] yu 
     ・[23930] Dixq (管理人) 
     ・[24099] yu 
     ・[24113] array 
     ・[24117] Dixq (管理人) 
     ・[24133] yu 
     ・[24136] array 
     ・[24146] yu 
     ・[24153] array 
   値が代入されてくれま ....   
     ・[24110] こめかみ 
     ・[24145] ちけ 
   コンストラクタ周りで ....   
     ・[24141] J 
     ・[24142] J 
   ファイルの読み書き   
     ・[24078] box 
     ・[24079] lbfuvab 
     ・[24080] Dixq (管理人) 
     ・[24108] zyf_ 
   ボックスの回転につい ....   
     ・[23940] 紅葉 
     ・[23967] 紅葉 
     ・[23969] バグ 
     ・[23998] 紅葉 
     ・[24001] やそ 
     ・[24004] Justy 
     ・[24010] 紅葉 
     ・[24074] Justy 
     ・[24084] 紅葉 
     ・[24086] 紅葉 
     ・[24089] Justy 
     ・[24091] 紅葉 
     ・[24096] Justy 
     ・[24101] Justy 
     ・[24103] 紅葉 
   またまた質問なのです ....   
     ・[23938] box 
     ・[23947] conio 
     ・[23955] Dixq (管理人) 
     ・[24014] うい 
     ・[24015] たかぎ 
     ・[24083] conio 
     ・[24088] たかぎ 
   タイトルバーの閉じる ....   
     ・[24073] Justy 
     ・[24076] フォンクス 
   サンプルプログラミン ....   
     ・[24039] Mist 
     ・[24040] Dixq (管理人) 
     ・[24041] non 
     ・[24042] Dixq (管理人) 
     ・[24043] non 
     ・[24045] Dixq (管理人) 
     ・[24047] non 
     ・[24052] たかぎ 
     ・[24053] non 
     ・[24055] たかぎ 
     ・[24056] non 
     ・[24057] たかぎ 
     ・[24058] toyo 
     ・[24060] non 
   PCを新しくしたら   
     ・[23877] 紅葉 
     ・[23878] 御津凪 
     ・[23885] 独学初心者 
     ・[23897] 御津凪 
     ・[23902] 独学初心者 
     ・[23906] 御津凪 
     ・[23943] 独学初心者 
     ・[23951] 御津凪 
     ・[24016] 独学初心者 
     ・[24030] 御津凪 
     ・[24059] 独学初心者 
   scanfは使ってはだめ? ....   
     ・[24013] Dixq (管理人) 
   どんな教育アプリを作 ....   
     ・[23962] バグ 
     ・[23963] Dixq (管理人) 
     ・[23965] たかぎ 
     ・[23976] Dixq (管理人) 
     ・[23984] 御津凪 
     ・[23995] bodomcross 
     ・[24002] 組木紙織 
     ・[24003] kazuoni 
     ・[24006] rom 
     ・[24012] Dixq (管理人) 
   ■と空白を使って文字 ....   
     ・[23959] Dixq (管理人) 
     ・[23960] Dixq (管理人) 
     ・[23973] non 
     ・[23992] やそ 
     ・[24009] lbfuvab 
   開発環境   
     ・[23953] たかぎ 
     ・[24000] パソコンのパはパーソ(略) 
     ・[24007] たかぎ 
   (改題)ウインドウが ....   
     ・[23898] 御津凪 
     ・[23900] 山崎 
     ・[23952] 御津凪 
     ・[24005] 山崎 
   ポインタ・構造体   
     ・[23937] box 
     ・[23957] Dixq (管理人) 
   学校の課題なんですが ....   
     ・[23920] たいちう 
     ・[23922] やそ 
     ・[23923] Haru 
     ・[23924] non 
     ・[23925] kokoro 
     ・[23926] たかぎ 
     ・[23927] lbfuvab 
     ・[23931] non 
     ・[23934] Mist 
     ・[23946] kokoro 
   数学でいう組み合わせ ....   
     ・[22725] こめかみ 
     ・[22728] こめかみ 
     ・[22729] mats 
     ・[22731] こめかみ 
     ・[22734] こめかみ 
     ・[22735] こめかみ 
     ・[22736] mats 
     ・[22737] こめかみ 
     ・[22749] たいちう 
     ・[22751] たいちう 
     ・[22772] こめかみ 
     ・[22773] こめかみ 
     ・[22774] こめかみ 
     ・[22793] 初級者 
     ・[22794] hoge 
     ・[22795] 初級者 
     ・[22889] こめかみ 
     ・[22892] toyo 
     ・[22907] 初級者 
     ・[22973] こめかみ 
     ・[22982] 初級者 
     ・[22989] こめかみ 
     ・[22990] こめかみ 
     ・[22999] 組木紙織 
     ・[23017] こめかみ 
     ・[23022] こめかみ 
     ・[23026] 組木紙織 
     ・[23050] たいちう 
     ・[23053] 初級者 
     ・[23074] こめかみ 
     ・[23085] たいちう 
     ・[23107] こめかみ 
     ・[23114] 組木紙織 
     ・[23130] たいちう 
     ・[23131] たいちう 
     ・[23147] 組木紙織 
     ・[23181] こめかみ 
     ・[23205] たいちう 
     ・[23230] たいちう 
     ・[23247] こめかみ 
     ・[23335] こめかみ 
     ・[23336] box 
     ・[23347] 組木紙織 
     ・[23351] こめかみ 
     ・[23352] こめかみ 
     ・[23354] たいちう 
     ・[23357] Justy 
     ・[23358] 組木紙織 
     ・[23376] こめかみ 
     ・[23377] こめかみ 
     ・[23386] Justy 
     ・[23403] たいちう 
     ・[23631] こめかみ 
     ・[23632] こめかみ 
     ・[23674] Justy 
     ・[23793] こめかみ 
     ・[23805] Justy 
     ・[23814] 組木紙織 
     ・[23815] box 
     ・[23819] Justy 
     ・[23941] こめかみ 
   VisualC++ 2008 Expre ....   
     ・[23907] 御津凪 
     ・[23908] うい 
     ・[23909] Dixq (管理人) 
     ・[23910] うい 
     ・[23911] うい 
     ・[23912] Dixq (管理人) 
     ・[23913] うい 
     ・[23914] Dixq (管理人) 
     ・[23929] うい 
   デスクトップマスコッ ....   
     ・[23899] Justy 
     ・[23918] がまぐち 
   3D上に三角形を書き ....   
     ・[23760] Justy 
     ・[23763] 素人 
     ・[23764] 素人 
     ・[23765] Justy 
     ・[23767] トピ主 
     ・[23768] Justy 
     ・[23771] t_white 
     ・[23777] Justy 
     ・[23780] t_white 
     ・[23784] Justy 
     ・[23901] 素人 
   for文をうまく使い文字 ....   
     ・[23870] バグ 
     ・[23871] non 
     ・[23874] 大阪人 
   CSVファイルへの出力方 ....   
     ・[23865] Dixq (管理人) 
     ・[23867] バグ 
     ・[23868] non 
   龍神録プロジェクト4 ....   
     ・[23846] Dixq (管理人) 
     ・[23860] けんたろうちゃん 
     ・[23862] Dixq (管理人) 
     ・[23866] けんたろうちゃん 
   SAT問題を解くプログラ ....   
     ・[23810] Justy 
     ・[23833] 大工 
     ・[23838] Justy 
     ・[23839] 大工 
     ・[23840] Justy 
     ・[23844] 大工 
     ・[23849] Justy 
     ・[23863] 大工 
   マウスで動かせるX-Fi ....   
     ・[23817] Justy 
     ・[23818] 紅葉 
     ・[23821] Justy 
     ・[23861]   
   MacにおけるBMPファイ ....   
     ・[23858] Mist 
     ・[23859] 羽流布 
   カウンタについて   
     ・[23850] Dixq (管理人) 
     ・[23854] えっと 
     ・[23855] Dixq (管理人) 
     ・[23856] えっと 
   縦スクロールから横ス ....   
     ・[23851] Dixq (管理人) 
   誰か教えてもらえませ ....   
     ・[23633] Dixq (管理人) 
     ・[23700] 猿 
     ・[23702] 猿 
     ・[23705] kazuoni 
     ・[23707] 猿 
     ・[23710] kazuoni 
     ・[23713] Dixq (管理人) 
     ・[23816] 猿 
     ・[23843] 猿 

Name: chunezu  ..初心者(7,724ポイント)   Date: 2008/11/15(土) 16:07   No:24114       
Title: 構造体    
質問です。
STGのボスを作ろうとボスの構造体を定義したら
>shot.obj : error LNK2001: 外部シンボル ""struct Boss boss" (?boss@@3UBoss@@A)" は未解決です。
1>C:\Documents and Settings\Rio\デスクトップ\コピー 〜 DP\Debug\kami.exe : fatal error LNK1120: 外部参照 2 が未解決です。
というエラーが出てきました。

構造体

//ボス
typedef struct{
int flag;
double x,y;
}Boss;
Boss boss;


ほかの構造体でも Boss の部分を変更すると同様のエラーが出てきます。
分かる方お願いします・・・



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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,046ポイント)   Date: 2008/11/15(土) 17:27   No:24120     
Title: Re:構造体    
これは龍神録プログラミングの館を使ったコードですか?
分割コンパイルはしていますか?
どのようなファイル構成になっているか、宣言やexternはどうなっているのか教えて下さい。

龍神録プログラミングの館にもBossを追加する部分ありますよね。
その通りに追加すればいいと思いますよ。


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

Name: chunezu  ..初心者(7,671ポイント)   Date: 2008/11/15(土) 17:39   No:24125     
Title: Re:構造体    
龍神録を元に自分が分かりやすいように作ってあります。
kouzou は龍神録の GLOVAL と同じ意味を持っています。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(890,290ポイント)   Date: 2008/11/15(土) 17:44   No:24127     
Title: Re:構造体    
龍神録の館と同じ構造ならこれで大丈夫なはずです。

リビルドしてみて下さい。


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

Name: chunezu  ..初心者(7,699ポイント)   Date: 2008/11/16(日) 08:31   No:24159 解決!     
Title: Re:構造体    
無事にできました!
本当にありがとございました!


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



Name: yu  ..ぴよぴよ(266ポイント)   Date: 2008/11/11(火) 19:43   No:23883       
Title: 処理の遅れ    
管理者様の龍神録のプロジェクトについてですが

最初にボムをうつと処理が一時的に止まってしまいます。
しかし、2回目以降は大丈夫です。


自分のPCの環境は大丈夫だと思います。
完成している方の龍神録ではボムの遅れはありませんでした。


effectを登録する際に遅れてしまうのでしょうか?・・・

どのような対策をすると回避できるのか、どなたかご教授お願いします。


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,554ポイント)   Date: 2008/11/11(火) 20:23   No:23886     
Title: Re:処理の遅れ    
龍神録プログラミングの館のプロジェクトで実行するとボムが遅れるが、
ゲームとしてリリースしている四聖龍神録Plusではそうはならないということですか?

ダウンロードしたそのままのプロジェクトでコンパイル・実行しても遅れますか?
50章とかのプロジェクトでもなりますか?

2回目から普通になるのならスペックの問題ではなさそうですね。

一時的に止まるというのはどれ位止まりますか?


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

Name: yu  ..ぴよぴよ(289ポイント)   Date: 2008/11/11(火) 20:46   No:23888     
Title: Re:処理の遅れ    
>龍神録プログラミングの館のプロジェクトで実行するとボムが遅れるが、
>ゲームとしてリリースしている四聖龍神録Plusではそうはならないということですか?

はい。その通りです。
わかりにくくてすみません;


>ダウンロードしたそのままのプロジェクトでコンパイル・実行しても遅れますか?
>50章とかのプロジェクトでもなりますか?

exeとプロジェクトでコンパイル・実行をしても遅れがでました。



>一時的に止まるというのはどれ位止まりますか?

1秒ぐらい画面がキャプチャーしたようにとまります。






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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,631ポイント)   Date: 2008/11/11(火) 21:23   No:23889     
Title: Re:処理の遅れ    
どこでどれ位処理に時間がかかっているか、右側に表示されていると思います。
もし早すぎて確認出来ない場合は、キャプチャソフトで画面をキャプチャしてコマ送りで確認すると良いと思います。
とりあえず、どこで時間がかかっているか確認してみましょう。


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

Name: yu  ..ぴよぴよ(343ポイント)   Date: 2008/11/11(火) 21:44   No:23892     
Title: Re:処理の遅れ    
描画メインの時間が787.74でした。
他の処理の時間は通常通りでした。

グラフィックに問題があるのでしょうか?・・・


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,736ポイント)   Date: 2008/11/12(水) 01:18   No:23903     
Title: Re:処理の遅れ    
う〜ん、こちらではその現象が確認出来ないのでよくわかりません・・。
ビデオカードのドライバの更新してみてはどうでしょう?
もっと原因を限定したいなら、
描画関数ごとに時間はかって表示させてみてはどうでしょう。


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

Name: yu  ..ぴよぴよ(414ポイント)   Date: 2008/11/12(水) 18:49   No:23928     
Title: Re:処理の遅れ    
友達と全く同じパソコンを使っているので
同じプロジェクトを友達に実行してもらったところ
ボムの遅れは全くありませんでした・・・

自分のPCの環境のせいですね・・・

勘違いですみませんでした;
自分で直してみます。

管理者様、ありがとうございました。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(882,284ポイント)   Date: 2008/11/12(水) 19:48   No:23930     
Title: Re:処理の遅れ    
私は表面的なアドバイスしか出来ないので、もし内部的な問題ならDXライブラリの製作者様に聞いてみてはどうでしょう。
本家でも掲示板での質問・回答が充実してます。


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

Name: yu  ..かけだし(1,160ポイント)   Date: 2008/11/15(土) 01:00   No:24099     
Title: Re:処理の遅れ    
暫く、いろいろと自分で調べてみました。


どうやらbright_set.brtの値を255以外の数に変更すると処理が遅れてしまうようです。
255以外の数にするとgraph_main()内で何回かSetDrawBrightで設定しているので
SetDrawBright関数が遅れを生じさせているようでした。

実際、背景をSetDrawBrightを使って暗転させると、最初に遅れが出ました。
しかし、普通はこんなに処理がかからないのに何故でしょう・・・;
やはり自分のPCの環境が影響していそうです。

対策として、一度輝度を設定するとなれるかなと思って
ini();にSetDrawBright(0,0,0)を追加しました。
すると、ボムは遅れは解消されました。
しかし、フラッシュをしたり、背景を暗転しようとすると遅れがでました。


自分のPCのせいかもしれませんが一応
DXライブラリ内の関数なのでDXライブラリの製作者様に聞いてみることにします。


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

Name: array [URL]  ..プログラマー(37,922ポイント)   Date: 2008/11/15(土) 14:53   No:24113     
Title: Re:処理の遅れ    
この現象は、以前から現在の50章まで続いて確認してます。
私も同じく、2回目以降は大丈夫なんですが。

原因が分かってるわけでなく、管理人さんが、現象を確認できないとの事なので
一応、どんなものなのか動画を撮ってみました。

http://sinkai.net/rstg/bbs0.php

※しばらくしたら、このページ消します。

使ったプロジェクトは50章です。

動画中のFPSは[30]→[12]ですが
動画キャプチャしてない時(通常時)のFPSは[55]→[12]くらいに落ちます。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,859ポイント)   Date: 2008/11/15(土) 17:16   No:24117     
Title: Re:処理の遅れ    
>yuさん

マジですか〜><
私の環境では255以上を指定しても255で表示されるので、255以上が指定されたら内部で勝手に255に変換されるのだと思ってました。
今考えるとなんといういい加減なプログラムでしょう^^;
改善しておきます。

>arrayさん

おぉ!バグの件はどうでも良いと思える位弾幕の方に目が行きますw
表現面白いですね^^
わざわざ動画撮って頂きありがとうございます!よくわかりました^^


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

Name: yu  ..かけだし(1,222ポイント)   Date: 2008/11/15(土) 19:44   No:24133     
Title: Re:処理の遅れ    
array様も同じ現象がおきていましたか・・・
遅れが出ないように何か対策はしていますか?

そして動画まで撮って頂いてありがとうございます。
自分も動画を撮れば管理者様に伝えやすかったかな;


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

Name: array [URL]  ..プログラマー(38,081ポイント)   Date: 2008/11/15(土) 21:06   No:24136     
Title: Re:処理の遅れ    
> 遅れが出ないように何か対策はしていますか?

アホながらに原因を探してみました。結局yuさんの言うとおり、SetDrawBright()に原因がありそうです。
となると、やっぱり原因は、DXライブラリにありそうですね。

一応、ini()の変更で
---- ini.cpp - ini() ----


bright_set.brt=254;//初期輝度は最大


と変更しても解決されるみたいです。


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

Name: yu  ..かけだし(1,385ポイント)   Date: 2008/11/15(土) 22:17   No:24146 解決!     
Title: Re:処理の遅れ    
最初にフラッシュをして、bright_set.brt=254にすると
遅れはなくなりましたw

多少ですが、実行した最初は重いですが;


array様、管理者様、ありがとうございました!



この場を借りて言いますが、
array様の弾幕の簡略化と、
アシストを作る、がとても便利で役立っています。
恥ずかしながら、弾幕の簡略化で関数の作り方がわかりました;

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


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

Name: array [URL]  ..プログラマー(38,035ポイント)   Date: 2008/11/16(日) 00:30   No:24153     
Title: Re:処理の遅れ    
> array様の弾幕の簡略化と、
> アシストを作る、がとても便利で役立っています。
> 恥ずかしながら、弾幕の簡略化で関数の作り方がわかりました;

そう言ってもらえると、とても嬉しいです。

管理人さんから、簡略化や3D弾幕、面白いというメールを貰って頑張ってたのですが

改めて役に立つと言って貰えると、頑張りがいがあります^^


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



Name: ちけ  ..かけだし(1,130ポイント)   Date: 2008/11/15(土) 12:27   No:24109       
Title: 値が代入されてくれません    
こんにちは、質問をさせてください。

構造体で作った変数の中に値を代入したいのですが、値が全く入ってくれません。
以下にその部分のソースを書きます。




#include "DxLib.h"
#include <math.h>

#define KBMAX 20

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

ChangeWindowMode( TRUE ) ;


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

typedef struct{
int flag;
double kabux,kabuy,Angle,mem_kx,mem_ky;
} kbface;

typedef struct{
int flag,counter,img;
kbface kbgao[KBMAX];
} kbfaces;
kbfaces kbgaos;


for(int i=0;i<KBMAX;i++){
kbgaos.kbgao[i].flag=0;
kbgaos.kbgao[i].kabux=0;
kbgaos.kbgao[i].kabuy=0;
}

SetDrawScreen( DX_SCREEN_BACK ) ;
int White = GetColor( 255 , 255 ,255 ) ;

int bbb;
for(bbb=0;bbb<25;bbb++){

for(int j=0;j<KBMAX;j++){

if(kbgaos.kbgao[j].flag==0){
kbgaos.kbgao[j].flag=1;
kbgaos.kbgao[j].kabux=104;
kbgaos.kbgao[j].kabuy=250;

ClearDrawScreen();

for(int f=0;f<KBMAX;f++){
DrawFormatString(500,20*f, White , " %d" ,kbgaos.kbgao[f].flag);
DrawFormatString(300,20*f, White , " %d" ,kbgaos.kbgao[f].kabux);
DrawFormatString(400,20*f, White , " %d" ,kbgaos.kbgao[f].kabuy);
}
WaitKey() ;
ScreenFlip() ;
break;


}


}
}


WaitKey() ;
DxLib_End() ;
return 0 ;
}




flagの方には値が入っているのに、
kbgaos.kbgao[j].kabuxの方には代入されてくれません。
最終的にこの中にランダムな値を入れたいのですが、それも入ってくれないために
試しに定数を代入させてみたのですがそれでも入ってくれません。
doubleで決めた値なので整数じゃだめなのかと思い、小数を入れてみましたが
今度は変な値がでてきてしまいます。
(double)をつけても駄目でした。
なぜkbgaos.kbgao[j].kabuxには値が入らないのでしょうか。
僕にはどこか根本的な知識が抜けているのでしょうか。
そして、どうすれば値が入るのでしょうか。
教えてください。

WindowsXpでVC++ 2008EEを使ってコンパイルしています。

C言語に関しては、初心者です。


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


Name: こめかみ  ..プログラマー(37,780ポイント)   Date: 2008/11/15(土) 13:54   No:24110     
Title: Re:値が代入されてくれません    
>DrawFormatString(300,20*f, White , " %d" ,kbgaos.kbgao[f].kabux);
>DrawFormatString(400,20*f, White , " %d" ,kbgaos.kbgao[f].kabuy);

ここの%dを%fに変えて実行してみてください。

小数点の表示などの細かい調整がしたかったら、
変換指定子とかでググるといいかもです。

教科書とか持ってるなら載ってるかもしれないです。



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

Name: ちけ  ..かけだし(1,173ポイント)   Date: 2008/11/15(土) 21:51   No:24145 解決!     
Title: Re:値が代入されてくれません    
%fをつけることによって代入される予定の値を出すことができました。
昔のBASICしか弄ったことがなかったせいか、この辺の違いがよくわかってませんでした。
もう少し勉強してから出直します。
どうもありがとうございます。


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



Name: J  ..中級者(12,229ポイント)   Date: 2008/11/15(土) 21:15   No:24138       
Title: コンストラクタ周りでエラーが・・・    
こんにちは。
最近BCCからVC2008に乗り換えたのですが、
コンパイルしたら、

error C2533: 'Graphic::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。

と表示されてコンパイルできません。どなたか原因を教えてくれると嬉しいです。
ソースはできれば載せたくはないのですが、無いとダメなら載せます。


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


Name: J  ..中級者(12,261ポイント)   Date: 2008/11/15(土) 21:29   No:24141 解決!     
Title: Re:コンストラクタ周りでエラーが・・・    
あーっとすみません!
自己解決しました。よく見たらクラスの宣言の後の;を間違って消していました(大汗
すみませんでした〜


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

Name: J  ..中級者(13,829ポイント)   Date: 2008/11/15(土) 21:34   No:24142     
Title: 酷いことになりました    
なんどもすみません
もっと恐ろしいことになりました

コンパイルしています...
1>main.cpp
1>リンクしています...
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>LIBCMTD.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(vsprintf.obj) : error LNK2005: _vsprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(dbgrptw.obj) : error LNK2005: __CrtDbgReportW は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "public: void __thiscall type_info::_type_info_dtor_internal_method(void)" (?_type_info_dtor_internal_method@type_info@@QAEXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
1>LIBCMTD.lib(typinfo.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
1>LIBCMTD.lib(getenv.obj) : error LNK2005: _getenv は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LIBCMTD.lib(abort.obj) : error LNK2005: _abort は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
1>LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。
1>D:\Program1\gtest\Debug\gtest.exe : fatal error LNK1120: 外部参照 9 が未解決です。
1>ビルドログは "file://d:\Program1\gtest\Debug\BuildLog.htm" に保存されました。
1>gtest - エラー 40、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

どれもこれも大量すぎて意味が分かりません。。
どうやらマクロあたりがいけないのかなあ・・・


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



Name: zyf_  ..ぴよぴよ(132ポイント)   Date: 2008/11/14(金) 20:55   No:24077       
Title: ファイルの読み書き    
どうも。元 kor> です。(覚えてない人のほうが多いと思いますが・・・)何となくHN変更しました。

一時のノリでアルファベットで記述されてるテキストファイルを機械語に直して出力するソフトを作ろうと思い、
「苦しんで覚えるC言語」
に書いてある方法で、テキストファイルの出力(ttp://homepage3.nifty.com/mmgames/c_guide/17-01.html)
を試してみたのですが、なぜかエラーが出て実行されません。
ファイルを生成するためウイルスバスターが邪魔になってるのでしょうか?
ご教授お願いします。


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


Name: box  ..ハッカー(129,148ポイント)   Date: 2008/11/14(金) 21:00   No:24078     
Title: Re:ファイルの読み書き    
>テキストファイルの出力

どんなソースコードを書いたときに、

>なぜかエラーが出て実行されません。

どんなエラーが出て実行できないのでしょうか。
現象を具体的に教えてください。


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

Name: lbfuvab  ..初心者(8,004ポイント)   Date: 2008/11/14(金) 21:15   No:24079     
Title: Re:ファイルの読み書き    
>テキストファイルを機械語に直して出力するソフト
機械語に変換すると言う事はアセンブラか何かでしょうか?

また、エラーが出たのは
@コンパイル時
A実行時
のどちらですか?


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,304ポイント)   Date: 2008/11/14(金) 21:21   No:24080     
Title: Re:ファイルの読み書き    
こんにちは。お久しぶりです。
一応規約を読んで詳しく書いていただけるとありがたいです。


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

Name: zyf_  ..ぴよぴよ(188ポイント)   Date: 2008/11/15(土) 12:01   No:24108 解決!     
Title: Re:ファイルの読み書き    
あれっ?
別のプロジェクトで実行するとなぜか成功しました。設定が違うからかな?
ごめんなさい。ご迷惑をおかけしました。


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



Name: 紅葉  ..入門者(3,572ポイント)   Date: 2008/11/12(水) 16:55   No:23921       
Title: ボックスの回転について    
ボックスの回転をマウスで操作したいのですが
2回目のクリックで元の座標に初期化されてしまいます。
できればドラッグを離したら軸がリセットされるようにソースを書きたいです。
よろしくお願いします。


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


Name: 紅葉  ..入門者(3,681ポイント)   Date: 2008/11/12(水) 21:51   No:23940     
Title: 説明が分かりにくかったかもしれないので    
軸はリセットされますが(リセットされなくても)

再度クリックしても今みたいに画面が最初の状態に戻らなくしたいです。

画面で見えている箱の状態から再度回転を始めたいです。



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

Name: 紅葉  ..入門者(3,782ポイント)   Date: 2008/11/13(木) 16:46   No:23967     
Title: Re:説明が分かりにくかったかもしれないので    
やはり解けないでしょうか?
難しい質問をしてしまい本当に申し訳ないです。


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

Name: バグ  ..ハッカー(124,875ポイント)   Date: 2008/11/13(木) 17:40   No:23969     
Title: Re:説明が分かりにくかったかもしれないので    
デバッグしてみようかと思ったのですが、うちの環境だと"d3d9.h"が無いのでビルドできないです(T-T)

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

Name: 紅葉  ..入門者(3,840ポイント)   Date: 2008/11/13(木) 20:41   No:23998     
Title: Re:説明が分かりにくかったかもしれないので    
>>バグさん
わざわざすいません><
調べようとしてくれて、ありがとうございます。
一応、SRCのGameMain.cppが今回の難題なので
もしそちらを見ることがあり、何かありましたら連絡ください。


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

Name: やそ  ..比類無きプログラマー(85,486ポイント)   Date: 2008/11/13(木) 21:17   No:24001     
Title: Re:説明が分かりにくかったかもしれないので    
>一応、SRCのGameMain.cppが今回の難題なので
とありますが、結局

>デバッグしてみようかと思ったのですが、うちの環境だと"d3d9.h"が無いのでビルドできないです(T-T)
に行き着くのではないでしょうか?



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

Name: Justy  ..ハッカー(265,549ポイント)   Date: 2008/11/13(木) 22:32   No:24004     
Title: Re:説明が分かりにくかったかもしれないので    

>できればドラッグを離したら軸がリセットされるようにソースを書きたいです。

 他のスレとは違い、これはいい線いってるじゃないですか。
 あとほんの数カ所改善するだけでうまくいきます。

 MeshMat()で。
 mAxisと Angからクォータニオンを出して、それをそのまま行列に変換し箱の姿勢としていますが、
問題は次にマウスがクリックされた時 mAxisを構築し直すので回転が元に戻ってしまっています。

 そこで、MouseReport()でマウスが離された時、その時点でのオブジェクトの姿勢を
記憶し(これはクォータニオンで覚えておけばいいでしょう)mAxisと Angを
初期化しておきます。
(記憶しようとした形跡はあるようですが・・・)

 で、MeshMat()で、mAxisと Angからクォータニオンを求めた後、
記憶したクォータニオンを掛け合わせ、それを最終的な箱の姿勢とすれば完成です。


 注意が必要なのは、姿勢を記憶する際に mAxisと Angから求められる
クォータニオンを記憶するのではなく、その時点でのオブジェクトの姿勢を記憶する
ところです。


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

Name: 紅葉  ..入門者(4,348ポイント)   Date: 2008/11/14(金) 01:46   No:24010     
Title: Re:説明が分かりにくかったかもしれないので    
とりあえず間に合わせのの知識と今までの Justy さんから頂いたものを解析し
なんとか今の状況までたどり着くことができました。(説明が上手なのでw)
本当にありがとうございます。

Justyさんが言っていることをやろうとしたのですが、失敗いたしました><
現在、マウスを離したとき(Mouse.Pul &_lMOUSE)姿勢の記憶の仕方と
それを前の物との掛け合わせ方がわからないです。
これ以上は自らの手ではできそうにないのですが、
丸投げのつもりはないですが、再度書いたものを頂けないでしょうか?

できれば今日、制作での集まりが午後からあるのでそれまでに完成させたいです。
もちろん Justy さんの都合もありますので時間があればで構いません><


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

Name: Justy  ..ハッカー(266,013ポイント)   Date: 2008/11/14(金) 20:50   No:24074     
Title: Re:説明が分かりにくかったかもしれないので    

 > 再度書いたものを頂けないでしょうか

 すみませんが、コードを書いて試しているわけではないので、ないです。
 なので不明点があれば、その都度ピンポイントで訊いてもらった方がいいかと思います。



 > マウスを離したとき(Mouse.Pul &_lMOUSE)姿勢の記憶の仕方と
 > それを前の物との掛け合わせ方がわからないです。

 実はこの2つの処理の内容はほぼ同じです。
 どちらもその時点での姿勢を求めるだけなので。

 記憶したクォータニオンを q1、mAxisと Angから出したクォータニオン q2、とすると
q1 * q2を行い、この結果を記憶したり、表示時の姿勢とすればOKです。


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

Name: 紅葉  ..入門者(4,533ポイント)   Date: 2008/11/14(金) 22:06   No:24084     
Title: 無題    
Justyさん
多分、同じようなことを書いたのですがmAxis等をがVECTER型で用意したせいか
まずクォータニオンに保存できませんでした・・・
また姿勢の掛け合わせ型?が理解できないです。


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

Name: 紅葉  ..入門者(4,557ポイント)   Date: 2008/11/14(金) 22:19   No:24086     
Title: 無題    
連続したレスになりすいません。

やり方は何となくわかっていますが、今の私では上の理由などから
コードを書けないです。

どうか書いては頂けないでしょうか?


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

Name: Justy  ..ハッカー(266,306ポイント)   Date: 2008/11/14(金) 22:21   No:24089     
Title: Re:無題    

>mAxis等をがVECTER型で用意したせいか
>まずクォータニオンに保存できませんでした・

 投稿されたコードを見ると
D3DXQuaternionRotationAxis(&Box.Qrt,&(mAxis),D3DXToRadian(Ang));
 と、mAxisと Angからクォータニオンを出していますよ。
 これがまさにその処理です。


 姿勢の掛け合わせは、D3DXQuaternionMultiply()を使ってもできますし、
 q = q1 * q2と書いてもいいですし、q1 *= q2と書くこともできます。


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

Name: 紅葉  ..入門者(4,644ポイント)   Date: 2008/11/14(金) 22:38   No:24091     
Title: Re:無題    
何度やっても添付したexeの実行結果になってしまいます。

DATAがある階層に保存してください。

昨日からコードは違いますが同じように書いてます。

しかし実行結果は添付したものになってしまいます。

すいません・・・ファイルのサイズ上exeは添付できませんでした。


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

Name: Justy  ..ハッカー(267,158ポイント)   Date: 2008/11/14(金) 23:27   No:24096     
Title: Re:無題    
 幾つか前の説明をもう1度読み直して下さい。

1 q1 * q2の q1は記憶したクォータニオンで、q2はmAxisと Angから出したクォータニオンと
書いたと思いますが、
D3DXQuaternionMultiply(&Box.Qrt,&Box.Qrt,&OldQ);の処理は逆になっています。

 クォータニオンの積は、自然数の積と違って可換ではなく、a*bと b*aの結果は異なりますので
注意して下さい。


2 マウスを離した時
D3DXQuaternionRotationAxis(&OldQ,&(mAxis),D3DXToRadian(Ang));
という処理で、OldQに姿勢を保存していますが、この姿勢というのは
そのドラッグにおける姿勢の変化しか出していません。

 「注意が必要なのは、姿勢を記憶する際に mAxisと Angから求められる
クォータニオンを記憶するのではなく、その時点でのオブジェクトの姿勢を記憶する
ところです。 」

 と書いた通り、ここでは「その時点でのオブジェクトの姿勢」にしなければなりません。

 従って、mAxisと Angのクォータニオンはいきなり OldQに入れず、別の変数(ローカル変数で十分です)の方に入れ、
1と同じように OldQとその変数を掛け合わせたものを OldQとしてみて下さい。

 あと、mAxisと Angの初期化が行われていません。
 mAxisと Angから出される姿勢をここで OldQに反映させているので、
一端初期化して mAxisと Angから回転が行われないようにする必要があります。


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

Name: Justy  ..ハッカー(266,978ポイント)   Date: 2008/11/15(土) 02:00   No:24101     
Title: Re:無題    
 あ、そうだ。1つ忘れていました。

 一応今回コードをテストするときは、カメラの位置を 0, 0, Xにしておいて下さい。
 というのも、添付のコードも私の修正案もカメラについては一切考慮していないので、
カメラの位置がオブジェクトの真正面に無い場合、ずれます。

 このずれを解決するにはカメラの向きを考慮に入れて、オブジェクトを回転させればいいのですが、
また話が複雑になるので、とりあえず今はこのままということで。


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

Name: 紅葉  ..入門者(4,661ポイント)   Date: 2008/11/15(土) 04:00   No:24103     
Title: Re:無題    
できました><
本当にありがとうございます。


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



Name: うい  ..ぴよぴよ(462ポイント)   Date: 2008/11/12(水) 21:06   No:23935       
Title: またまた質問なのですが    
ここにあるプログラムに自分の知っているC言語を追加したい場合は.cと保存すればよいのでしょうか?
それとも.cppとやってもうまくいくのでしょうか?

使っているのはVC++です。


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


Name: box  ..ハッカー(129,083ポイント)   Date: 2008/11/12(水) 21:41   No:23938     
Title: Re:またまた質問なのですが    
ここにあるプログラムとは、具体的に何でしょうか?

自分の知っているC言語を追加する、とはどういう意味でしょうか?
何か新しい機能を追加したいのですか?


何回目の質問であるかはどうでもいい話。
質問の内容を端的に要約したタイトルを付けてほしいです。


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

Name: conio  ..かけだし(2,129ポイント)   Date: 2008/11/12(水) 23:41   No:23947     
Title: Re:またまた質問なのですが    
とりあえず2通りに解釈してみます。
@「C++のプログラムでCの記述方法で使っても問題は無いのか」
A「C言語で用いていたヘッダを、C++で使えますか」

まず、@の質問だとすると、

C++はもともとCの拡張版なので、".cpp"でC言語の記述方法を使っても基本的にエラーは出ない筈です。
ただ、".c"でC++限定の記述方法を使うと、エラーが出ます。
(cout << とか)


次に、Aの質問だとすると、

C++では、Cから引き継がれたヘッダは同じように記述することは出来ません。
Cから引き継がれたヘッダは、先頭にCを付けて、".h"を取り去ります。
例えば、
<time.h> ⇒ <ctime>
<stdlib.h> ⇒ <cstdlib>

こんな感じです。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(882,762ポイント)   Date: 2008/11/13(木) 12:39   No:23955     
Title: Re:またまた質問なのですが    
「ここ」にあるといってもこちらの本家HP、ゲームの館、シューティングの館、龍神録の館、サンプルの館・・たくさんプログラムコードが公開されているので、どのプログラムかわかりません。
ピュアCでOKなコードもあればC++じゃないとコンパイルが通らないコードもあります。
特に特別な理由が無い限り、拡張子は.cppでいいと思います。
.cppでもピュアCのコードはコンパイル出来ます。
もしそれでもピュアCでコンパイルしたいときはその理由を書いてもらえるとよいかと思います。

質問の仕方がよくわからないときは規約をお読みください。


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

Name: うい  ..ぴよぴよ(500ポイント)   Date: 2008/11/14(金) 04:08   No:24014 解決!     
Title: Re:またまた質問なのですが    
いろいろと慣れてないところがあり、よくわからない質問をしてしまってすみません。
解釈はconioさんの1であっています。
ありがとうございました。


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

Name: たかぎ [URL]  ..比類無きプログラマー(72,332ポイント)   Date: 2008/11/14(金) 08:28   No:24015     
Title: Re:またまた質問なのですが    
conioさん

> C++はもともとCの拡張版なので、".cpp"でC言語の記述方法を使っても基本的にエラーは出ない筈です。

そんなことはありません。
一例を挙げると、

int main(void)
{
puts("Hello, World!");
return 0;
}

は、Cではコンパイルできますが、C++ではエラーになります。

> C++では、Cから引き継がれたヘッダは同じように記述することは出来ません。

そんなことはありません。
C++でも<stdlib.h>などを使うことができます。


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

Name: conio  ..かけだし(2,408ポイント)   Date: 2008/11/14(金) 22:03   No:24083     
Title: Re:またまた質問なのですが    
>>たかぎさん
前者の指摘については「エラーが出る場合もある」という事は知っておりました。(下記ページ3段落目)
http://wisdom.sakura.ne.jp/programming/cpp/cpp1.html
"基本的にエラーは出ない" ≠ "絶対にエラーが出ることは無い"
"基本的にエラーは出ない" = "Cの記述法も使える事は使えるが、エラーが出る場合も当然ながらある"
と解釈して頂ければと。言い方が宜しくなかったです。すいません。


後者については、下記のページなどを見て理解していたつもりでしたが、私が間違えていたようです。
http://plaza8.mbn.or.jp/~haraheri/data/data_cpp.html
「両方の記述方法が可能だが、それぞれ名前空間の指定などにおいて差異がある」、との事でした。

自分もまだまだなので、精進したいと思います(_ _;)


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,252ポイント)   Date: 2008/11/14(金) 22:20   No:24088     
Title: Re:またまた質問なのですが    
> 基本的にエラーは出ない

は、C言語ではエラーにすべきところでエラーにならないような場合を除いて...
といった意味かと解釈していました。
例えば、

char s[10];
strcpy(s, 'a');

のような場合ですね。

ちなみに、C++では、Cでは使えた方法が使えずに困ることも実際にあります。
例えば、

#define alignof(type) offsetof(struct { char a; type b; }, b)
struct A
{
char a;
int b;
double c;
};
size_t d = alignof(A);

といったコードは、CではコンパイルできますがC++ではエラーになります。

static int a;

int main(void)
{
...
}

static int a = 123;

といったコードもそうです。

一応、念のため。


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



Name: フォンクス  ..ぴよぴよ(922ポイント)   Date: 2008/11/14(金) 18:59   No:24069       
Title: タイトルバーの閉じるボタンで終了させると    
DXライブラリを使ってウインドウ表示をした時に、
タイトルバーの「閉じる」ボタンで終了させるとプロセスに
プログラムがまだ残っている状態になるんですが、
閉じるボタンで完全に終了させるにはどうしたら良いのですか?


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


Name: Justy  ..ハッカー(265,678ポイント)   Date: 2008/11/14(金) 20:22   No:24073     
Title: Re:タイトルバーの閉じるボタンで終了させると    
 OSとかハード等環境的に壊れていない限り、フォンクスさんの書いたプログラム、
或いは使っているライブラリの中に、何か終了を阻害するような処理が
入っているのだと思います。

 問題の箇所がどこか、については実際にコードを見ないと、なんとも。


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

Name: フォンクス  ..ぴよぴよ(971ポイント)   Date: 2008/11/14(金) 20:51   No:24076 解決!     
Title: Re:タイトルバーの閉じるボタンで終了させると    
すみません 自己解決しました。

メインループをブレイクする時の判定が間違ってたみたいです。


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



Name: non  ..入門者(4,125ポイント)   Date: 2008/11/14(金) 15:11   No:24037       
Title: サンプルプログラミングへの投稿OKですか    
VisualBasicでWindowsOSにおまけでついているマインスイーパーのそっくりさんをVBの勉強のために作りました。
そっくりだし、一部アイコンを流用しているのですが、他の方がプログラミングの勉強になるのなら提供しますが、いかがでしょうか。
OKの場合、プロジェクト一式を、圧縮してメールに送ればよろしいでしょうか?


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


Name: Mist  ..プログラマー(32,506ポイント)   Date: 2008/11/14(金) 15:20   No:24039     
Title: Re:サンプルプログラミングへの投稿OKですか    
> 一部アイコンを流用しているのですが

素直な疑問なのですが、アイコンの画像を無断流用してるってことですか?
見た目同じものを自分で作ったということですが?
前者であれば公開しないほうがよいかと。
最悪、公開する場を提供している管理人さんにも迷惑かけますし。

#私が知らないだけで著作権フリーとされているのであれば無視してください。
もしくは、その画像を配布するのではなく各自のPC上にある物を利用しているとか。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,022ポイント)   Date: 2008/11/14(金) 15:21   No:24040     
Title: Re:サンプルプログラミングへの投稿OKですか    
>nonさん

ご提供ありがとうございます^^
はい、私の方にメールで送っていただければありがたいです。
gmailなのでかなり重くても大丈夫だと思います。
ゲームの解説やコメント、プログラムの解説などがもしあれば、メール本文かテキストファイルか何かで送っていただけたら
同じページに書かせていただきます。


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

Name: non  ..入門者(4,158ポイント)   Date: 2008/11/14(金) 15:23   No:24041     
Title: Re:サンプルプログラミングへの投稿OKですか    
本物のマインスイーパーの画像を切り取って使ってます。
デジタル表示の数字とか、爆弾の絵とか。
やっぱ、まずいですかね。




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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,095ポイント)   Date: 2008/11/14(金) 15:24   No:24042     
Title: Re:サンプルプログラミングへの投稿OKですか    
マインスイーパーのアイコン位でしたら、ちゃちゃっとかけそうですね。
そっくりに書いても自作なら大丈夫というようなものかどうかはわかりませんが^^;

せっかくなので、安全に配布出来るようにしてはどうでしょう?


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

Name: non  ..入門者(4,203ポイント)   Date: 2008/11/14(金) 15:30   No:24043     
Title: Re:サンプルプログラミングへの投稿OKですか    
とりあえず、メールで送りました。
作り方の説明もいれました。
著作権上問題があるかは、管理人さんが判断してください。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(889,217ポイント)   Date: 2008/11/14(金) 15:44   No:24045     
Title: Re:サンプルプログラミングへの投稿OKですか    
ゲームに使用されている画像を自作されるということはお考えではないですか?
もし出来ればそうしてもらったほうが安全に公開出来るのでは無いかと思います。
非常に小さな画像ですし、ペイントでも拡大しながら本物を見ながら作ればわりとそれっぽくなるような気がします。


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

Name: non  ..入門者(4,323ポイント)   Date: 2008/11/14(金) 15:54   No:24047     
Title: Re:サンプルプログラミングへの投稿OKですか    
VisualStudioについてきているiconは使ってもOKですよね。
それ以外の、爆弾と旗と?マークとデジタル数字、それにバージョン表示の画像ですね。
暇になったら、作ります。絵を描くのは好きじゃないですからね。
長〜く、お待ちください。




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

Name: たかぎ [URL]  ..比類無きプログラマー(73,084ポイント)   Date: 2008/11/14(金) 16:19   No:24052     
Title: Re:サンプルプログラミングへの投稿OKですか    
> そっくりに書いても自作なら大丈夫というようなものかどうかはわかりませんが^^;

駄目です。
それがOKなら、ソースコードをそっくりにリタイプすれば大丈夫ということになりますよね。
ちなみに、イラスト等の模写した場合でも、(たとえ無償でも)公開するのは著作権侵害です。
http://www31.ocn.ne.jp/~jucccopyright/qa/qa01-022.html


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

Name: non  ..入門者(4,521ポイント)   Date: 2008/11/14(金) 16:30   No:24053     
Title: Re:サンプルプログラミングへの投稿OKですか    
じゃ、やっぱ、面倒なのでやめましょう。
ゲームの内容を模しているのも厳密に言えば、アイデアを盗んでいることになるでしょうしね。
プログラムの著作権ってのは、その辺がよくわかりません。


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,148ポイント)   Date: 2008/11/14(金) 16:45   No:24055     
Title: Re:サンプルプログラミングへの投稿OKですか    
> ゲームの内容を模しているのも厳密に言えば、アイデアを盗んでいることになるでしょうしね。

アイデアは著作権法では保護されませんので大丈夫です。
まあ、法的なことはともかく、完全なパクリは倫理的・道義的な問題があるような気もしますが、現実にはそのようなプログラムは世の中にあふれていますよね。



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

Name: non  ..入門者(4,534ポイント)   Date: 2008/11/14(金) 16:50   No:24056     
Title: Re:サンプルプログラミングへの投稿OKですか    
アイデアはOKですか?絵や音楽のみ気をつければいいのでしょうか?アルゴリズムはOKだとは、昔、聞いたような気がします。


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

Name: たかぎ [URL]  ..比類無きプログラマー(73,194ポイント)   Date: 2008/11/14(金) 16:52   No:24057     
Title: Re:サンプルプログラミングへの投稿OKですか    
アイデアはOKです。
アルゴリズムも基本的にはOKですが、特許等があれば話は別です。


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

Name: toyo  ..上級者(20,383ポイント)   Date: 2008/11/14(金) 16:59   No:24058     
Title: Re:サンプルプログラミングへの投稿OKですか    
マインスイーパー自体がいろんなプラットフォームで作られてますよね。
LinuxのKMinesとかWindows版とよく似てます。
Wikipediaでは
マインスイーパは1989年にロバート・ドナーが発明した1人用コンピュータゲームである。
と書いてあります。


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

Name: non  ..入門者(4,712ポイント)   Date: 2008/11/14(金) 17:03   No:24060     
Title: Re:サンプルプログラミングへの投稿OKですか    
今回のプログラムはVisualBasicってどんな言語かなと思って、どうせ勉強するなら、参考になるものをと思ってパクったものですから。もっと、暇になったら公開できるモノを作ります。
で、この質問掲示板のデザインって、もうちょっと仕事しているときのデザインにならないかしら・・・(^_^;)



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



Name: 独学初心者  ..入門者(2,756ポイント)   Date: 2008/11/11(火) 12:51   No:23872       
Title: PCを新しくしたら    
こんにちは。
先日は色々とありがとうございました。

ちょっと先日、PCを新しく新調しまして、開発環境を移設したのですが、困ったことになってしまいました。

VC++を使って居るのですが、デバッグができなくなってしまいました。

DXライブラリのサンプルプログラムなら動くのですが、自分が作った方だけ…前PCでは普通に起動するプログラムを、丸写ししたにも関わらず…
ウィンドウ表示した際に強請終了してしまいます。
出力を見てみると、どうやら


Zバッファの作成に失敗しました


と言う一文以降終了処理に入ってる様です…
自分で色々調べ、試した結果上手く行かず、どこが悪いかも見当が付かず、イマイチ理解に苦しんでいます。


知恵をお借りできればと思います。よろしくお願いいたします。


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


Name: 紅葉  ..入門者(3,179ポイント)   Date: 2008/11/11(火) 15:32   No:23877     
Title: Re:PCを新しくしたら    
素人の意見で申し訳ないですが
SDKをインストールし設定をしましたでしょうか?


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

Name: 御津凪 [URL]  ..プログラマー(34,125ポイント)   Date: 2008/11/11(火) 16:02   No:23878     
Title: Re:PCを新しくしたら    
> SDKをインストールし設定をしましたでしょうか?
ランタイムパッケージでも実行は可能です。
現PCでコンパイルできているようだと問題はなさそうです。

他のサンプルは実行できているそうなので、差し支えなければ、
実行しないプログラムの、 WinMain 関数の初期化処理周りを見せていただけませんか?

ついでにできれば前PCの環境と現PCの環境を頂けると、
大きな参考になるかと思います。
(というかそれが無いとこれ以上の的確な回答ができません)


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

Name: 独学初心者  ..入門者(4,191ポイント)   Date: 2008/11/11(火) 20:05   No:23885     
Title: Re:PCを新しくしたら    
紅葉様、御津凪様
ご返答ありがとうございます。

紅葉様
SDKについてですが、パソコンに入れて、VCの方でも設定はしてあります。
多分、前のパソコンと同じように設定し、前のパソコンだと動いてるので、大丈夫だとはおもうのですが…
見落としてることがあるのかもう一度見てみます。

御津凪様
えーっと、main部分と、初期化部分ですね…
main.cpp
#include "DxLib.h"

#include "GlobalVariable.h"

extern void opening();
extern void img_sound_load();
extern void initialization();
extern void SetColor();
extern void Background();
extern void Background2();
extern void EnemyControl();
extern void EnemyCalcDisp();
extern void EnemyShotControl();
extern void EnemyShotCalcDisp();
extern void CollisionDetection();
extern void CollisionDetection2();
extern void CollisionDetection3();
extern void CollisionDetection4();
extern void CollisionDetection5();
extern void PlayerShotCalc();
extern void PlayerShotDisp();
extern void PlayerControl();
extern void BossControl();
extern void BossCalcDisp();
extern void FpsTimeFanction();



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

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


img_sound_load(); //画像、サウンドのロード
initialization(); //初期化
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。
SetColor(); //色を取得する

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

opening();

break;

case 2:

Background(); //背景描写

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

PlayerShotCalc(); //ショットする

PlayerShotDisp(); //ショット描写

EnemyControl(); //敵描写

EnemyCalcDisp(); //敵計算

EnemyShotControl(); //敵ショット計算

EnemyShotCalcDisp(); //敵ショット描写

BossControl(); //ボス描写

      BossCalcDisp(); //ボス表示

CollisionDetection(); //当たり判定計算(自ショット/敵機)

CollisionDetection2(); //当たり判定計算(敵ショット/自機)

CollisionDetection3(); //当たり判定計算(敵機/自機)

CollisionDetection4(); //当たり判定(自機/ボス)

CollisionDetection5(); //当たり判定(自ショット/ボス)

Background2(); //スコアボード描写

counter++;

break;

}

FpsTimeFanction(); //FPS計算

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




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

DxLib_End() ;
return 0 ;
}


initial.cpp
#include "DxLib.h"

#include "ExternGV.h"


void initialization(){
int function_status=0;
int i,j;
Player.x=200.0;
Player.y=400.0;
Player.counter=70;
Player.status=0;
Player.range=4;
Player.flag=1;
Player.num=5;
for(int i=0;i<PLAYER_MAX_SHOT1;i++)
for(int j=0;j<PLAYER_MAX_SHOT2;j++)
PlayerShot[i][j].flag=0;
for(i=0;i<ENEMY_TOTAL_NUM;i++){
enemy[i].flag=0;EnemyShot[i].flag=0;
for(int j=0;j<ENEMY_TOTAL_SHOT_NUM;j++)
EnemyShot[i].EnemyShots[j].flag=0;
}


}


こ、これでいいのかな…?


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

Name: 御津凪 [URL]  ..プログラマー(34,601ポイント)   Date: 2008/11/12(水) 00:08   No:23897     
Title: Re:PCを新しくしたら    
遅くなりました。

見たところ初期化部分に特におかしな箇所はなさそうなので、
恐らくコンパイル環境に問題があるかもしれません。
Zバッファ作成失敗、ということは DxLib_Init 関数内で起こっている様子ですし。

たとえば、下記のような単純なサンプルコードをコンパイルし、
#include "DxLib.h"


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;
DxLib_End();
return 0;
}


作成された実行ファイルが同様のエラーログを出すようであれば、
もしかしたらDXライブラリのファイルが壊れている可能性が有りますので、
再度ダウンロードしてみてください。

他にも、下記の方法を試してみてください。
・リリース版でコンパイル、実行
・フルスクリーン表示を行う
・ディスプレイの表示サイズを変えてみる(期待薄)

それと、終了したとき、VC++ の出力ウインドウの末尾行の文に、
プログラム '[***] xxxx.exe: ネイティブ' はコード 0 (0x0) で終了しました。



が、あるはずなので、そこが、「コード -1 (0xffffffff)」となっているのであれば、
DxLib_Init 関数が失敗している(return -1; が実行されている)証拠です。
もしここが「コード 0 (0x0) 」だった場合は、DxLib_Init 関数は成功したが、
その後の処理で失敗をしている可能性が高いです。
(つまり、WinMain 関数が正常に最後まで実行された)

もう一つ、ブレイクポイント(あるいはステップ実行)を使ってデバッグを行えば、
判明しやすいかもしれません。
(Debugビルドじゃないとデバッグ実行できないので注意)

色々とチェックしてほしい点がありますが、それぞれ確認してみてください。


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

Name: 独学初心者  ..入門者(4,467ポイント)   Date: 2008/11/12(水) 00:52   No:23902     
Title: Re:PCを新しくしたら    
御津凪様
途中報告なのですが、今のところ
フルスクリーン起動と解像度変更は駄目っぽいです;
それから、いただいたコードをコピペして…の場合は起動いたしました。

次はDXライブラリをダウンロードしなおそうかと考えていますが、そのまえにご指摘があったところがありましたので、なにか絞り込めないかとおもい、ご報告させていただきます。

それは、終了時の末尾ですが、いただいたコード、DXライブラリのサンプルプログラムではおきないのに、自作のほうのみ「コード -1 (0xffffffff)」が出る、ということです。

自分のコードだけで出るって事は…なんなんでしょう?ほんとに…


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

Name: 御津凪 [URL]  ..プログラマー(35,201ポイント)   Date: 2008/11/12(水) 02:38   No:23906     
Title: Re:PCを新しくしたら    
恐らく、DXライブラリと競合している部分がある可能性があります。

プロジェクトのプロパティで、
C/C++ → 警告レベルを 4 にしてビルドしてみてください。
恐らく警告が沢山出ると思います。
その警告を修正していけば、なんとなく直るような気がします。

それ以前にリンク時での警告が出ていればそれが一番怪しいのですが。

グローバルで宣言している変数が一番怪しい
(DXライブラリのグローバル変数と衝突している可能性がある)ので、
たとえば、
typedef struct Global{

int data;
} Global;

extern Global g_game;


のようにして、一つの構造体にまとめてみるのも一つの手です。
(ただし、変数名をいちいち書き換える必要がある)
一旦そのプロジェクトを複製して、初期化処理以外を削除した状態で実行していく感じで、
どれが悪さをしているか確認したほうがいいですね。

# 書きながらDXライブラリのソースコードを眺めて見ましたが、
# グローバル変数に "WinData" って名前の変数(あるいは関数)は有りますか?
# それがあればそれが問題なのかも。




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

Name: 独学初心者  ..入門者(4,971ポイント)   Date: 2008/11/12(水) 23:00   No:23943     
Title: Re:PCを新しくしたら    
こんばんわ。
うーん…やっぱりどうもさっぱりです;

が、関係があるのかどうかいまいちわかりかねるのですが、少しだけ進展?がありましたのでご報告までに。
警告の方を4にしてみたところ、いくつか出ていた警告などで気になったので、

int WINAPI…のところにブレイクポイントを置いてデバックしてみたところ
自動変数欄に
- hPrevInstance 0x00000000 {unused=??? } HINSTANCE__ *

unused CXX0030: エラーです: 式を評価できません

と言った記述が見つかりました。
ググったりいろいろ自分でも手を出してみたのですが、何のことやらさっぱりで…不甲斐ないばかりです。
おそらく、ここ以前に何かがあってこうなってるってことなんでしょうけれども…

グローバル関数にWinDateとかいった記述が見つかればよかったんですが…

うううーん…元のやつとまったく同じなのにこの差は一体なんなんだろう…




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

Name: 御津凪 [URL]  ..プログラマー(35,249ポイント)   Date: 2008/11/13(木) 03:52   No:23951     
Title: Re:PCを新しくしたら    
hPrevInstance は、普通使用しない変数なので、それは無視してください。

コードを削っていって、どこかで正常に実行できれば、
直前に削ったコードが問題があるということになります。

この方法なら確実に原因がつかめるはずです。
(製作規模によっては酷な方法ですが)

あるいは、一度作り直してみるという奥の手もありますが^^;



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

Name: 独学初心者  ..初心者(5,506ポイント)   Date: 2008/11/14(金) 09:36   No:24016     
Title: Re:PCを新しくしたら    
御津凪様
ご返答ありがとうございます。

一個消してはまた…という作業を、目下続行中です。
仕事の合間合間なので、なかなかはかどらないのですが;

で、やってるときになんとなく気になったのが
どうやら、hinstance等のあたりが、本体の関数で参照されてないというところが、何べんやってもでてくる一文のもようです。
それが、WINAPI…の()内の小文字系すべて同じ記述「'小文字の引数' : 引数は関数の本体部で 1 度も参照されません。」が出てきます。

この警告がどうにも消し方がわからんので、ぼけっとエクスプローラーを眺めていたら
…おかしい。DXlib.hのファイルが、サンプルプログラムとサイズが違う…
サンプルプログラムだと、161kbだったものが、自分のやつだと138kb…
怪しい…怪しすぎる…

と思い、サイズの大きいサンプルプログラムの.hの方を上書きしたら…

出るわ出るわ、リンクエラーの山です。その数240個。

error LNK2001: 外部シンボル "__RTC_CheckEsp" は未解決です。

ですとか

未解決の外部シンボル __RTC_CheckEsp が関数 "void __cdecl SetColor(void)" (?SetColor@@YAXXZ) で参照されました。

ですとか…
もう、一から作り直すしかないのでしょうか…?
こ、こいつぁ一体…


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

Name: 御津凪 [URL]  ..プログラマー(35,903ポイント)   Date: 2008/11/14(金) 13:21   No:24030     
Title: Re:PCを新しくしたら    
つまり、DXライブラリのバージョンが違った、というオチですかね?

DXlib.h を開くと、先頭にバージョンが書かれているので、チェックしてみて下さい。

あと、リンカエラーが出るのはヘッダファイルだけ別のバージョンになったので、
当然出ます。
ライブラリファイルも一緒に上書きしないといけません。
それでも削除されている関数があったりすると思うので、そこを修正すればコンパイルは出来るはずです。


あと、 hinstance 辺りの警告の対処方法ですが、3通り有ります。

1.
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)

{
// ...
}


として、変数名を外す。

2.
int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInstance;
hPrevInstance;
lpCmdLine;
nCmdShow;
// ...
}


と、書く。

3.
プロジェクトのプロパティ→C/C++→詳細→指定の警告を無効にする
で、警告の番号(この場合は 4100)を指定する。
(コンパイル時にその番号の警告が出なくなる)

があります。


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

Name: 独学初心者  ..初心者(5,723ポイント)   Date: 2008/11/14(金) 17:00   No:24059     
Title: Re:PCを新しくしたら    
御津凪様
御返答ありがとうございました。

…目から鱗です…
DXのヘッダ=いじっちゃいけないと言うイメージがあったものですから…

正にver.が違っていました。

おっしゃった通りコピーして、無事にリンクエラーが激減です。


幾つか残ってるのを見たら、自分でなんとかできそうなモノでした。

リンクエラーとか、まだ全然よくわかってなかったので、山の様なエラーを見た時は冷や汗でした…


おかげでなんとかなるとこまでこれました。

拙い説明を読み、丁寧にご説明いただきありがとうございました。


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



Name: 初心者  ..中級者(11,699ポイント)   Date: 2008/11/14(金) 00:53   No:24008       
Title: scanfは使ってはだめ?    
scanfは使ってはダメだとよく聞きます。
オーバーフローは

char str[10];
scanf("%9s",str);

のようにすれば防げるのでしょうけど、
たまったバッファはどうやってクリアしたらいいのですか?
fflushは未定義になるので使ってはダメなのですか?

整数を入力させようとした時、

int a;
scanf("%d",&a);
printf("%d\n",a);
scanf("%d",&a);
printf("%d\n",a);

に対して

120s1

みたいに入力すると

120
120

と表示されてしまいます。
キーボードから正しく入力させるにはどうしたらいいのでしょうか?
getcharを使うのでしょうか?

環境は一応問わないものとします。


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(888,880ポイント)   Date: 2008/11/14(金) 03:39   No:24013     
Title: Re:scanfは使ってはだめ?    
これでどうでしょうか。
エラー処理も含めて正常にint型が取得できると思います。


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

int myGetInt( int *x ){
int i=0, error_flag=0, ch;
char str[11];

memset( str, 0, (size_t)11 ); /* ゼロクリア */

while( ( ch = getchar() ) != '\n' ){
/* 改行が行われるまでループ */

if ( isdigit( ch ) == 0 ){
/* 10 進数で表せなければ */
error_flag=1;
}
if ( i < 10 && ch != -1 ){
str[ i ] = ch;
}
i++;
}

*x = strtol( str, NULL, 10 );
/* str を10進数整数に変換 */

if ( error_flag == 0 && errno != ERANGE && *x != LONG_MIN && *x != LONG_MAX ){
/* エラーフラグがオフで、strtolの結果が正常で、変換可能数値内なら */
return 0;
} else {
return -1;
}
}

int main(){
int a;

if ( myGetInt( &a ) == 0 ){
printf( "%d\n", a );
} else {
printf( "エラー\n" );
}

return 0;

}


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



Name: Dixq (管理人) [URL]  ..伝説なるハッカー(885,801ポイント)   Date: 2008/11/13(木) 14:42   No:23961       
Title: どんな教育アプリを作りましょう…    
突然ですが、
今、顧客や市場の要求に対してニーズの高いソフトを作る練習してみたいなと思っています。

実際に企業で行われているような要求分析、要件定義から、実装まで持っていく一連の作業をやってみようと思っています。

アンケートなどの抽象的なデータからいかにニーズの高い要求を反映したソフトが作れるかという挑戦・・・なんて言うと大げさですが。

大規模なものは時間的にムリなのでここで公開しているクイックソート解説アプリ程度のものを作りたいなと思っています。
ちゃんと作り込める時間があるかどうかはよくわかりませんが^^;

なので、アンケートを作りたいなと思っているので、どのようなジャンルの解説アプリが一番需要があるか
お聞きしたくトピ立てさせていただきました。

例えば
・線形リストを解説するアプリ
・構造体を解説するアプリ
・DXライブラリの基本的なプログラムと実行結果を見比べながら学べるアプリ
などです。

「こんなジャンルの解説アプリを作ってみては?」というご意見、
また、他にもご意見ありましたらよろしくお願いします^^


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


Name: バグ  ..ハッカー(124,838ポイント)   Date: 2008/11/13(木) 14:56   No:23962     
Title: Re:どんな教育アプリを作りましょう…    
Cの標準関数の解説アプリとか…
こういう時に使えばいいよ〜みたいな、簡単なサンプル付きで…
って、なかなか膨大な量になりそうですね(^_^;)


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(885,837ポイント)   Date: 2008/11/13(木) 16:21   No:23963     
Title: Re:どんな教育アプリを作りましょう…    
なるほど、標準関数一覧があっても、なかなかどう使うかわかりにくかったりするものもありますもんね。
それならプログラムや解説文章を外部ファイルにおいておけば自動的に追加でき、
選択したら表示できるようにすればよさそうなので、量は少々多くてもいけそうですね。
・・・ってそれじゃウェブに書いてある解説とかわらないか^^;
せっかくならアプリでしか出来ない説明のしかたってのを考えてみたいと思います。
ご意見ありがとうございます!


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

Name: たかぎ [URL]  ..比類無きプログラマー(71,856ポイント)   Date: 2008/11/13(木) 16:41   No:23965     
Title: Re:どんな教育アプリを作りましょう…    
C++でよければ、例外処理を解説するアプリがあるといいですね。
視覚的に解説できれば、かなり分かりやすくなるはずです。


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

Name: Dixq (管理人)  ..伝説なるハッカー(887,945ポイント)   Date: 2008/11/13(木) 18:09   No:23976     
Title: Re:どんな教育アプリを作りましょう…    
ご意見ありがとうございます。参考にさせていただきますm(_ _)m

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

Name: 御津凪 [URL]  ..プログラマー(35,445ポイント)   Date: 2008/11/13(木) 18:36   No:23984     
Title: Re:どんな教育アプリを作りましょう…    
再帰処理や、ポインタの構造についてなど、
文章だけでは理解しずらい部分をテーマにすればいいかなと思います。
アプリなら楽にアニメーションによる解説が出来ますし。




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

Name: bodomcross  ..かけだし(1,649ポイント)   Date: 2008/11/13(木) 19:56   No:23995     
Title: Re:どんな教育アプリを作りましょう…    
書き込みは少ないですが、

いつも楽しく拝見させていただいています。

さて、アプリなんですが個人的には数学が苦手でゲーム作成時も四苦八苦してるので

ゲームに応用できる数学解説のアプリなんてあったら嬉しいなと思っております。



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

Name: 組木紙織 [URL]  ..熟練のプログラマー(65,568ポイント)   Date: 2008/11/13(木) 21:44   No:24002     
Title: Re:どんな教育アプリを作りましょう…    
教育アプリでは、色々なソート(マイナーなのも含めて)をまとめて解説してくれるとうれしいです。
実装もアルゴリズムに忠実なのから、高速化を目指していじったのまで入れてくれるともっとうれしいです。


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

Name: kazuoni  ..プログラマー(36,905ポイント)   Date: 2008/11/13(木) 22:20   No:24003     
Title: Re:どんな教育アプリを作りましょう…    
自分も皆さんと全く同じなのですが・・・ソートですかねー。
「こんなのもあるんだっ!?」
なんてなって
「ここで(このソート)使ってみようか」
なんてなるととてもいいですね。

ただやはり某参考書に書いてあるのが中心となってしまうのですかね^^;

自分も再起関数の解説には賛成なのですが・・・
あれっていざ自分でちょっと複雑なものを作ろうとするとなかなかわからないものですよね。。
こればかりは自分でやるが一番近道かなと最近思いました^^;
(あまり使わないので・・・。)


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

Name: rom  ..ぴよぴよ(19ポイント)   Date: 2008/11/13(木) 23:47   No:24006     
Title: Re:どんな教育アプリを作りましょう…    
私は一般的な解説より、「ここにしかない」解説をして欲しいと思います。
例えば仰っている線形リストや構造体などの解説をしたアプリは有料など探したらあるかもしれませんが、
龍神録プログラミングの館やゲームプログラミングの館などの内容を元にした動画付き解説なんかはここでしか存在し得ないものだと思います。
ゲームを作りたい人にとってDXライブラリの入門時の解説は需要が高いと思いますし、「オンリーワン」のアプリを目指されてはいかがでしょう。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(888,544ポイント)   Date: 2008/11/14(金) 03:14   No:24012     
Title: Re:どんな教育アプリを作りましょう…    
>御津凪さん

ありがとうございます。
ポインタはみんなが最初に躓く分野ですもんね。その辺をわかりやすく解説するといいかもしれませんね。

>bodomcrossさん

書き込みありがとうございます。是非気軽に書き込んでくださいね。
なるほど、数学的な分野はなかなか普段使ってないと忘れてる人も多いですもんね。
シューティングには基本的な数学の知識が必要ですし、文字だけではなかなか読む気になれないことが多いので、
その辺作ってみるといいかもしれませんね。

>組木紙織さん

そうですね。やはりアルゴリズムの勉強と聞くとソートがパッと思いつきますね。
そしてソートのプログラムは本で読んだだけでは処理の内容がよくわからない場合が多い。
それこそアプリの出番ですね。

>kazuoniさん

やはりソートが人気のようですね。
ソートこそ本ではわかりにくい分野ですし、アプリが活かせる分野ですね。
再帰関数も含め、なかなか処理が難しいアルゴリズムはやっぱり自分で紙にかくなりして考えないと難しいですよね。
再帰関数は式の定義通りかけばいいという利点があるので、内容を理解しなくていいということもありますが、
ヒープソートや基数ソートはやはり自分で紙に書いて考えた方がわかりやすいかもしれませんね。

>romさん

そうですね、確かに「他に無いもの」というのはいいですね。
ここにおこしになっている人のほとんどはゲーム制作が目的であることが予測される為、
DXライブラリ関係の解説は需要が高いかもしれません。
そしてプログラムと実行結果を比較してみれる仕様にしたりして関数の一般的な使い方を
説明していけばわかりやすいかもしれませんね。

皆様ご意見ありがとうございます。


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



Name: 質問です  ..ぴよぴよ(52ポイント)   Date: 2008/11/13(木) 13:45   No:23958       
Title: ■と空白を使って文字を表現する方法    
C言語で画面に■と空白を使ってBの字を書くプログラムを作りたいのですが、どうしたらいいですか?
大きさは入力によって指定が出来るようにします


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(885,304ポイント)   Date: 2008/11/13(木) 14:01   No:23959     
Title: Re:質問です    
パッと考えられる方法は円と直線で表現する方法でしょうか。

コンソールにprintfでいいのですよね。

例えばDの字なら以下のように表現出来るのではないでしょうか。



#include <stdio.h>

#define XMAX 15
#define XMIN 0
#define YMAX 15
#define YMIN -15

int req(int x, int y){
if( x*x + y*y <= YMAX*YMAX && x*x + y*y > (YMAX-2)*(YMAX-2) ){
return 1;
}
if( x == 0 || x == 1 ){
return 1;
}
return 0;
}

int main(void){
int x, y;
for( y=YMAX ; y>=YMIN ; y-- ){
for( x=XMIN ; x<=XMAX ; x++ ){
if ( req( x , y ) == 1 ){
printf( "■" );
} else {
printf( " " );
}
}
printf( "\n" );
}
}


実行結果

■■              
■■■■■■          
■■■■■■■■        
■■    ■■■■      
■■     ■■■■     
■■       ■■■    
■■        ■■■   
■■         ■■   
■■         ■■■  
■■          ■■  
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■            ■■
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■           ■■ 
■■          ■■  
■■         ■■■  
■■         ■■   
■■        ■■■   
■■       ■■■    
■■     ■■■■     
■■    ■■■■      
■■■■■■■■        
■■■■■■          
■■              


少し大きい円の方程式より内側であり、少し小さい円の方程式の外側であれば■
xが0か1ならば■
それ以外なら空白を出力するとこうなります。

方程式の上、下を使えば斜めも表現出来ると思います。
例えば×を書くプログラムは

#include <stdio.h>

#define XMAX 10
#define XMIN -10
#define YMAX 10
#define YMIN -10

int req(int x, int y){
if( y >= -x-1 && y <= -x+1 ){
return 1;
}
if( y >= x-1 && y <= x+1 ){
return 1;
}
return 0;
}

int main(void){
int x, y;
for( y=YMAX ; y>=YMIN ; y-- ){
for( x=XMIN ; x<=XMAX ; x++ ){
if ( req( x , y ) == 1 ){
printf( "■" );
} else {
printf( " " );
}
}
printf( "\n" );
}
}

実行結果

■■                 ■■
■■■               ■■■
 ■■■             ■■■ 
  ■■■           ■■■  
   ■■■         ■■■   
    ■■■       ■■■    
     ■■■     ■■■     
      ■■■   ■■■      
       ■■■ ■■■       
        ■■■■■        
         ■■■         
        ■■■■■        
       ■■■ ■■■       
      ■■■   ■■■      
     ■■■     ■■■     
    ■■■       ■■■    
   ■■■         ■■■   
  ■■■           ■■■  
 ■■■             ■■■ 
■■■               ■■■
■■                 ■■

このようにかけると思います。
Bを書くときは、円の中心をずらして、2つ用意し、Dを拡張すると出来ると思います。
変更する箇所はreq内の判定式だけで大丈夫です。

完成したら、大きさをscanfなどで指定出来るように変更すればよいと思います。

もしやりたいことが違ったらごめんなさい。


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

Name: Dixq (管理人)  ..伝説なるハッカー(885,321ポイント)   Date: 2008/11/13(木) 14:02   No:23960     
Title: Re:質問です    
題名は適切なものに変更しておきました。

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

Name: non  ..入門者(3,226ポイント)   Date: 2008/11/13(木) 18:03   No:23973     
Title: Re:質問です    
目的がよくわからないのですが、このような方法はいかがでしょうか?
ペイントで白黒のサイズを160×160ピクセルにして、文字「B」を描き、保存します。
このビットマップファイルをバイナリで読み出し、適当にサンプリングして、■を書きます。


#include <stdio.h>

int main(void)
{
FILE *fp;
unsigned char data[160*160/8];
size_t size;
int i,j;

fp = fopen( "B.bmp", "rb" );
if( fp == NULL )
{
puts( "File Open ERROR" );
return 1;
}
fseek(fp, 0x3e, SEEK_SET);
size = fread( data, 1, 160*160/8, fp );
if( size != 160*160/8){
puts("File Read ERROR");
return 1;
}
fclose( fp );

for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(data[20*(19-i)*8+j]>0x7f)
printf(" ");
else
printf("■");
}
printf("\n");
}

return 0;
}


実行結果はこのようになります。
            
 ■■■■■■■■   
 ■■■■■■■■   
 ■■■   ■■■  
 ■■■    ■■  
 ■■■    ■■  
 ■■■   ■■■  
 ■■■■■■■■   
 ■■■■■■■■   
 ■■■   ■■■  
 ■■■    ■■  
 ■■■    ■■  
 ■■■    ■■  
 ■■■   ■■■  
 ■■■■■■■■   
 ■■■■■■■    


倍率をいろいろと変えるのはサンプリングの場所を、計算するのが面倒だと思いますが・・・。


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

Name: やそ  ..比類無きプログラマー(85,328ポイント)   Date: 2008/11/13(木) 19:26   No:23992     
Title: Re:質問です    
1110
1001
1001
1110
1001
1001
1110

とか書きたい文字をデータで保管しておき、
1=■
0=空白
とかで表示すればいいのでは?


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

Name: lbfuvab  ..初心者(7,941ポイント)   Date: 2008/11/14(金) 00:55   No:24009     
Title: Re:質問です    
独自フォーマットを作るのも手ですね。
(int型で高さ)(int型で横幅)(以下■は1,□は0の2進データで記録。余分は0で埋める)
みたいな感じで。


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



Name: パソコンのパはパーソ(略)  ..ぴよぴよ(72ポイント)   Date: 2008/11/12(水) 23:31   No:23945       
Title: 開発環境    
次世代CPUの登場に伴い、現在の32bit環境から64bit環境への移行を模索しているのですが、
64bit環境下で32bit用のアプリケーションの開発は行えるのでしょうか?


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


Name: たかぎ [URL]  ..比類無きプログラマー(71,799ポイント)   Date: 2008/11/13(木) 08:18   No:23953     
Title: Re:開発環境    
64ビット、32ビットといっても、OSも(搭載されるかどうかも含めて)分かりませんので何ともいえません。
まあ、出来るか出来ないかでいえば「出来ます」。
環境によっては、開発ツールを自作することになるかもしれませんが...


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

Name: パソコンのパはパーソ(略)  ..ぴよぴよ(151ポイント)   Date: 2008/11/13(木) 21:11   No:24000     
Title: Re:開発環境    
すいません(汗
開発環境と書いておきながら、肝心な事を書いていませんでした・・・

OS:Vista Ultimate 64bit
開発ツール:Microsoft Visual Studio 2005
です。


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

Name: たかぎ [URL]  ..比類無きプログラマー(72,252ポイント)   Date: 2008/11/14(金) 00:45   No:24007     
Title: Re:開発環境    
> OS:Vista Ultimate 64bit
> 開発ツール:Microsoft Visual Studio 2005

もしかするとエディションにもよるのかもしれませんが、どちらでも出来たはずです。


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



Name: 山崎  ..入門者(2,875ポイント)   Date: 2008/11/12(水) 00:05   No:23896       
Title: (改題)ウインドウが表示されない+循環するインクルードについて    
先日「クラスをnewで作成するとウインドウが表示されなくなる」というタイトルで
質問させていただいた山崎です。
ちょっとこちらの質問が簡略化しすぎたせいかわかりにくくなってしまい、
且つ悩んでいるうちに原因が見えてきた気がするので再度改めまして別の質問させて頂きたく思います。
なお、前回の質問は下の方にそのまま残しておりますので、
よろしければご覧頂きたいと思います。
記事をあげてしまい、他の質問者の方にはご迷惑をおかけして誠に申し訳ございません。

現在プログラムをファイルに分割していく作業を行っています。
次のような3つのヘッダファイルがありそれぞれクラスが記述されているとします。

----------------A.h--------------------
class classA
{
classB b;
};

----------------B.h---------------------
class classB
{
classC c;
};

----------------C.h---------------------
class classC
{
classA a;
};

このように3すくみのような関係で各クラスが各クラスのインスタンスをメンバに持っている場合、
どのように#includeしていけばよいのでしょうか。

classAはclassBのインスタンスをメンバに持つため、A.hの最初でB.hをインクルードしなければならず、
classBはclassCのインスタンスをメンバに持つため、B.hの最初でC.hをインクルードしなければならず、
classCはclassAのインスタンスをメンバに持つため、C.hの最初でA.hをインクルードしなければならず・・・
というのが永遠に続いてしまうのでしょうか。
それぞれのヘッダファイルに#ifndefと#defineをつけて多重インクルードを避けるようにしてみましたが、
C.hでA.hをインクルードしたにもかかわらず「classA a;」の行で「型名が必要」というエラーになります。

皆様のお知恵を借りたいと思います。よろしくお願いします。




以下は、前回の質問の内容です。
-----------------------------------------------------------------------

毎度毎度お世話になっております、山崎です。
最近何度も質問しにきて誠に申し訳ございません。
この度は、ビルドは通るのですが実行開始してもウインドウが立ち上がらないことについて
お伺いに参りました。

現在、主人公の技をつかさどるクラスなどを作っております。
すべての技のベースとなる親クラスSkillBaseクラスを作成し、
それを継承してそれぞれの技となる子クラスを作っていこうと思っております。
技となる子クラスは必要なときにnewで確保し、親クラスの配列に格納して利用しようと思っています。

しかし、親クラスの配列に子クラスのインスタンスを格納するという一行を加えると、
ビルドは通るのですが実行するとウインドウが立ち上がりません。
タスクマネージャを開くとプロセスの中にはそれまで作成していたプログラムが
動いていてCPUの50%ほどを占めているのですが、タスクバーには表示されません。

おそらくこの問題に関係しているのは3つのファイルで、
技クラスの宣言も定義も記述されたSkill.h、
主人公をつかさどるクラスなどの宣言を記述したShujinko.h、
その動作を記述したShujinko.cppです。
コードは以下のような感じになっております。

------------Skill.h-----------------
#include "Shujinko.h"
...

class SkillBase{
...
public
virtual void SkillMain(){};
};

class Fire:public SkillBase{
...
public:
void SkillMain(){
...
(Shujinkoクラスのインスタンスを使った処理)
...
}
};

-------------Shujinko.h--------------
...

class SkillBase;//前方宣言(?)しておく

class Shujinko{
SkillBase* Skills[3];
...
public:
Shujinko();

...
};

------------Shujinko.cpp---------------
#include "Shujinko.h"
#include "Skill.h"
...

void Shujinko::Shujinko(){
Skills[0]=new Fire();//この行を付け加えると実行してもウインドウが表示されない
}

プログラムが7つのファイルに分かれコードも何百行かあるので
おそらく不具合の原因が関係しているであろう部分のコードだけを
簡略化して載せました。
本物のファイルにはもっとさまざまなクラスが記述されております。

どうすればウインドウを表示できるようになるのでしょうか。
皆様のお力をお借りしたいと思います。

これまでにも何度か、今回の相談以外にもビルドは通ったのに実行してもウインドウが立ち上がらないことがありました。
いろいろ書いたり消したりしているうちにいつのまにかウインドウが立ち上がるようになったり結局あきらめたりしていたのですが、
この現象には共通点があるのでしょうか。


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


Name: 御津凪 [URL]  ..プログラマー(34,737ポイント)   Date: 2008/11/12(水) 00:21   No:23898     
Title: Re:クラスをnewで作成するとウインドウが表示されなくなる    
うーん、省略化されていない部分を見る限りでは、
ウインドウが表示されなくなるといった問題は判らないですね。

ウインドウが立ち上がらないのと、CPUの50%ほどを占めているあたり(デュアルコア?)、
どこかで無限ループが行われている可能性があります。


もし、差し支えないのであれば、ソースファイルを圧縮して添付していただけませんか?




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

Name: 山崎  ..入門者(3,199ポイント)   Date: 2008/11/12(水) 00:38   No:23900     
Title: Re:クラスをnewで作成するとウインドウが表示されなくなる    
>御津凪さん
ご返信まことにありがとうございます。

誠にお恥ずかしいながら、私の稚拙なプログラムを添付させて頂きますね。
試行錯誤の塊ですので、お見苦しいコードや非効率なプログラムもあると思います・・・。

とりあえず、3つのファイルを添付させていただきます。
もしほかのファイルも必要なようでしたら、お手数ですがおっしゃってもらいますと幸いです。
上の記事では主人公のクラスであることを示すためにShujinkou.hとしましたが、
本物はTools.hというファイルにいろいろなものをまとめてあります。

ハードはあまり詳しくないので確かなことは言えないのですが、
確かデュアルコアだったと思います。
私にとっては宝の持ち腐れですね。

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


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

Name: 御津凪 [URL]  ..プログラマー(35,376ポイント)   Date: 2008/11/13(木) 04:33   No:23952     
Title: Re:クラスをnewで作成するとウインドウが表示されなくなる    
遅くなりました。
添付したファイルを確認しても、該当する箇所が見つけられませんでした。

このままでは実行確認が取れないので、一通りのファイルの添付をお願い出来ますでしょうか。
mitsunagistudio@gmail.com
(もし掲示板のほうで出したくない場合は、上の空行の部分を選択して見えるメールアドレスに添付して送ってください。)


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

Name: 山崎  ..入門者(3,335ポイント)   Date: 2008/11/13(木) 23:19   No:24005 解決!     
Title: Re:クラスをnewで作成するとウインドウが表示されなくなる    
御津凪様

メールのほうでもご連絡いたしましたが、
この度は誠にありがとうございました。

これからは、DXライブラリの初期化より前にDXライブラリの関数を呼ぶことの無いよう
更なる注意を払っていきたいと思います。

何から何まで、親切な対応をしていただき感謝と主に感動しております。
本当にありがとうございました。


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



Name: C  ..ぴよぴよ(286ポイント)   Date: 2008/11/12(水) 21:26   No:23936       
Title: ポインタ・構造体    
プログラムで入力した単項式を次数の大きい順に出力するプログラムに変更したいのですが最後のfor文の中をif文で条件つければいいのでしょうか?
ポインタや構造体が出てきたらさっぱり分からなくなってきてます
紙にどこがどこを指し示していってるのか辿っていったほうがいいのかな・・・


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


Name: box  ..ハッカー(129,043ポイント)   Date: 2008/11/12(水) 21:37   No:23937     
Title: Re:ポインタ・構造体    
出力時に並べ替えるのはむずかしいと思います。
リスト構造に格納するときに、次数の大きい順になるようにしておいて、
先頭から順に出力すればよいです。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(883,734ポイント)   Date: 2008/11/13(木) 12:47   No:23957     
Title: Re:ポインタ・構造体    
まずは「ソート」について勉強してはどうでしょうか?
もっとも簡単なソートは単純ソートです。

http://www.google.co.jp/search?q=%E5%8D%98%E7%B4%94%E3%82%BD%E3%83%BC%E3%83%88&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a

boxさんのおっしゃっているように、まず大きい順にソートしてから格納してはどうでしょうか?
まずは、線形リストや構造体のことは忘れ、ソートをするだけのプログラムを書いてみてください。

たとえば

(1) 10個の整数を入力し、それを大きい順に表示するプログラムを作れ

と書いてあったら出来ますか?最初から全て作ろうとすると挫折しがちなので、
出来るところから少しずつやってみましょう。
また、リンク先は見ないで、まず自分でアルゴリズムを考えてやってみると、アルゴリズムを考える勉強になると思います。
また、ソートの仕方はすごくたくさんあります。
自分なりのソートの仕方を見つけてみるといいと思います。


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



Name: kokoro  ..入門者(4,452ポイント)   Date: 2008/11/12(水) 16:20   No:23919       
Title: 学校の課題なんですが・・・    
問題は
★下記の仕様を満たすプログラムをC言語で作成しなさい.

【仕様】日数計算プログラム

▼今日の日付と生年月日を入力すると,今日が生年月日から数えて何日目にあたるかを表示する.西暦・月・日をスペースで区切って入力する.
▼この場合,「うるう年」を考慮しなければならない.「うるう年」の条件は,
@西暦が4で割り切れる.
Aただし,西暦が100で割り切れる年は除く.
Bただし,西暦が400で割り切れる年は含める.
▼「今日は、あなたが生まれた日から数えて〜日目です。」と表示する.
▼計算式は,(西暦1年1月1日から今日までの日数)−(西暦1年1月1日から生年月日までの日数)を使えばよい.
▼生年月日が今日の日付より後になっているときは,「生年月日が今日の日付より後になっています!」とエラーメッセージを表示する.
▼最低限,次の関数を使うこと.
@main関数(これは当たり前ですが)
A入力された値が計算に適切な値かをチェックする関数(4月31日などありえない日付を入れると,「年月日が正しい範囲にありません」と表示する)
B日付を計算する関数
▼日付の入力やメッセージの表示はmain関数で行うこと(ポインタに関する課題なので参照渡しを使うこと).

です。考え方を教えてほしいです。
できたところまでのソースを添付しておきます
[2] 環境  
 [2.1] OS : Windows xp
 [2.2] コンパイラ名 :bcc?
[3] その他
 ・どの程度C言語を理解しているか→繰り返し文と判断条件文ポインタを勉強しました。
 


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


Name: たいちう  ..上級者(16,452ポイント)   Date: 2008/11/12(水) 16:46   No:23920     
Title: Re:学校の課題なんですが・・・    
次の2つの関数を作るのはいかがでしょうか。

西暦1年1月1日から西暦Y年12月31日までの日数を返す関数:
forループで1〜Yまで、うるう年かどうかによって365か366を足せばよい。

Y年の、1月1日からM月末日までの日数を返す関数:
forループで1〜Mまで、月毎の日数を足せばよい。
2月についてはうるう年の判定を忘れずに。

# 仕様に書かれている「西暦1年1月1日から今日までの日数」は便宜的なもので、
# 比較的最近の日付同士で引き算をすることが前提だから許されています。
# 信じないように。


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

Name: やそ  ..比類無きプログラマー(85,278ポイント)   Date: 2008/11/12(水) 17:26   No:23922     
Title: Re:学校の課題なんですが・・・    
http://ufcpp.net/study/algorithm/o_days.html

「うるう年計算」で検索すればたくさんHITします。

ここの過去ログにも同様の話題もありました。
いろいろ調べてみましょう^^


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

Name: Haru  ..上級者(19,590ポイント)   Date: 2008/11/12(水) 17:28   No:23923     
Title: Re:学校の課題なんですが・・・    
カレンダーについては、「C言語 カレンダー」とか「C 万年カレンダー」とかでググれば、すぐにソースが見つかります。
もし、自力で作りたいなら、途中までソースを作ってからわからないところを聞いてください。ちなみに、数学に弱い私はうるう年の判定のところはソースを見ながらでも、あまり理解してません。
とりあえず、カレンダーをコピー(もしくは自作)して、今日の日付と生年月日を入力する。という所まで作ってみてはいかがでしょう?


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

Name: non  ..入門者(2,703ポイント)   Date: 2008/11/12(水) 17:29   No:23924     
Title: Re:学校の課題なんですが・・・    
まず、引数で与えた年が閏年かチェックする関数を作ってみませんか?
プロトタイプを

int uruu(int year);
引数 year 西暦年(1以上とする)
戻り値 閏年なら1,閏年でないなら0を返す。

作れますか?



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

Name: kokoro  ..入門者(4,470ポイント)   Date: 2008/11/12(水) 17:30   No:23925     
Title: Re:学校の課題なんですが・・・    
分かりました。
やってみます。


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

Name: たかぎ [URL]  ..比類無きプログラマー(71,858ポイント)   Date: 2008/11/12(水) 17:36   No:23926     
Title: Re:学校の課題なんですが・・・    
質問を読む限りでは、完全にスクラッチで実装する必要があるとも思えませんので、mktimeとdifftimeを使えば簡単にできそうです。


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

Name: lbfuvab  ..初心者(7,931ポイント)   Date: 2008/11/12(水) 18:21   No:23927     
Title: Re:学校の課題なんですが・・・    
ざっと考えると
まずは閏年を考えずに日数を出し、それから何回2月29日があるかを考えた方が楽かもしれません。


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

Name: non  ..入門者(2,715ポイント)   Date: 2008/11/12(水) 20:12   No:23931     
Title: Re:学校の課題なんですが・・・    
閏年かチェックする関数はできたでしょうか?
次に、引数で年月日を渡したら、西暦1年1月1日からの経過日数を求める関数を作りましょう。

int date(int y,int m,int d);
引数 
 int y:西暦年
 int m:月
 int d:日
戻り値
 西暦1年1月1日からの日数

作り方
1 最初に y-1年12月31日までの日数を求めます。
 for文で、1からy-1まで先に作ったuruuを使って365か366を累計していきます。
2 m-1月までの日数を累計します。
それには月数の配列を用意します。
 int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 for文を使ってm-1月まで累計します。
3 これに日数dを足します。
4 y年が閏年の場合でm>2なら+1します。

じゃ、頑張ってみて。


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

Name: Mist  ..プログラマー(31,605ポイント)   Date: 2008/11/12(水) 20:39   No:23934     
Title: Re:学校の課題なんですが・・・    
この問題の最大の問題は

> ポインタに関する課題なので参照渡しを使うこと

と思います。
普通に作ると使うところがないんですよね。
nonさんのdate関数で、対して意味がないけど

void date(int y,int m,int d, int *date)

としてみるとか。


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

Name: kokoro  ..入門者(4,526ポイント)   Date: 2008/11/12(水) 23:31   No:23946     
Title: Re:学校の課題なんですが・・・    
みなさんありがとうございます。

なんとかやってみます。
わからないことがあったら、また教えてください。


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



Name: こめかみ  ..プログラマー(25,342ポイント)   Date: 2008/10/21(火) 01:10   No:22724       
Title: 数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
取り組んでいた問題の回答が自分のアプローチと違ったので、頭のモヤモヤが晴れません。
課題の指示の意味を汲み取りきれなかった自分が悪いのですが、
せっかくだから自分のやり方で最後までやってみたいと思っているので、
アドバイスよろしくお願いします。

【質問】
数学でいう組み合わせの問題の解き方で、
再帰ではなく
約分を使って解きたい(実装したい)のですがどのように取り組めばよいでしょうか。

今の自作ソースだと10とか20とか二桁台の入力でcombination関数内のjとkの値が膨大になって、
int型だと正常な結果が得られません。(jとkをint型にすることを目指しています)
課題を解きたいのではなく自分で考えた計算式を解きたいので、
題意を満たしていないとか言わないでいただければありがたいです。


以下は、正式な回答と、自分で解きかけた問題(約分ではなく力技)です。
参考までに、自分の解きかけた問題は変数の中身が見えるようにしたものも添付しておきます。

環境はwindowsXPでcygwinです。

正答(再起使用)
/*

異なるnこの整数からrこの整数を取り出す組み合わせの数nCrを求める関数
int combination(int n, int r){}
を作成せよ。なおnCrは以下のように定義される。
nCr = (n-1)C(r-1) + (n-1)Cr (ただし、nC0 = nCn= 1,、nC1 = n)
*/

#include <stdio.h>

int combination(int n, int r)//※仮引数はint型でないといけない
{
if(r==0||r==n)
return (1);
else if(r == 1);
return(n);
return (combination(n - 1, r - 1) + combination(n - 1, r));
}

int main()
{
int i, j;

puts("異なるn個からr個の整数の組み合わせの数を求めます.");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("組み合わせの数は%dです.\n", combination( i, j) );

return 0;
}



自力ソース
/*

異なるnこの整数からrこの整数を取り出す組み合わせの数nCrを求める関数
int combination(int n, int r){}
を作成せよ。なおnCrは以下のように定義される。
nCr = (n-1)C(r-1) + (n-1)Cr (ただし、nC0 = nCn= 1,、nC1 = n)
*/

#include <stdio.h>

int combination(int n, int r)//仮引数はint型でないといけない
{
int i;//ループ用変数
double j=1;//分子
double k=1;//分母
//int bunshi[n],bunbo[r];//なんとなく書いてみたのですが、配列の宣言に変数は使えないのですよね。

//(n-r)がr未満のときとr以上のときとそれ以外、
if( ( (n-r)<r ) && (n>=r) ){
for(i=r; i>0; --i){
j *= (n--);
k *= (r--);
}
}else if( ( (n-r)>=r ) && (n>=r) ){
for(i=n; i>r; --i){
j *= (n--);
}
for(i=r; i>0; --i){
k *= (r--);
}
}else{
puts("n>=rで入力してください.");
}
return (j/k);
}

int main()
{
int i, j;

puts("異なるn個からr個の整数の組み合わせの数を求めます.");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("組み合わせの数は%dです.\n", combination( i, j) );

return 0;
}



説明のために画像使うとファイルの添付ができないようですね。
(画像内の"="一つ余分でしたすみません)
(それ以前に字が汚くてすみません、数学の記号がうまく表せている自信が無かったので手書きしてみました)
添付は改めてさせていただきます。(あまり意味は無いかも知れませんが、一応)

よろしくお願いします。



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


Name: こめかみ  ..プログラマー(25,398ポイント)   Date: 2008/10/21(火) 01:15   No:22725     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
変数の中身が見えるようにしたものはこちらです。


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

Name: こめかみ  ..プログラマー(25,448ポイント)   Date: 2008/10/21(火) 02:14   No:22728     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
添付ファイルの

//for(i=n; i>r; --i)だと無限ループになるのは何故?

のコメントは間違いです。すみません。


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

Name: mats  ..ぴよぴよ(318ポイント)   Date: 2008/10/21(火) 02:25   No:22729     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
焼け石に水程度かもしれませんが、nCr = nC(n-r) を利用して、rが大きい場合に数を減らしてjやkの負担を減らすのも一つの手かと思います

上の例ですと、10C6 = 10C4 とすることでjが151,200 から5040まで減ります


> 今の自作ソースだと10とか20とか二桁台の入力でcombination関数内のjとkの値が膨大になって、
> int型だと正常な結果が得られません。(jとkをint型にすることを目指しています)

jとkはint型じゃなければいけないのでしょうか?
long型や、(gccなら使えるはずなので)long long型にするだけでも大分違いそうな気がしますが・・・


的外れな事を言っていたらすいません;;;


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

Name: こめかみ  ..プログラマー(25,688ポイント)   Date: 2008/10/21(火) 02:42   No:22731     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
matsさんありがとうございます。

>nCr = nC(n-r) を利用して、rが大きい場合に数を減らしてjやkの負担を減らす
実は上のソースでもうやっています。
わかりにくいですよね、コメントを書くべきでした、ごめんなさい・

/(n-r)がr未満のときとr以上のときとそれ以外、
if( ( (n-r)<r ) && (n>=r) ){
for(i=r; i>0; --i){
j *= (n--);
k *= (r--);
}
}else if( ( (n-r)>=r ) && (n>=r) ){//←nCr = nC(n-r)
for(i=n; i>r; --i){
j *= (n--);
}
for(i=r; i>0; --i){
k *= (r--);
}
}

>jとkはint型じゃなければいけないのでしょうか?
>long型や、(gccなら使えるはずなので)long long型にするだけでも大分違いそう
それはそうなのですが型の大きさを変えるだけだとどうもイタチゴッコな気がするので、
約分なら根本的な解決になるのではと思い、試みています。


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

Name: こめかみ  ..プログラマー(25,710ポイント)   Date: 2008/10/21(火) 03:00   No:22734     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
ん?逆かもしれない、
ちょっと検証しなおします。


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

Name: こめかみ  ..プログラマー(25,694ポイント)   Date: 2008/10/21(火) 03:08   No:22735     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
添付するファイルが間違ってました正常動作しませんね、ごめんなさい。
今急いで正常にコンパイルできるのを探してます。


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

Name: mats  ..ぴよぴよ(537ポイント)   Date: 2008/10/21(火) 03:17   No:22736     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> >nCr = nC(n-r) を利用して、rが大きい場合に数を減らしてjやkの負担を減らす
> 実は上のソースでもうやっています。

うわ、恥ずかしい・・・
すいません、ちゃんと読めてませんでした;;;


> //int bunshi[n],bunbo[r];
約分を目指すなら、出てきた数字はやはり覚えておく必要がありそうですね
mallocを使用すれば動的に配列を確保できるので、それで bunshi[r], bunbo[r]を確保してあげて
bunshi[r]とbunbo[r]で共通の約数を探して約分、
bunbo[r]の中身がすべて1になったらbunshi[r]をすべて掛けた値を返す、といったところですかね・・・?

もっと頭のいい方法がありそうな気もしますがちょっと思いつかないです;


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

Name: こめかみ  ..プログラマー(25,795ポイント)   Date: 2008/10/21(火) 03:49   No:22737     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>すいません、ちゃんと読めてませんでした;;;
こちらこそすみません、意図した動作をしてませんでした。

ここにとりあえず当初の狙い通りのファイルを添付しますが、
nCr = nC(n-r)
は実装できてません。

明日があるので今日はもう切り上げます、また明日(今日?)よろしくお願いします。


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

Name: たいちう  ..中級者(11,869ポイント)   Date: 2008/10/21(火) 11:08   No:22749     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
添付ファイルの方は見てないけど、面白そうなのでとりあえず約分してみました。
もっと美しく書けそうなもんだけどね。

// 最小公倍数

int GCD(int u, int v)
{
int t;
while (u > 0) {
if (u < v) {
t = u;
u = v;
v = t;
}
u -= v;
}
return v;
}

int Combination(int n, int r)
{
int i, numerator[N] = { 0 }, denominator[N] = { 0 };
int indexN, indexD;
int result;

// 初期値セット
for (i = 0; i < r; i++) {
numerator[i] = n - i;
denominator[i] = i + 1;
}

// 約分
indexD = 0;
while (denominator[indexD]) {
indexN = 0;
while (denominator[indexD] > 1) {
int gcd = GCD(denominator[indexD], numerator[indexN]);
if (gcd > 1) {
denominator[indexD] /= gcd;
numerator[indexN] /= gcd;
} else
indexN++;
}
indexD++;
}

// 掛け算
result = 1;
for (i = 0; i < r; i++)
result *= numerator[i];

return result;
}


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

Name: たいちう  ..中級者(11,895ポイント)   Date: 2008/10/21(火) 11:13   No:22751     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
Nの定義を貼るのを忘れてましたので、一応追記。
#define N 100


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

Name: こめかみ  ..プログラマー(26,309ポイント)   Date: 2008/10/21(火) 17:20   No:22772     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
※すぐ下の投稿に再掲しました。

これが昨日の段階での正しいベストソースです。

同じような名前でバックアップとりまくってたら、
どれが正しいファイルなのかわからなくなってました;

※すぐ下の投稿に再掲しました。


>>たいちうさん

ありがとうございます。

これからじっくり参考にさせていただきます。
なにやら見慣れぬ英語の変数だらけでワタクシ辞書引きまくりなのですが。

あと、どうでもいいですが私のその手持ちの辞書では、
GCDは最大公約数とあるのですが。書き間違いですよね?


>>matsさん
>mallocを使用すれば動的に配列を確保できるので

挑戦してみます。


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

Name: こめかみ  ..プログラマー(26,658ポイント)   Date: 2008/10/21(火) 17:26   No:22773     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
preで失敬しました。再掲します。

#include <stdio.h>


int combination(int n, int r)//仮引数はint型でないといけない
{
int i;//ループ用変数
double j=1;//分子
double k=1;//分母
//int bunshi[n],bunbo[r];//なんとなく書いてみたのですが、配列の宣言に変数は使えないのですよね。

//(n-r)がr未満のときとr以上のときとそれ以外、
if( ( (n-r)>=r ) && (n>=r) ){
for(i=r; i>0; --i){
j *= (n--);
k *= (r--);
}
}else if( ( (n-r)<r ) && (n>=r) ){//←nCr = nC(n-r)
for(i=n; i>r; --i){
j *= (n--);
}
for(i=(n-r); i>0; --i){
k *= (r--);
}
}else{
puts("n>=rで入力してください.");
}
return (j/k);
}

int main()
{
int i, j;

puts("異なるn個からr個の整数の組み合わせの数を求めます.");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("組み合わせの数は%dです.\n", combination( i, j) );

return 0;

}


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

Name: こめかみ  ..プログラマー(26,731ポイント)   Date: 2008/10/21(火) 17:31   No:22774     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>> >nCr = nC(n-r) を利用して、rが大きい場合に数を減らしてjやkの負担を減らす
>> 実は上のソースでもうやっています。

>うわ、恥ずかしい・・・
>すいません、ちゃんと読めてませんでした;;;

恥ずかしいのは私の方です。
見返したら全然出来てませんでしたort


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

Name: 初級者  ..ぴよぴよ(0ポイント)   Date: 2008/10/21(火) 21:04   No:22793     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
 

Name: hoge  ..かけだし(2,035ポイント)   Date: 2008/10/21(火) 21:46   No:22794     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
ループの向きを逆にしよっか。
そうすれば、確実に割り切れるぞ。


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

Name: 初級者  ..ぴよぴよ(287ポイント)   Date: 2008/10/21(火) 22:19   No:22795     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

もっと単純に考えよう。
配列もmallocも、最大公約数もいらない。


#include <stdio.h>

int combination(int n, int r)
{
int combi, i;

for (combi = i = 1; i <= r; i++, n--) {
combi *= n, combi /= i;
}
return combi;
}

int main(void)
{
int n, r;

for (n = 0; n <= 9; n++) {
for (r = 0; r <= n; r++) {
printf("%dC%d=%3d ", n, r, combination(n, r));
}
putchar('\n');
}
return 0;
}





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

Name: こめかみ  ..プログラマー(28,000ポイント)   Date: 2008/10/23(木) 06:50   No:22889     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
考えをまとめたいのでにちょっと書きこまさてください。

以下読みにくいですが(スパゲッティコードって奴なのかな?)
現段階でのソースです。

自力で解くつもりですが、calloc関数を使うのが始めてだったりと自信が少しありません。
初心者には致命的に気づきにくいようなミスなどありましたら、
指摘していただければありがたいですが、
質問としてはあまりにまとまっていないと自覚しているので、
あまり積極的なアドバイスはお願いしません。

あくまで考えをまとめるために失礼します。


…とか何とかえらそうに言っといて一つ質問があります。
スレッドの本題とは関係ないのでなにとぞご容赦ください。

上のたいちうさんのプログラムをコピペしてコンパイルしたときに、


#include <stdio.h>

を忘れてコンパイルしたのですが、なんとコンパイルできてしまいました。
環境はcygwinです、どういうことだかご存知の方いらっしゃいませんでしょうか。





"再帰を使わないで、組み合わせを解くプログラム(一応実行できますがバグだらけです)"
#include <stdio.h>

#include <stdlib.h>

// 最大公約数(たいちうさんのを流用)
int GCD(int u, int v)
{
int t;
while (u > 0) {
if (u < v) {
t = u;
u = v;
v = t;
}
u -= v;
}
return v;
}

int combination(int n, int r)//仮引数はint型でないといけない
{
int i, j, k, m, x, y, nr;//ループ用変数,nCr = nC(n-r)用変数、その他

//動的な確保に挑戦
int *BunShi;//分子
int *BunBo;//分母

y = n;
m = (n-r);//←nCr = nC(n-r)

//(n-r)がr未満のときとr以上のときとそれ以外、
if( m<r ){
x = i = r;
}
else if( m>=r ){
x = i = m = (n-r);//←nCr = nC(n-r)
}

BunShi = calloc(n, sizeof(int));
BunBo = calloc(n, sizeof(int));

if( n>=r ){

for(; x>=1; --x){
BunBo[x] = x;

for(; y>=i; --y){
BunShi[y] = y;
nr = GCD( BunShi[y], BunBo[x] );
printf("in a nr=%d ,BunShi[%d]=%d :BunBo[%d]=%d\n", nr, y, BunShi[y], x, BunBo[x]);//エラーチェック
BunShi[y] /= nr;
BunBo[x] /= nr;
printf("in b nr=%d ,BunShi[%d]=%d :BunBo[%d]=%d\n\n", nr, y, BunShi[y], x, BunBo[x]);//エラーチェック
//if(BunBo[x] == 1){break;}
//if(BunBo[x] == 0){break;}
}
printf("out c nr=%d ,BunShi[%d]=%d :BunBo[%d]=%d ", nr, y, BunShi[y], x, BunBo[x]);//エラーチェック

}

nr = 1;
for(; n>=i; --n){
nr *= BunShi[n];
printf("A nr=%d ,BunShi[%d]=%d ", nr, n, BunShi[n]);//エラーチェック
//if(BunShi[n] == 1){break;}
}


} else {
puts("n>=rの整数で入力してください");
return 0;
}

free(BunShi);
free(BunBo);

return (nr);
}

int main()
{
int i, j, n, r;

puts("異なるn個からr個の整数の組み合わせの数を求めます.");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("\n組み合わせの数は%dです.\n", combination( i, j) );

///*
//初級者さんの組み合わせ総表示
for (n = 0; n <= 10; n++) {
for (r = 0; r <= n; r++) {
printf("%2dC%d=%3d ", n, r, combination(n, r));
}
putchar('\n');
}
//*/

return 0;

}




>初級者さん

ありがとうございます。
参考にさせてもらってます。


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

Name: toyo  ..上級者(19,869ポイント)   Date: 2008/10/23(木) 08:33   No:22892     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
gcc 3では標準ヘッダはインクルードしなくてもいいようです。
gcc 4だと警告が出ます。


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

Name: 初級者  ..ぴよぴよ(306ポイント)   Date: 2008/10/23(木) 12:27   No:22907     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
どうしてわざわざ難しい方法を使いますかね〜。

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

Name: こめかみ  ..プログラマー(28,833ポイント)   Date: 2008/10/24(金) 02:53   No:22973 解決!     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
やっと出来ましたー。
疲れた。。。もうダメかと思った。


>toyoさん
>gcc 3では標準ヘッダはインクルードしなくてもいいようです。
>gcc 4だと警告が出ます。

そんなコンパイラもあるのですか、もうナニを信じたらいいのやら。
自分のヴァージョンがいくつか確認しようとしたのですが、どこに書いてあるのかわかりませんでした。
去年のインストール版はもう古いのですか。


>初級者さん
>どうしてわざわざ難しい方法を使いますかね〜。

遊びですからw
プログラムに限らず、その時の自分のレベルよりちょっと上ぐらいの困難が一番面白いと思いませんか?
や、つきあっていただきありがとうございました。


うん、よくわかりませんがこれツールになりませんかね。
再帰を使わず組み合わせを解くサンプルプログラム?
学生の私には用途が全然思いつきませんが。

ソースを一応貼っておきます。
見たい人欲しい人改造したい人はどうぞ。(いるのだろうか?)

動作の保障はしませんが、35までは大丈夫でした(多分)
入力する数値のデータ型をもっと大きいものに変えれば役に立つかも?


以下ソース(添付もしときます)


#include <stdio.h>

#include <stdlib.h>

// 最大公約数(たいちうさんのを流用)
int GCD(int u, int v)
{
int t;
while (u > 0) {
if (u < v) {
t = u;
u = v;
v = t;
}
u -= v;
}
return v;
}

int combination(int n, int r)//仮引数はint型でないといけない
{
int i, j, k, m, x, y, nr;//ループ用変数,nCr = nC(n-r)用変数、その他

//動的な確保に挑戦
int *BunShi;//分子
int *BunBo;//分母

k = y = n;
m = (n/2);//←nCr = nC(n-r)

//(n-r)がr未満のときとr以上のときとそれ以外、
if( m>=r ){
j = x = m = r;
}
else if( m<r ){
j = x = m = (n-r);//←nCr = nC(n-r)
//printf("x=%d m=%d\n",x,i,m);//エラーチェック
}

BunShi = calloc(m, sizeof(int));
BunBo = calloc(m, sizeof(int));



if( n==0 || r==0 || n==r ){
return (1);

}else if( n>=r ){
//初期化(って言うのかな?)
for(i=0; i<m; ++i){
//printf("\n in A i=%d, j=%d, k=%d, BunBo[j]=%d, BunShi[k]=%d \n",i,j,k,BunBo[i],BunShi[i]);
BunBo[i] = j--;//
BunShi[i] = k--;//
//printf(" in B i=%d, j=%d, k=%d, BunBo[j]=%d, BunShi[k]=%d \n",i,j,k,BunBo[i],BunShi[i]);
}

for(x=0; x<m; ++x){
for(y=0; y<m; ++y){
nr = GCD( BunShi[y], BunBo[x] );
//printf("\nin a nr=%d ,BunShi[%d]=%d :BunBo[%d]=%d\n", nr, y, BunShi[y], x, BunBo[x]);//エラーチェック
BunShi[y] /= nr;
BunBo[x] /= nr;
//printf("in b nr=%d ,BunShi[%d]=%d :BunBo[%d]=%d\n\n", nr, y, BunShi[y], x, BunBo[x]);//エラーチェック

}
}

nr = 1;
for(i=0; i<m; ++i){
nr *= BunShi[i];
//printf("\nA nr=%d ,BunShi[%d]=%d ", nr, n, BunShi[i]);//エラーチェック
}


} else {
puts("n>=rの整数で入力してください");
return 0;
}

free(BunShi);
free(BunBo);

return (nr);
}

int main()
{
int i, j, n, r;

puts("異なるn個からr個の整数の組み合わせの数を求めます.(35以下でお願いします.)");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("その組み合わせの数は%dです.\n", combination( i, j) );

//*
//初級者さんの組み合わせ総表示
for (n = 0; n <= i; n++) {
for (r = 0; r <= n; r++) {
printf("%3dC%-3d=%1.d ", n, r, combination(n, r));
}
putchar('\n');
}
//*/

return 0;

}



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

Name: 初級者  ..ぴよぴよ(355ポイント)   Date: 2008/10/24(金) 06:36   No:22982     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
シンプルで読みやすいコードを如何にして書くか、というのが、
遊びのテーマとしても、よりチャレンジしがいがあると思う。


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

Name: こめかみ  ..プログラマー(29,321ポイント)   Date: 2008/10/24(金) 13:28   No:22989     
Title: reduce_process_in_combination.exe    
reduce_process_in_combination.exe(予定)


組み合わせの約分の過程を、
全て表示させるまでに改良(?)しました。

教育用(小、中学生向けの)と言い張って、
ここの管理人さんのサンプルプログラミングの館で
配布してみようと思うのですが。


アイディアを下さった
mattさん

約分の方法を提示していただいた
たいちうさん、
初級者さん

よろしいでしょうか。

ご要望があれば合作ということにもしちゃいますが.


賛成にしても反対にしても一言いただければ嬉しいですが、
今日中にご意見が無ければ、
配布の方向で検討させていただきます。

よろしくお願いします。


>初級者さん

>シンプルで読みやすいコードを如何にして書くか、というのが、
>遊びのテーマとしても、よりチャレンジしがいがあると思う。

なるほど、そーいう遊びもアリですね。


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

Name: こめかみ  ..プログラマー(29,337ポイント)   Date: 2008/10/24(金) 13:34   No:22990     
Title: Re:reduce_process_in_combination.exe    
約分されてない過程まで表示されてしまっている。。。

まだ改良の余地があるようですね;


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(63,404ポイント)   Date: 2008/10/24(金) 15:22   No:22999     
Title: Re:reduce_process_in_combination.exe    
今までとは別の方法論で組んでみました。
先に素数列を与えているところがポイントです。


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


#pragma warning(disable : 4996)

enum Bunssu
{
bunsi =1,bunbo=-1
};

const int sosuu[] ={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};

void debug(int table[sizeof(sosuu)/sizeof(int)])
{
int i;
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
printf("%d: %d\n",sosuu[i],table[i]);
}

}

void primeFactor(int table[sizeof(sosuu)/sizeof(int)],int num, Bunssu flag)
{
int i;
if(num==0)
{
printf("error!\n");
exit(1);
}
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
while(num%sosuu[i]==0)
{
table[i] += flag;
num = num/sosuu[i];
}
}
}

unsigned int calc(int table[sizeof(sosuu)/sizeof(int)])
{
unsigned int result=1;
int i;
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
if(table[i]>0)
{
result *= table[i]*sosuu[i]*bunsi;
}

//必要ないが念のため。
if(table[i]<0)
{
printf("error??\n");
result /= table[i]*sosuu[i]*bunbo;
}
}
return result;

}
unsigned int combination(int n, int r)
{
int i,j;
int result[sizeof(sosuu)/sizeof(int)];
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
result[i] =0;
}

for(i=0,j=r;i<r;i++,n--,j--)
{
primeFactor(result,n,bunsi);
primeFactor(result,j,bunbo);
}
return calc(result);

}

int main()
{

int i, j;

puts("異なるn個からr個の整数の組み合わせの数を求めます.(21以下でお願いします.)");
printf("n:"); scanf("%d", &i);
printf("r:"); scanf("%d", &j);
printf("その組み合わせの数は%dです.\n", combination( i, j) );

return 0;

}


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

Name: こめかみ  ..プログラマー(29,598ポイント)   Date: 2008/10/24(金) 21:45   No:23017     
Title: 【学習ソフト】組み合わせの約分過程表示プログラム(仮)    
↓ほぼ完成版がダウンロードできます。
ttp://cid-d72819af3901253a.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/%e7%b5%84%e3%81%bf%e5%90%88%e3%82%8f%e3%81%9b%e3%81%ae%e7%b4%84%e5%88%86%e9%81%8e%e7%a8%8b%e8%a1%a8%e7%a4%ba%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0|5%e4%bb%ae|6.zip



> く...組木紙織さん...?(読めない)

今疲れ果てててそんな長いの読めないですが、
頭がハッキリしてても読めるかどうか...

面倒じゃなければ是非概念図とかプリーズ (なげやり) (失礼しました)

もうこのスレッドにあるサンプル全部掲載してもらえばいいんじゃないですかね(適当)


後は、exeファイルをダブルクリックで起動できるようにしたり、
アイコンなんかつけられれば面白いのですが。
可能なのでしょうかね。
何を調べればいいのか、ちょっとわかんないですね。



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

Name: こめかみ  ..プログラマー(29,635ポイント)   Date: 2008/10/24(金) 23:41   No:23022     
Title: Re:【学習ソフト】組み合わせの約分過程表示プログラム(仮)    
画像の順列ぶんの順列が既に間違っていました

教育用とか嘯いといて定義で間違うなんてort
明日修正します・・・


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(63,626ポイント)   Date: 2008/10/25(土) 00:39   No:23026     
Title: Re:【学習ソフト】組み合わせの約分過程表示プログラム(仮)    
私の名前は、組木紙織(くみきかみおり)です。
音がわからないといわれますが、普通にそのままの文字のとおりの音となっています。

とりあえず、私のは掲載やめてください。
本気で作ってないので、恥ずかしいです。

>面倒じゃなければ是非概念図とかプリーズ (なげやり) (失礼しました)
概念図とかはありませんが、計算の流れ方を。

1:分子を素因数分解する。
2:分母を素因数分解しながら、約分をする。
3:素因数分解されて出てきた結果を出力する。

という流れになっています。

本当は素因数分解するときの元となる素数列を事前に少数与えておき、
それより先は遅延評価で計算を進めていきたかったのですが、
そこまですると複雑になりすぎると思ったので、事前に全て与えています。





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

Name: たいちう  ..中級者(12,534ポイント)   Date: 2008/10/25(土) 13:32   No:23050     
Title: Re:【学習ソフト】組み合わせの約分過程表示プログラム(仮)    
> 賛成にしても反対にしても一言いただければ嬉しいですが、

ということですので。少し。

私がここに書いたものは自由に使っていただいて結構です。
サンプルとして載せる価値があるかどうかは疑問ですが。

(自称)上級者の私にとっては、
「必要ないのにわざわざ約分して作る」というテーマも面白く、
ちょいちょいと作ってみましたが、教育用に相応しいとは思えません。
No:22795の初級者さんのサンプルを紹介する方がよっぽど有意義でしょう。

# あの順番で計算することで、「割り切れずに余りが切り捨てられることがおきず、
# 正しく計算できる」、ということは、あまり自明とは思えませんので、
# そのあたりの解説も加えたら完璧かと。

いずれにしても、誰かが書いて管理人さんも載せる価値があると判断するならば、
何も言うことはありません。多分価値があることなのでしょう。
頑張ってください。


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

Name: 初級者  ..ぴよぴよ(447ポイント)   Date: 2008/10/25(土) 15:37   No:23053     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
分子はnから始まって降順にr個分を掛け、
分母は1から始まって昇順にr個分を掛けるのね。

ここで、「連続する任意のn個の自然数には、必ずnの倍数を含む」という
性質を使うの。証明は省くわ。

この性質を使うと、あの順番で計算することにより、
組合せの数が正しく求まるの。


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

Name: こめかみ  ..プログラマー(29,969ポイント)   Date: 2008/10/26(日) 05:39   No:23074     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
返信遅くなり申し訳ないです。



>>組木紙織さん
この掲示板に来てからのひそかな疑問が一つとけました。
見てるとこの掲示板の方々の名前も
プログラム関係に因んだ名前の方が多いように見受けられるので
学習しながら、

あの人のハンドルネームはこれか?
って感じでいつか気付くのを期待してたですが、
ん、
でも意味が解からないから結局関係無いですね。
由来とか興味はありますが、
何か有名なアルゴリズムの和訳か何かかと想像してます。
あるいは建築や製紙にプログラムを喩えて見ているとか。

組木でググッたら面白いものが見れました
日本の伝統工芸すごいですね、なんていうか、ラミエリーです。


糸偏が、なんというか、リーチがかかってて、もったいないっていうか、
ムズムズします。

組綵紙織さんとかだったらビンゴ!フィーバー!ばっよえ〜ん!
ってな感じで気持ちいいのに。

無茶苦茶勝手な感想失礼しました。
本当に気分を害されたらごめんなさい。
そう思うのなら言わなきゃいいのですが、つい。。。


>>1:分子を素因数分解する。
>>2:分母を素因数分解しながら、約分をする。
>>3:素因数分解されて出てきた結果を出力する。 >>
>>
>>という流れになっています。

頑張って読み解こうとしてみましたが、
プログラム自体を把握することはついぞ出来ませんでした。
そこで流れの解説から想像するに、
とにかく出現する数字を素因数分解して、
同じ素数同士を纏めて計算したりしてるのかとか考えましたが(具体的なイメージは出来てません)。

そのアルゴリズムは、
初級者さんの簡潔なプログラムや
私のプログラムと比べてどのような個性を持っているのでしょうか。


例えば初級者さんのプログラムは約分を用いて組み合わせの計算が出す

"結果"

に必要最小限の記述で到達し出力するという、
プログラムを学習するものにとってのこの上ない

"鑑"

としての価値を見出すとします。

例えば、
私の作った分子分母の変数を全て確保しそれぞれを計算し出力するという、
単純に結果だけを追求するなら、
初級者さんのものと比べてこの上なく贅肉の多いプログラムも、

確保した変数に計算の過程が全て格納されている

ことに着目して、

約分の

"過程"

を全て出力するようにすれば、
たいちうさんや初級者さんのプログラムには無い個性ではないかと考え、
現在ビルドアップ中です、(何の役に立つかはまた別の話として、)

何の役に立つかは、まあ、無理矢理に価値を見出すなら、
数学で組み合わせを初めて習う中学生の補助教材みたいなものにでもなればいいかな、とか、
あるいは再帰を使わないとこんな長ったらしいプログラムの記述になるという

"悪い見本"

として世に放てば、
プログラムを習いたての人がこのソースコードを見た時、

「再帰かっこいい」

ってな感じで再帰の素晴らしさを認識する一つのきっかけぐらいには
なるんじゃないかとか考えてみました。


組木さんのコードはこのような個性を見出すとしたら
どのような価値を見出せるプログラムでしょうか。

本来なら自分で理解して自分一人で考える問題なのでしょうが、
いかんせん今の私には理解に時間がかかるので、考えるのを諦めたいところ、
なのですが、

なんとなく後ろ髪を引かれます。

その価値が興味深ければもう一度理解に取り組んでみたいと思うかもしれませんし、
今理解できなくても日を置いて理解しようとすると思います。

もしご面倒でなければ、考えて教えていただけないでしょうか、
我ながらめんどくさ過ぎる要望だと思うので、本当に気分が乗ったらでいいです。
ありがとうございました。




>>たいちうさん

価値についての話も踏まえて上の組木さんへの文章を書いてみました。
教育というのはハッタリが過ぎると後になって思い直しましたが、
教材くらいになれば嬉しいな、程度の考えでした、

相応しくないのなら、
"組み合わせの約分を全部表示させて遊ぶプログラム"と、
そのまんまな感じで管理人さんに提案してみようと思います。(掲載されてみたいのです)

あと、学習ってのはC言語についてのことではなく、
数TAの一分野の本当に限定的な場面での使用を想定していました。
それでも無理がありますが。





>>初級者さん

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

よくわかりました。
コメントの無い上のコードだけではイマイチ意味を把握しきれてなかったのと(その説明で完璧にわかりました)、
matsさんの助言で既に完成形がイメージできてしまっていたこともあって、
無駄の少ない上のコードよりも、
自分なりに考えたプログラムの実装を優先させてしまいました。
つまり私の中ではあの回答こそが"簡単なコード"だったのです.
嘘をついてしまっていたようでごめんなさい。

でも自分で設定したハ−ドルを超えるのが楽しいのは本当です。
そういう意味で、
初級者さんのシンプルで読みやすいコードを如何にして書くか、というのも、
遡れば私と同じテーマなのではないでしょうか。

人が考えたコードを理解するだけじゃつまらなかったという理由もありました。
決して初級者さんのコードを否定する意図はありませんでしたが、
一抹でもそのように感じられている可能性がある様な気がしたのでお詫びさせていただきます。



>>自分にレス
>今日中にご意見が無ければ、
>配布の方向で検討させていただきます。

その日以内ってのは早すぎましたね。
自分の予定も予想外に一日食ってしまいましたし。

後一週間ぐらいは、遊び心を忍ばす余地が無いか考えて見たいので、
その間に、ご意見とかあったらどうぞ。



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

Name: たいちう  ..中級者(12,721ポイント)   Date: 2008/10/26(日) 13:06   No:23085     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> ってな感じで再帰の素晴らしさを認識する一つのきっかけぐらいには
> なるんじゃないかとか考えてみました。

combinationのプログラムを再帰で書くのも悪い例だと思いますよ。
階乗やフィボナッチ数と同じで、数学的な定義が再帰的だからといって、
プログラムを再帰で実装してはいけないという例。
理由は非常に効率が悪いから。

今時の環境ならば(4バイトの)int型で収まる範囲程度に限れば、
効率の低下が無視できる場合を多く、
数学的定義のまま実装することを利点と言うこともできるかもしれないけど。

身近な再帰の好例としては、フォルダの探索とかでしょうか。


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

Name: こめかみ  ..プログラマー(30,455ポイント)   Date: 2008/10/26(日) 21:50   No:23107     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
勉強になります。
ではこの問題はホントにただの再帰の練習問題なのですね。

再帰的な処理というのは効率の為に避けて通るべき場面が多々ある、と。
そのフォルダの探索というのは再帰以外では実装できない、
または再帰によって効率がベストになるということでしょうか。
一応、調べてみたのですが今の自分程度の見識では
見つけることが出来ませんでした。

もしかして上の初級者さんのコードが、
はからずも今回の課題の正答よりも効率が良いのではないかと思っているのですが。

処理速度の比べ方をどうやるのわからないので調べてませんが、
どうなのですかね?


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(64,750ポイント)   Date: 2008/10/26(日) 23:42   No:23114     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
私のハンドルネームについてのコメントは控えさせてもらいます。


>そのアルゴリズムは、
>初級者さんの簡潔なプログラムや
>私のプログラムと比べてどのような個性を持っているのでしょうか。


特にたいしたことはしていませんが、しいて言うなら
素数列を先に与えることによって、コンパイル時に計算可能な部分は先に計算をして、
実行時の計算量を減らすことが出来ることでしょうか。

#初級者さんのコードに太刀打ち出来るほどの速度は出ないと思いますが

それとは別に、
テクニックとして配列数を直接数字で与えてないところも見てほしいと思います。




たいちうさんへ

フィボナッチ数を再帰で実装しないほうがよいという意見には一部疑問があります。
フィボナッチ数は初期値を整数にすると全て整数の数列なので、整数型で結果がほしい場合があると思いますが、
数列の一般項を計算すると一般的には無理数(や虚数)を含んだ形になります。

一般項を色々いじくった結果、計算式から無理数(と虚数)を排除することが出来ましたが、
条件分岐を含む醜い計算式となり、全て整数型で計算可能なように式を変形すると計算途中で値が大きくなり
項数が多くなるとすぐにオーバーフローしそうな感じでした。

計算式の展開の複雑さ、計算量、計算時の有効桁数、を考えると
(それぞれに対して検証したわけではありませんが)
再帰の実装と再帰無しを比較すると必ずしも、再帰無しで実装したほうが有効だとは思えないです。


今回は一番よく知られている
a_1 = a_2 = 1
a_(n+2) = a_(n+1) + a_(n)

数列に関して一般項を展開して考えました。

必要があれば展開した式と無理数を排除した式を上げます。



>処理速度の比べ方をどうやるのわからないので調べてませんが、
理論的に計算する方法もありますが、実際にループで何回も連続で実行してみてその時間を比較すれば
わかります。


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

Name: たいちう  ..中級者(12,819ポイント)   Date: 2008/10/27(月) 09:56   No:23130     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> そのフォルダの探索というのは再帰以外では実装できない、
> または再帰によって効率がベストになるということでしょうか。

フォルダの構造が再帰的なものなので、再帰的なアルゴリズムと相性が良いですが、
他の方法で実装できますし、その中には効率的に遜色ないものもあると思います。
しかし再帰のプログラムが最もシンプルになるでしょう。


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

Name: たいちう  ..中級者(13,044ポイント)   Date: 2008/10/27(月) 10:26   No:23131     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
組木紙織さん

フィボナッチ数を計算するプログラムの実装方法ですが、
再帰と同様に一般項も使うべきではないと思います。
("http://ja.wikipedia.org/wiki/フィボナッチ数列"にある、ルート5を含んだ式ですよね?)

使うべきも何も、学習と遊び以外の目的でフィボナッチ数列を必要とすることは
ほとんどないと思いますが、下記の例か、そのバリエーションが正解ではないでしょうか。

int Fibonacci(int n)

{
int a = 0, b = 1, c;
while (n--) {
c = a + b;
a = b;
b = c;
}
return a;
}


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(64,574ポイント)   Date: 2008/10/27(月) 20:33   No:23147     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>フィボナッチ数を計算するプログラムの実装方法ですが、
>再帰と同様に一般項も使うべきではないと思います。
>("http://ja.wikipedia.org/wiki/フィボナッチ数列"にある、ルート5を含んだ式ですよね?)

一般項の式はそれです。
(せっかくせっせと一般項を自分で求めたのに。。。)

私も最終的にはたいちうさんと同じところに行き着きました。
(寝て起きたら思いついたという落ちです。)


この数列を実際に利用する場面なんて思いつきませんが
フィボナッチ数列を一般項で出す利点を強いてあげると
定義に従って計算するとO(N)なのでO(1)ということぐらいですかね。


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

Name: こめかみ  ..プログラマー(31,742ポイント)   Date: 2008/10/29(水) 00:58   No:23181     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
遅くなりました。

>たいちうさん
>再帰のプログラムが最もシンプルになるでしょう。

ありがとうございました。
いつかフォルダの探索のプログラムを書く機会があったら、その言葉を思い出して実装に挑戦してみます。


>組木さん
>
>素数列を先に与えることによって、コンパイル時に計算可能な部分は先に計算をして、
>実行時の計算量を減らすことが出来ることでしょうか。
>
>#初級者さんのコードに太刀打ち出来るほどの速度は出ないと思いますが
>
>それとは別に、
>テクニックとして配列数を直接数字で与えてないところも見てほしいと思います。

やはり何をやっているのかわかりませんでしたが、
(というより解読する時間が取れないって言うか・・・言い訳ですね)
日を置いて解読してみようと思います。


>理論的に計算する方法もありますが、実際にループで何回も連続で実行してみてその時間を比較すれば
>わかります。

近くのスレッドで管理人さんが時間を計測するサンプルを作ってらしたので、
こっそり参考にしてやってみました。
タイムヘッダって時刻を取得するだけじゃないんですね、これは面白い。

条件をこんな感じに同じにして、
#include <stdio.h>

#include <time.h>

int combination(int n, int r)//※仮引数はint型でないといけない
{
if(r==0||r==n)
return (1);
else if(r == 1);
return(n);
return (combination(n - 1, r - 1) + combination(n - 1, r));
}

int sub(void)
{
int n, r;

for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
printf("%dC%d=%3d ", n, r, combination(n, r));
}
putchar('\n');
}
return 0;
}
int main()
{
int i;
double c;
clock_t t;
t = clock();//時間を格納
for(i=0;i<10000;i++){
c = sub();
}
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);
return 0;
}


結果
,        "VC++",            "Cygwin",
,        "c",        "cpp",     "c",       "cpp"
"正答(再帰)", "105.890(秒",   105.797,    13.516,     15.421
"初級者さん",  "105.641", 106.031, 14.375, 14.031
"組木さん", "コンパイル失敗", 124.406, "コンパイル失敗", 30.922
"私", "118.390", "コンパイル失敗",20.156, "コンパイル失敗"


初級者さんのほうが早いかと思ってたけど、意外とどっこいどっこいですね。

意外といえば組木さんのが私のより遅いなんて...
比較回数が足りないのかな。



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

Name: たいちう  ..中級者(13,393ポイント)   Date: 2008/10/29(水) 13:30   No:23205     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> 比較回数が足りないのかな。

むしろ比較の方法に問題がありそうです。
殆どの時間が計算結果の表示に費やされているのではないでしょうか。
気付いた点。

・VC++のバージョンを書きましょう。
・VC++はりリースモードでコンパイルした方が実行時間の比較には良いでしょう(※)。
また、VCからでなく、exeファイルから実行しましょう。
・複数回実行しましょう。特に2回目以降は速くなることがあるかもしれません。
・printf等の画面表示の関数は、かなり時間がかかります。
アルゴリズムの比較のためには、アルゴリズムと関係ない部分は
少ない方が良いので、sub()のprintf()とputchar()はなくしてしまいましょう。
・測定の手間を省くためと、測定方法が正しいことがみんなに分かるように、
1つの実行ファイルで、全てのアルゴリズムを順に試して結果をまとめて
表示するように作り変えてはいかがでしょうか。
腑に落ちない結果については他の環境で追試したり、比較方法に問題があれば
より適切な指摘も受けられると思います。

※リリースモードで画面表示を行わない場合、「どうせ計算したって誰も見やしないんだ」と、
コンパイラがズルをするかもしれません。
ズルをさせないために、sub()の中でcombination()の合計を計算し、
main()で表示するとかの工夫が必要かも。


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

Name: たいちう  ..中級者(14,262ポイント)   Date: 2008/10/29(水) 17:58   No:23230     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
作り変えろとか言ってないで、自分でやればいいよね。
VC++2005 リリースモード C++でコンパイルして実行した結果。
(再帰の方に余分なセミコロンがありました。ご確認を)

再帰:0.040秒
再帰なし:0.000秒


#include <stdio.h>
#include <time.h>

int combination(int n, int r)//※仮引数はint型でないといけない
{
if(r==0||r==n)
return (1);

else if(r == 1)
return(n);

return (combination(n - 1, r - 1) + combination(n - 1, r));
}

int combination2(int n, int r)
{
int combi, i;
for (combi = i = 1; i <= r; i++, n--) {
combi *= n, combi /= i;
}
return combi;
}

int sub(void)
{
int n, r, sum = 0;

for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
sum += combination(n, r);
}
}
return sum;
}

int sub2(void)
{
int n, r, sum = 0;
for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
sum += combination2(n, r);
}
}
return sum;
}

int main()
{
int i, sum;
clock_t t;

//---------------
// 再帰

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub();
}
printf("%d\n", sum);
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

//---------------
// 初心者さんの

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub();
}
printf("%d\n", sum);
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

// quit
printf("end.\n");
getchar();
return 0;
}


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

Name: こめかみ  ..プログラマー(31,967ポイント)   Date: 2008/10/30(木) 04:02   No:23247     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>作り変えろとか言ってないで、自分でやればいいよね。

そんなことないです、むしろ答えよりやり方を教えてくださるほうが少なくとも私は好きです。
その答えが嫌だとか言うわけじゃないですが。
でも私と組木さんのぶんが無い様なので、まだ試す余地があるようですね。

土曜までスケジュールに追われて時間取れませんが、日曜に必ず時間作って挑戦します。


あ、セミコロンホントだ、直しときます。

あと、初心者さんではなく初級者さんですよ、私も見間違えてましたが。


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

Name: こめかみ  ..プログラマー(33,628ポイント)   Date: 2008/11/02(日) 00:22   No:23335     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
遅くなりました。

たいちうさんの比較コードが既にベストなのに、
私が新たに考える余地などあるはずも無いのでした。

リリースモードの計算速度に感動しました。
この前ひたすら計算待ちしてた私はなんだったんだw

VC++2008Express リリースモード Cでコンパイルして実行した結果。

1895815408
0.015秒 //再帰

1895815408
0.000秒 //初級者さんの再帰無し 速いっ! 速度比較の結果0秒ってどうなんだろw 
ホントは計測できるまでループ回数増やさなきゃいけないのかな。

1895815408
3.735秒 //私の 遅い... こんなもんですか。

end.

お次は
VC++2008Express リリースモード C++でコンパイルして実行した結果。

1895815408
0.015秒

1895815408
0.000秒
この上の二つはcソースの結果と同じなので省略

問題は組木さんのコード
-3204592 //この計算結果はいったいなんだろう...
15.344秒 //やっぱり遅いです。何回か実行させて試しましたが、同じような結果でした。
end.


むーん。。。?
私のよりは速いかと思っていたのですが。
組木さんのアルゴリズムは方法の一つとして学ばせていただくしかないのでしょうか、
うん、きっと理解すれば他に応用の効く場面があるに違いない。


ちなみにソースはたいちうさんのに追加する形でこんな感じです。


#include <stdio.h>

#include <stdlib.h>
#include <time.h>

int combination(int n, int r)//※仮引数はint型でないといけない
{
if(r==0||r==n)
return (1);

else if(r == 1)
return(n);

return (combination(n - 1, r - 1) + combination(n - 1, r));
}

int combination2(int n, int r)
{
int combi, i;
for (combi = i = 1; i <= r; i++, n--) {
combi *= n, combi /= i;
}
return combi;
}
#pragma warning(disable : 4996)

enum Bunssu
{
bunsi =1,bunbo=-1
};
const int sosuu[] ={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};

void debug(int table[sizeof(sosuu)/sizeof(int)])
{
int i;
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
printf("%d: %d\n",sosuu[i],table[i]);
}

}

void primeFactor(int table[sizeof(sosuu)/sizeof(int)],int num, Bunssu flag)
{
int i;
if(num==0)
{
printf("error!\n");
exit(1);
}
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
while(num%sosuu[i]==0)
{
table[i] += flag;
num = num/sosuu[i];
}
}
}

unsigned int calc(int table[sizeof(sosuu)/sizeof(int)])
{
unsigned int result=1;
int i;
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
if(table[i]>0)
{
result *= table[i]*sosuu[i]*bunsi;
}

//必要ないが念のため。
if(table[i]<0)
{
printf("error??\n");
result /= table[i]*sosuu[i]*bunbo;
}
}
return result;

}
unsigned int combination3(int n, int r)
{
int i,j;
int result[sizeof(sosuu)/sizeof(int)];
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
result[i] =0;
}

for(i=0,j=r;i<r;i++,n--,j--)
{
primeFactor(result,n,bunsi);
primeFactor(result,j,bunbo);
}
return calc(result);

}
int sub(void)
{
int n, r, sum = 0;

for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
sum += combination(n, r);
}
}
return sum;
}

int sub2(void)
{
int n, r, sum = 0;
for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
sum += combination2(n, r);
}
}
return sum;
}


int sub3(void)
{
int n, r, sum = 0;

for (n = 0; n <= 19; n++) {
for (r = 0; r <= n; r++) {
sum += combination3(n, r);
}
}
return sum;
}


int main()
{
int i, sum;
clock_t t;

//---------------
// 再帰

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub();
}
printf("%d\n", sum);
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

//---------------
// 初心者さんの

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub2();
}
printf("%d\n", sum);
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

//---------------
// 組木さんまたは私

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub3();
}
printf("%d\n", sum);
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

// quit
printf("end.\n");
getchar();
return 0;
}




計算結果がおかしいということはどこかがおかしいのですよね。
コピペミスかna...ちょっと腑に落ちないけどもう諦めようかなぁ。
明日ちょっとがんばって無理だったら諦めます。

このスレッドでの投稿はこれで最後かもしれないですね。
長いことお付き合いいただきありがとうございました。


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

Name: box  ..ハッカー(128,733ポイント)   Date: 2008/11/02(日) 08:37   No:23336     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> 計算結果がおかしいということはどこかがおかしいのですよね。

どの方法を採っても、いつかはint型やlong型で扱える範囲を超えます。
そういう桁あふれが起きると、あふれた分はなかったものとして
計算し続けたり結果を出力したりします。
したがって、おかしな値を出力することとなります。

分子の掛け算を先に行なう方法だと、桁あふれが早く起きます。
掛け算・割り算を交互に行なう方法(初級者さんのような)だと、
桁あふれが起きるのが少しは遅くなります。
それだけのことです。


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(64,870ポイント)   Date: 2008/11/02(日) 16:00   No:23347     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
こめかみさんが遅いというので無駄な計算を省いて速度を上げてみました。
ついでにCでもコンパイル可能にして、さらにそれぞれの計算にコメントをいれて
流れがわかるようにしてみました。

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

/*VCの警告の無視*/
#pragma warning(disable : 4996)

#define bunsi 1
#define bunbo -1

/***************************************************
<計算方法>
4C2を例にする
4C2=(4*3)/(2*1)
=(2^2*3^1)/(2^1)
=(2^1*3^1)/1
=6
***************************************************/

/*19までの素数列。次の素数は23*/
const int sosuu[] ={2, 3, 5, 7, 11, 13, 17, 19};

/*
素因数分解と約分をする
flag =1の場合は素因数分解
flag =-1の場合は約分
*/
void primeFactor(int table[sizeof(sosuu)/sizeof(int)],int num, int flag)
{
int i;
/*nCrのnが0以下のとき*/
if(num<=0)
{
printf("error!\n");
exit(1);
}
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
/*数値にそれ以上大きい素因数を含まないとき*/
if(num<sosuu[i])
{
break;
}
/*数値にsosuu[i]が因数として含まれるとき*/
while(num%sosuu[i]==0)
{
table[i] += flag;
num /= sosuu[i];
}
}
}

/*
素因数分解した結果を数値に戻す。
*/
unsigned int calc(int table[sizeof(sosuu)/sizeof(int)])
{
unsigned int result=1;
int i;

for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
/*素因数分解配列に値が存在しているときのみ計算をする。*/
if(table[i]>0)
{
result *= table[i]*sosuu[i];
}else if(table[i]<0) //必要ないが念のため
{
printf("error??\n");
result /= table[i]*sosuu[i];
}
}
return result;

}
unsigned int combination(int n, int r)
{
int i,j;
int result[sizeof(sosuu)/sizeof(int)];
/*素因数分解配列の初期化*/
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
result[i] =0;
}


/*nCr = nC(n-r)を用いて計算量を減らす*/
if(n-r<r)
{
r=n-r;
}

/*素因数配列の計算*/
for(i=0,j=r;i<r;i++,n--,j--)
{
/*分子の大きいほうから順番に素因数分解をする*/
primeFactor(result,n,bunsi);
/*分母の小さいほうから順番に約分をする*/
primeFactor(result,j,bunbo);
}

/*素因数配列を数値として出力する*/
return calc(result);

}


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

Name: こめかみ  ..プログラマー(33,833ポイント)   Date: 2008/11/02(日) 20:41   No:23351     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>>boxさん
>分子の掛け算を先に行なう方法だと、桁あふれが早く起きます。

21以下ということだったのでこれでいいかと思ったのですが。
そういうことではないかな?
何か根本的に勘違いしているかもです(私が)

>>組木さん

ひぎぃ(悲鳴)
なんか挑発してしまったみたいで申し訳無いです。


ありがたく拝見させていただきます。

おぉコメントまで入れて頂き、もうわかんないとかいってられませんね。超頑張ります。


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

Name: こめかみ  ..プログラマー(33,889ポイント)   Date: 2008/11/02(日) 21:02   No:23352     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
早速計ったら
2秒台でした。
流石です。


上のboxさんへの文章が後から見返したら噛み合って無かったです。
自分は何を言いたかったのか、
いやそもそもboxさんの発言をイマイチ把握しきれてないようです。
もうちょっと落ちついて発言します...すみません。




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

Name: たいちう  ..中級者(14,513ポイント)   Date: 2008/11/02(日) 23:50   No:23354     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
combination3がどこまで計算できるのか調べるために、
main関数を変えてみる。
int main()

{
int n, r, c1, c2, c3;
for (n = 0; n <= 19; n++) {
printf("n = %d\n", n);
printf(" comb1 comb2 comb3\n");
for (r = 0; r <= n; r++) {
c1 = combination(n, r);
c2 = combination2(n, r);
c3 = combination3(n, r);
printf(" r = %2d : %10d %10d %10d", r, c1, c2, c3);
if (c1 != c2 || c2 != c3)
printf(" !!!!\n");
else
printf("\n");
}
printf("\n");
}

// quit
printf("end.\n");
getchar();
return 0;
}

combination3(8, 1)が既に違うじゃん。
8! = 40320なので、オーバーフローが原因じゃないと思うよ。
combination3をちゃんと読んでないけど。


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

Name: Justy  ..ハッカー(252,768ポイント)   Date: 2008/11/03(月) 00:22   No:23357     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

>やっぱり遅いです。何回か実行させて試しましたが、同じような結果でした

 こめかみさんの No:23335のテストコードですが、このままの状態でVC9で
最適化をかけた場合ちょっと問題があるような気がします。


 うちの環境でビルドすると sub()と sub2()のループは

00401317  call        clock  
0040131C  mov         esi,eax 
0040131E  call        sub  
00401323  imul        eax,eax,2710h 
00401329  push        eax  
0040132A  push        offset string "%d\n"
0040132F  call        printf 


 のようなコードが生成されます。
 このコードですと clock()が呼ばれた後 sub()は1回しか呼ばれていません。

 どういうことかというとコンパイラがコードを最適化した結果
sub() / sub2()を 1回だけコールして戻ってきた値を 10000倍して printfしています。

 反対に sub3()は

0040139B  call        clock  
004013A0  mov         dword ptr [esp+14h],eax 
004013A4  xor         ebp,ebp 
004013A6  mov         dword ptr [esp+10h],2710h 
004013AE  mov         edi,edi 
004013B0  xor         ebx,ebx 
004013B2  xor         edi,edi 
004013B4  xor         esi,esi 
004013B6  test        edi,edi 
004013B8  jl          main+0C1h  
004013BA  lea         ebx,[ebx] 
004013C0  push        esi  
004013C1  push        edi  
004013C2  call        combination3  
004013C7  inc         esi  
004013C8  add         esp,8 
004013CB  add         ebx,eax 
004013CD  cmp         esi,edi 
004013CF  jle         main+0B0h  
004013D1  inc         edi  
004013D2  cmp         edi,13h 
004013D5  jle         main+0A4h  
004013D7  add         ebp,ebx 
004013D9  sub         dword ptr [esp+10h],1 
004013DE  jne         main+0A0h  
004013E0  push        ebp  
004013E1  push        offset string "%d\n"  
004013E6  call        printf  


 となっており、sub3()はインライン展開されて消滅していますが、combination3()は
きちんと 10000回ループして回数分コールされています。

 このあたりを直さないと、パフォーマンス測定としては平等さに欠けるかと。
(最適化のされやすさ込みでしたらいいのですが)


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(64,993ポイント)   Date: 2008/11/03(月) 06:01   No:23358     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
たいちうさんの指摘により、プログラムにミスがあったことが発覚したので、
次のように修正して下さい。

calc()の
result *= table[i]*sosuu[i];
個々の部分を次のように置換してください。

for(j=0;j<table[i];j++){
result *= sosuu[i];
}

このままだとコンパイルエラーになるので、変数jをint型で宣言してください。

#累乗と乗算を間違えるなんてえらいミスをしていた


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

Name: こめかみ  ..プログラマー(34,331ポイント)   Date: 2008/11/03(月) 18:30   No:23376     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>>組木さん

直したら計算結果もバッチリでしたし、
速度も0.2秒台までになりました、
どんどん速くなっていく...




>>たいちうさん

比較の方法が勉強になります。
うーむ、一度見たこと無いと思いつかないですね。




>>Justyさん

うおっ機械語ですか。
add,sub,mov,jumpぐらいしかわかりませんが、
つまりまったくわかりませんが。

その機械語さえ読めれば、C言語側のどこを直せばいいのかわかるのですか?
sub1,sub2の関数がうまくループされてないということは
Justyさんの解説コミでかろうじてわかりましたが。

VCに生成された機械語を見る機能でもあるのでしょうか、
または外部ツール(デバッガーとか言う奴?)ですか。
使えるようになったほうが便利そうですが、今の私には敷居が高そうだなあ。


>(最適化のされやすさ込みでしたらいいのですが)

えーと、最適化というのはリリースモードでビルドすることですよね。

私のパフォーマンス測定は、
このスレッドではじめて実践したもの(というかほぼコピペ)なので、
複雑な意図はありません。


平等な測定を目指すには、
sub1,sub2をちゃんと10000回ループさせればいいのですか?

でも私には、どうやればsub1,sub2を直せるのか、
sub3のループは何故うまくいっているのかもよくわかりません。

良かったら直し方を教えて欲しいのですが、
機械語をろくに読めない私にはそもそも気付くことの出来ない問題っぽいですね。
理解できないかもしれないのですが、直し方を教えていただけないでしょうか。


火曜から土曜の平日はほとんど時間が取れないので、返信は遅くなってしまうかもしれません。
なんかスレッドがすごく伸びてて申し訳ないですがもうちょっとお世話になります、


私に理解できなそうな問題だとJustyさんが判断されたら、
その旨を示していただければ大人しく引き下がります。


組木さんのプログラムを修正後の比較プログラムはこの下に分けて投稿させていただきます。



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

Name: こめかみ  ..プログラマー(33,189ポイント)   Date: 2008/11/03(月) 18:30   No:23377     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
#include <stdio.h>

#include <stdlib.h>
#include <time.h>

int combination(int n, int r)//※仮引数はint型でないといけない
{
if(r==0||r==n)
return (1);

else if(r == 1)
return(n);

return (combination(n - 1, r - 1) + combination(n - 1, r));
}

int combination2(int n, int r)
{
int combi, i;
for (combi = i = 1; i <= r; i++, n--) {
combi *= n, combi /= i;
}
return combi;
}


/*VCの警告の無視*/
#pragma warning(disable : 4996)

#define bunsi 1
#define bunbo -1

/***************************************************
<計算方法>
4C2を例にする
4C2=(4*3)/(2*1)
=(2^2*3^1)/(2^1)
=(2^1*3^1)/1
=6
***************************************************/

/*19までの素数列。次の素数は23*/
const int sosuu[] ={2, 3, 5, 7, 11, 13, 17, 19};

/*
素因数分解と約分をする
flag =1の場合は素因数分解
flag =-1の場合は約分
*/
void primeFactor(int table[sizeof(sosuu)/sizeof(int)],int num, int flag)
{
int i;
/*nCrのnが0以下のとき*/
if(num<=0)
{
printf("error!\n");
exit(1);
}
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
/*数値にそれ以上大きい素因数を含まないとき*/
if(num<sosuu[i])
{
break;
}
/*数値にsosuu[i]が因数として含まれるとき*/
while(num%sosuu[i]==0)
{
table[i] += flag;
num /= sosuu[i];
}
}
}

/*
素因数分解した結果を数値に戻す。
*/
unsigned int calc(int table[sizeof(sosuu)/sizeof(int)])
{
unsigned int result=1;
int i,j;

for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
/*素因数分解配列に値が存在しているときのみ計算をする。*/
if(table[i]>0)
{
for(j=0;j<table[i];j++){
result *= sosuu[i];
}
}else if(table[i]<0) //必要ないが念のため
{
printf("error??\n");
for(j=0;j<table[i];j++){
result /= sosuu[i];
}
}
}
return result;

}
unsigned int combination3(int n, int r)
{
int i,j;
int result[sizeof(sosuu)/sizeof(int)];
/*素因数分解配列の初期化*/
for(i=0;i<sizeof(sosuu)/sizeof(int);i++)
{
result[i] =0;
}


/*nCr = nC(n-r)を用いて計算量を減らす*/
if(n-r<r)
{
r=n-r;
}

/*素因数配列の計算*/
for(i=0,j=r;i<r;i++,n--,j--)
{
/*分子の大きいほうから順番に素因数分解をする*/
primeFactor(result,n,bunsi);
/*分母の小さいほうから順番に約分をする*/
primeFactor(result,j,bunbo);
}

/*素因数配列を数値として出力する*/
return calc(result);

}
int sub(void)
{
int n, r, sum = 0;

for (n = 0; n <= 9; n++) {
for (r = 0; r <= n; r++) {
sum += combination(n, r);
}
}
return sum;
}

int sub2(void)
{
int n, r, sum = 0;
for (n = 0; n <= 9; n++) {
for (r = 0; r <= n; r++) {
sum += combination2(n, r);
}
}
return sum;
}


int sub3(void)
{
int n, r, sum = 0;

for (n = 0; n <= 9; n++) {
for (r = 0; r <= n; r++) {
sum += combination3(n, r);
}
}
return sum;
}


int main()
{
int i, sum;
clock_t t;

//---------------
// 再帰

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub();
}
printf("%d\n", sum);
printf("%.5f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

//---------------
// 初級者さんの

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub2();
}
printf("%d\n", sum);
printf("%.5f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

//---------------
// 組木さん

t = clock();//時間を格納
sum = 0;
for(i=0;i<10000;i++){
sum += sub3();
}
printf("%d\n", sum);
printf("%.5f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);

// quit
printf("end.\n");
getchar();
return 0;
}


1,142ポイント を落としてしまった。

Name: Justy  ..ハッカー(255,282ポイント)   Date: 2008/11/03(月) 20:40   No:23386     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

>良かったら直し方を教えて欲しいのですが、

 そうですね。一番簡単でほぼ確実なのは
 
 sub1.c/cppに sub()を。
 sub2.c/cppに sub2()とcombination2()を。
 sub3.c/cppに sub3()とcombination3()/primeFactor()など

 というふうに3つの関数(sub/sub2/sub3)とそれぞれのサブ関数を
別の翻訳単位(c/cppファイル)に分けてしまうこと、でしょうか。

 同一ファイルに書くと、最適化の関係で各関数の中で何をしているのかを分析した結果、
今回のように無駄だと判断され処理を省かれたり、関数そのものが消滅(インライン化)されたり
してしまうことがあります。

 ソースを分けて外部結合にしてしまえば、コンパイラは基本的にソース単位でしか
解析・最適化をしないので、別のファイルにある関数内で何をしているかわからない以上、
省略することなく関数を呼び出しにいきます。

 というわけで、この方法で main関数のあるソースから sub/sub2/sub3をループで呼び出せば、
ほぼ確実にループ回数分呼ばれるはずです。



>平等な測定を目指すには、
>sub1,sub2をちゃんと10000回ループさせればいいのですか?

 普通に考えると、そう思います。
 さすがに1回しか呼ばれないものと、1万回呼ばれたものの時間の比較は
あまり意味がないですし・・・。



>えーと、最適化というのはリリースモードでビルドすることですよね。

 一応そうです。
(一応と付けているのは、リリースビルドだからといって必ずしも最適化がかかっている、
とは限らないから、です)



>VCに生成された機械語を見る機能でもあるのでしょうか、

 外部ツールにも勿論そういうツールはありますが、
VisualStudioにもその機能は備わっています。

 EE版にあるかどうかはわからないのですが、VisualStudioのオプションの
「デバッグ->全般」の中に「アドレスレベルのデバッグを有効にする」と
「ソースが内場合逆アセンブルの表示」という項目がありますので
両方にチェックを付けて下さい。

 これで実行中にブレイクポイントなどで実行を止めて、
ソースコードに対して右クリックすると「逆アセンブルの表示」という項目が
追加されます。

 あとはこれを選択すると該当するソースのアセンブリコードが表示されます。
(ちなみに、ステップ実行で通常は入れない関数の中に入ることもできるようになりますよ)


 実はもう1つアセンブリコードを見る方法がありまして、
コンパイラの設定で「C/C++ -> 出力ファイル」の中に「ASMリストの出力」
という項目がありますので、それを「なし」からそれ以外の適当なものに変更します。
 すぐ下の「ASMリストの場所」は $(IntDir)\としておいて下さい。

 これでビルドすると各ファイルをコンパイルするたびに .objファイルが作られるディレクトリと
同じディレクトリに .asmファイルが作られます。
 これをテキストエディタで開くとアセンブリコードを見ることができます。


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

Name: たいちう  ..中級者(14,659ポイント)   Date: 2008/11/03(月) 23:33   No:23403     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
> 比較の方法が勉強になります。
> うーむ、一度見たこと無いと思いつかないですね。

↓この部分でしょうか?

> if (c1 != c2 || c2 != c3)
>   printf(" !!!!\n");

c1 = c2 = c3 だったらOK、そうでなかったらNGとしてます。

OKの場合は、(c1 == c2 && c2 == c3)。
c1 == c3が省けることは分かりますよね?

NGの場合は、!(c1 == c2 && c2 == c3)。
ここで「ド・モルガンの法則」を摘要すると、
(c1 != c2 || c2 != c3)となります。
この法則の使い方は覚えておいて損は無いでしょう。

最後に、最終的なif文の条件を日本語に置き換えて、
おかしくないことを一応確認して完成です。
慣れれば殆ど考えずに書けますよ。


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

Name: こめかみ  ..プログラマー(33,777ポイント)   Date: 2008/11/07(金) 03:27   No:23631     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
>>組木さん

先に分母を素数に分解すると計算が速くなる理屈がやっと(たぶん)つかめました。
確実に割り切れる数だけで割っていけば、
割り切れるか判らない数で片っ端から割っていくよりも、
確かに早くなりますね!


>>たいちうさん

ド・モルガンの法則だとは意識してませんでしたが、
そのif分の使い方自体は、
ゲームプログラミングの館をはじめとする、
管理人さんの館シリーズ(綾辻行人みたい)のおかげで見知っていました。
ただコンソールアプリは
ゲームプログラミングにも増して不慣れなもので、
最終的なif文の条件を日本語に置き換える、
というのと、
出力の全パターンを比較する、というような。
"全出力"
を組み合わせるというのがとても新鮮に感じられたのでした。

なんかたいちうさんって数学お詳しそうですね、
数学用語の変数が英語だったり。プロはみんな読めて当たり前なのですかね。
道はけわしいです。気合入れねば。



>>Justyさん

 ご指導ありがとうございます。

 調べたら機械語とアセンブリコードは別物でしたね。
 認識が甘かったです。

C言語→(コンパイル)→アセンブリ語→(アセンブリ)→マシン語=実行ファイル
この一連の流れ=ビルド

 こんな感じですかね。コンパイルとビルドの違いがやっと判った気がします。
(VCのコマンドの違いは依然不明なのが口惜しいですが)


>(ちなみに、ステップ実行で通常は入れない関数の中に入ることもできるようになりますよ)

 これが今の私にはわかりませんでした。
 "関数の中に入る"とはなんでしょうか。
 定義や宣言に飛ぶのとも、
クイックウォッチで変数の中身を見るのとも違うようですが。

 使いこなせてなくてすみません。
 質問する側もある程度わかってないと解説もままならないですよね...



>同じディレクトリに .asmファイルが作られます。

 これは出来ました。
 アセンブリってなんか、見てるだけでかっこいいですね。
 意味は全然わかりませんが、なぜかワクワクします。
 C言語からアセンブリコードに上手く切り替えられたとき、
 ゲームで、狙ってバグッたフィールドに入ったような印象を受けました。
 なんだろ、裏技っぽさが、私の原風景のようなものなのかもしれません。


 VC9EE版では
「ASMリストの出力」→ 「アセンブリの出力」
、と
 ちょっと名前が違いました。ご参考までに。
「ASMリストの場所」は、そのまんま「ASMリストの場所」でした。


> ソースを分けて外部結合にしてしまえば、コンパイラは基本的にソース単位でしか
>解析・最適化をしないので、別のファイルにある関数内で何をしているかわからない以上、
>省略することなく関数を呼び出しにいきます。

 ありがとうございます。
 ファイル分割は今日はもう無理そうなので、土曜の夜にでも挑戦してみます。
きっと日曜には結果を報告します。


 VCEEでNo:23335のテストコードで
Justyさんと同じ辺りのアセンブリコード発見出来ました。(長いので詳細は分けて投稿します)


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

Name: こめかみ  ..プログラマー(35,069ポイント)   Date: 2008/11/07(金) 03:28   No:23632     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
 Cのソースはまったく同じコードの筈なのに変数名(?)が微妙に違うもんですね。
 EE版とPRO(?)版の違いってことですかねー。

 なんかC言語のたったこれだけの記述が、
こんなややこしい記述に変換されていることが実感出来て感慨深いです。

// 再帰



t = clock();//時間を格納
0040126B mov ebp,dword ptr [__imp__clock (4020A0h)]
00401271 push esi
00401272 push edi
00401273 call ebp
00401275 mov edi,eax
00401277 call sub (4011C0h)

sum = 0;

for(i=0;i<10000;i++){
0040127C imul eax,eax,2710h

sum += sub();

}

printf("%d\n", sum);
00401282 mov esi,dword ptr [__imp__printf (4020A8h)]
00401288 push eax
00401289 push offset string "%d\n" (402170h)
0040128E call esi

printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);
00401290 call ebp
00401292 sub eax,edi
00401294 mov dword ptr [esp+40h],eax
00401298 fild dword ptr [esp+40h]
0040129C fdiv qword ptr [__real@408f400000000000 (402188h)]
004012A2 fstp qword ptr [esp]
004012A5 push offset string "%.3f\x95b\n" (402174h)
004012AA call esi



//---------------

// 初心者さんの



t = clock();//時間を格納
004012AC call ebp
004012AE mov edi,eax
004012B0 call sub2 (401220h)

sum = 0;

for(i=0;i<10000;i++){
004012B5 imul eax,eax,2710h

sum += sub2();

}

printf("%d\n", sum);
004012BB push eax
004012BC push offset string "%d\n" (402170h)
004012C1 call esi

printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);
004012C3 call ebp
004012C5 sub eax,edi
004012C7 mov dword ptr [esp+4Ch],eax
004012CB fild dword ptr [esp+4Ch]
004012CF add esp,0Ch
004012D2 fdiv qword ptr [__real@408f400000000000 (402188h)]
004012D8 fstp qword ptr [esp]
004012DB push offset string "%.3f\x95b\n" (402174h)
004012E0 call esi
004012E2 add esp,0Ch



//---------------

// 組木さんまたは私



t = clock();//時間を格納
004012E5 call ebp
004012E7 mov dword ptr [esp+3Ch],eax

sum = 0;
004012EB mov dword ptr [esp+34h],0
004012F3 mov dword ptr [esp+38h],2710h

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

sum += sub3();
004012FB xor ebx,ebx
004012FD xor edi,edi
004012FF xor esi,esi
00401301 test edi,edi
00401303 jl main+0B5h (401315h)
00401305 mov eax,esi
00401307 mov ecx,edi
00401309 call combination3 (401110h)
0040130E inc esi
0040130F add ebx,eax
00401311 cmp esi,edi
00401313 jle main+0A5h (401305h)
00401315 inc edi
00401316 cmp edi,13h
00401319 jle main+9Fh (4012FFh)
0040131B add dword ptr [esp+34h],ebx
0040131F sub dword ptr [esp+38h],1
00401324 jne main+9Bh (4012FBh)

}

printf("%d\n", sum);
00401326 mov eax,dword ptr [esp+34h]
0040132A mov esi,dword ptr [__imp__printf (4020A8h)]
00401330 push eax
00401331 push offset string "%d\n" (402170h)
00401336 call esi


#Justyさんの文章、段落の始めに空白がありますね。
#国語の教科書のような綺麗な文章に気が引き締まりました。


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

Name: Justy  ..ハッカー(258,465ポイント)   Date: 2008/11/07(金) 20:32   No:23674     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

>C言語→(コンパイル)→アセンブリ語→(アセンブリ)→マシン語=実行ファイル
>この一連の流れ=ビルド

 概ねそんな感じですが、「リンク」も仲間に入れてあげて下さい。



> "関数の中に入る"とはなんでしょうか。

 あ、ステップインのことです。
 アセンブリ表示ができると、C/C++のソースからではステップインできなかった
関数にも入れるようになります。



> 「ASMリストの出力」→ 「アセンブリの出力」
> ちょっと名前が違いました。ご参考までに。

 あ、そうですね。すみません。
 「アセンブリの出力」です。多分下の「ASMリストの場所」と混ざって
脳内で変換されてしまったみたいです(w



>Cのソースはまったく同じコードの筈なのに変数名(?)が微妙に違うもんですね。

 たしかにシンボル名が違いますね。
 多分ランタイムの違いでしょう。うちはマルチスレッド(/MT or /MTd)でビルドしていますが、
こめかみさんはマルチスレッドDLL(/MD or /MDd)にしているのではないでしょうか。



>同じ辺りのアセンブリコード発見出来ました

 やはり微妙な違いはありますが、概ね前回の指摘通りになっているようです。
(1つ目と2つ目は 10000倍、3つ目は10000回ループ)



>#Justyさんの文章、段落の始めに空白がありますね
>#国語の教科書のような綺麗な文章に気が引き締まりました。

 あれ? あれれ?
 他のスレも見てみましたが、入れているのは私だけ???

 自分はずっとメールも含めて文章を書く時は文章の先頭は1字下げています。
 これはもう習慣になってしまっていますが、普通はあんまり入れないんでしょうか。




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

Name: こめかみ  ..プログラマー(36,605ポイント)   Date: 2008/11/09(日) 04:59   No:23793     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

> 概ねそんな感じですが、「リンク」も仲間に入れてあげて下さい。

了解です。リンクリンク、と。



> アセンブリ表示ができると、C/C++のソースからではステップインできなかった
>関数にも入れるようになります。

ステップイン、及びステップ実行は全然使ったことの無い(または忘れてた)機能でしたが、
MSDNで、何とか把握しました。
プログラムの流れをカーソルで追って見てみたいと以前から思っていたので、
目から鱗です。

で、機能はわかったのですが、
アセンブリ表示が出来なかったときに、
"ステップインできない関数"というのが、
私なりに探してみたのですが、
わかりませんでした。

No:23335のコードに、入れない関数はもともと無かったのでしょうか。
入れない関数の条件などを教えていただければ、
それをヒントに探してみようと思います。
よろしくお願いします。



> 多分ランタイムの違いでしょう。うちはマルチスレッド(/MT or /MTd)でビルドしていますが、
>こめかみさんはマルチスレッドDLL(/MD or /MDd)にしているのではないでしょうか。

ランタイムは確かにそのとおりだったので、(なんでわかるのだろう・・・)
マルチスレッド(/MT or /MTd)に変えて、
リリースモードでソリューションをいったんクリーンしてから、
ビルドしなおしてアセンブリコードを見たのですが、
Justyさんの環境で生成されたような、
clockとpirntfの具体的な変数、関数名が出てこないですね。
うーん、あまり気にしないことにします。



> やはり微妙な違いはありますが、概ね前回の指摘通りになっているようです。
>(1つ目と2つ目は 10000倍、3つ目は10000回ループ)

具体的に読めてるんですか?すごいなぁ。
でも今回の件のおかげで、今後はアセンブリ読めない私にも、
アセンブリコードの行数を頼りに、
インライン展開されていないか推測する、
という作戦が使えそうですね。

というわけで龍神録の館のファイル分割を参考にしながら、
リリースビルドしてよく見てみたところ、
おそらく10000倍は直っていないようです。
問題の性質上プロジェクトをUPいたしますのでお手数ですが、
何かやり方がまずいのか、大きな勘違いをしてるかなどの、
問題点のご指摘をお願いできませんでしょうか。
ttp://cid-d72819af3901253a.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b%e8%b3%aa%e5%95%8f%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%88%86%e5%89%b2.zip
私が未熟なばっかりにご迷惑おかけします。
よろしくお願いします。



> 自分はずっとメールも含めて文章を書く時は文章の先頭は1字下げています。
> これはもう習慣になってしまっていますが、普通はあんまり入れないんでしょうか。

私も、義務教育で叩き込まれた感覚的にも、
文章作法的にも、字下げしたい性格な筈なのですが。
この掲示板の文書作法にいつの間にか習っていたのか、
もしくは一文字の空白が積み重ねるタイムロスを本能的に回避していたのか・・・
よくわかりませんw

最古参であろうJustyさんが今まで誰にも何も言われなかったのなら、
きっと私が気にしすぎなのですね。


#スモールタグ(?)が見やすかったので、真似してみましたが、
#なかなか面倒ですね、これ。書き慣れるしかないんですかね。




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

Name: Justy  ..ハッカー(263,092ポイント)   Date: 2008/11/09(日) 13:43   No:23805     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

>ステップイン、及びステップ実行は全然使ったことの無い(または忘れてた)機能

 あー、そうでしたか。

 

>アセンブリ表示が出来なかったときに、
>"ステップインできない関数"というのが、

 んーと、例えば今回のソースで説明できなくもないのですが、解りやすくするために

    #include <windows.h>
    int main()
    {
        Sleep(10);
        return 0;
    }

 のコードで考えます。

 アドレスレベルのデバッグがオフになっていた場合、
右クリックメニューにも逆アセンブル表示は出てこないですし、Sleep()のところで
ステップインしてもそのまま何事も無かったかのように次の returnのところに
進んでしまいます。

 しかし、アドレスレベルのデバッグがオンになっていると逆アセンブル表示ができるので、
Sleep()のところまで進めたら逆アセンブル表示をします。

   Sleep(10);
->0042D69E mov     esi,esp
  0042D6A0 push    0Ah
  0042D6A2 call    dword ptr [__imp__Sleep@4 (497214h)]

 するとこんな感じの表示になります。
 逆アセンブル表示中のステップ実行はアセンブリ1行1行のステップになりますので、
callのところまで進めて、ステップインすると・・・・Sleep()の中に入ることができます。


->7C802442 mov     edi,edi
  7C802444 push    ebp
  7C802445 mov     ebp,esp
  7C802447 push    0 
  7C802449 push    dword ptr [ebp+8]
  7C80244C call    7C80239C
  7C802451 pop     ebp
  7C802452 ret     4 

 まぁ、中に入ってもC/C++のソースではないんですけどね。



>No:23335のコードに、入れない関数はもともと無かったのでしょうか

 無くはないです。
 例えば、Debugビルドの方の return 0付近に cppソースの方にはないのですが、
コンパイラが自動的に埋め込んだチェックルーチンの呼び出しがあります。

    return 0;
  00431BB4 xor     eax,eax
  }
  00431BB6 pop     edi
  00431BB7 pop     esi
  00431BB8 pop     ebx
  00431BB9 add     esp,0E8h
  00431BBF cmp     ebp,esp
  00431BC1 call    @ILT+3775(__RTC_CheckEsp) (42FEC4h)

 この __RTC_CheckEsp()なんかは通常では入れないと思います。



>マルチスレッド(/MT or /MTd)に変えて、

 プロジェクトの方見てみました。
 デバッグビルドの設定はマルチスレッドデバッグ(MTd)になっていましたが、
リリースビルドの設定がマルチスレッドDLL(MD)になっていました。
 多分そのせいでしょう。



>リリースビルドしてよく見てみたところ、
>おそらく10000倍は直っていないようです。

 おっと。そうですね。
 これはちょっと懸念していたのですが、多分大丈夫だろうとスルーしてました。
 えーと、前回コンパイラは翻訳単位(c/cppファイル)毎に最適化すると
書きましたが、実はリンクが最適化してくれることがあります。

 それが、プロジェクトの設定「C/C++ -> 最適化」の中にある「プログラム全体の最適化」という設定です。
 これはリ翻訳単位間の最適化を行いリンカが行い、コードを生成する設定で、
現在リリースモードでこれが有効になっています。

 これが有効になっていると翻訳単位が別になっていても必ず同じ値を返す関数なら
10000倍するようなコードが生成されてしまいます。

 なので、これを「いいえ」にすれば、ループできちんと呼び出されます。



>私も、義務教育で叩き込まれた感覚的にも、
>文章作法的にも、字下げしたい性格な筈なのですが。

 あれからいろいろ見てみました。
 メール・掲示板では結構字下げしない人が多いですね。
 全く居ないわけではないのですが、少ないようです。
 
 ただ、さすがに印刷物やビジネス文書で字下げをしない人は全くいませんでた(w
 
 「メール 字下げ」で検索すると字下げに関する話がいろいろ出てきます。

段落のはじめの字下げをする?、しない? -OKWave
http://okwave.jp/qa591050.html

一字下げについて考える - BLOG STATION
http://blog.goo.ne.jp/kanimaster/e/c596ce4352e536beda7041aa011d6728

アポロ漫録: 文章の整形 (2) - 段落と字下げ
http://taroturanai.spaces.live.com/blog/cns!56DD05887CD4DFD2!510.entry

 面白いですねぇ。



>スモールタグ(?)が見やすかったので

 テンプレートを用意してそこの間に書くだけなんですよ(w
 それでも面倒といえば面倒かもしれませんが。

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

Name: 組木紙織 [URL]  ..熟練のプログラマー(65,368ポイント)   Date: 2008/11/09(日) 16:14   No:23814     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
字下げなどの、表示のルールはその場その場によって変わるので、
周りに合わせてあげればそれで十分だと思います。
(インデントのルールみたいに、気にする人は気にするんですよね。
 面白い。
)



>テンプレートを用意してそこの間に書くだけなんですよ(w
>それでも面倒といえば面倒かもしれませんが。

引用だけに使うんだったらツール作って通してあげれば面倒じゃないですね。
作るのが面倒かも知れませんが。

#アセンブラの話がここのとこ続いてたので気になって8086のアセンブラをはじめてみました。
#難しいというより、面倒です。


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

Name: box  ..ハッカー(128,917ポイント)   Date: 2008/11/09(日) 16:55   No:23815     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
このトピックをしばらく見ていないうちに、
タイトルと全然違う内容になっているようです。

有意義な話ですので、続けてくださるのはよいのですが、
新たにトピックを立てられる方がいいようにも思います。


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

Name: Justy  ..ハッカー(263,716ポイント)   Date: 2008/11/09(日) 18:48   No:23819     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    

組木紙織さん
>引用だけに使うんだったらツール作って通してあげれば面倒じゃないですね。

 定型分を呼び出すようなマクロという形で、一応簡単なのは作ってあるんですよ。



boxさん
>タイトルと全然違う内容になっているようです

 たしかに。
 もうそれほど長くは続かないと思いますが、
予想外に続くようならそうした方が良さそうですね。


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

Name: こめかみ  ..プログラマー(37,852ポイント)   Date: 2008/11/12(水) 22:26   No:23941     
Title: Re:数学でいう組み合わせの問題の解き方で、再帰ではなく約分を使って解く(実装する)には?    
すみません、遅くなりました。


>boxさん



すみませんもうちょっとで終わります。
ご迷惑おかけします。


>ツールについて


なにやらめくるめく自作ツールワールドの気配・・・!
興味のあるところですがまたスレッドが伸びてしまいそうですし、
その話題はまたの機会にお願いします。

とりあえずオペラのメモ機能がそれっぽく使えそうなのでそれで代用させていただきます。



>Justyさん



> 多分そのせいでしょう。

そのせいでした。
うまくいきました!

<証拠>

t = clock();//時間を格納
00401004 call clock (4014A4h)
00401009 mov ebx,eax
sum = 0;
0040100B xor esi,esi
0040100D mov edi,2710h

for(i=0;i<10000;i++){
sum += sub();
00401012 call sub (401150h)
00401017 add esi,eax
00401019 sub edi,1
0040101C jne main+12h (401012h)
}

printf("%d\n", sum);
0040101E push esi
0040101F push offset string "%d\n" (40E198h)
00401024 call printf (4013DFh)




ステップインについて

解りやすくするためのコードとNo:23335のコードともにアセンブリの関数に入ることが出来ました。
おかげさまでこの件は完全に納得出来ました。
ありがとうございました。


そしていよいよちゃんとした比較結果が出せました。

組木さんは逆転なるか!

1895815408
104.828秒
1895815408
0.375秒
1895815408
15.157秒
end.

一番上が再帰ですが...
15.157秒
再帰よりははるかに早いですね。

初級者さんのは流石の一秒未満
これはやりがいを追及するのも超納得です。

でもこれ組木さんのがNo:23335の改定前のを修正したものなので、

次は改定版で比較比較っと。

1895815408
104.812秒
1895815408
0.391秒
1895815408
15.140秒
end.

ありゃ
一回の比較の実行じゃ大して変わりませんでしたか。


最後にもう一度、皆さん長いことお付き合いいただきありがとうございました。



#あー、予想はしてたけど、
#時間経ちすぎてサンプルの館とかもうどうでもよくなっちゃったなぁ。
#やっぱ勢いのあるときに行動するのは大事ですね。
#ゲームだ、ゲームを作って掲載してもらおう。



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



Name: うい  ..ぴよぴよ(16ポイント)   Date: 2008/11/12(水) 02:15   No:23905       
Title: VisualC++ 2008 Express Edition    
VisualC++ 2008 Express EditionはC言語も使えるのですか?

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


Name: 御津凪 [URL]  ..プログラマー(35,272ポイント)   Date: 2008/11/12(水) 02:46   No:23907     
Title: Re:VisualC++ 2008 Express Edition    
使えますよ。

コンパイラは拡張子で判別してコンパイルしてくれます。

# デフォルトのプロジェクト作成についてくる "stdafx.cpp" も、 "stdafx.c" にする必要有り


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

Name: うい  ..ぴよぴよ(65ポイント)   Date: 2008/11/12(水) 03:11   No:23908     
Title: Re:VisualC++ 2008 Express Edition    
それと、このサイトで紹介されているプログラムはすべてC言語なのですか?
コピーしたはずなのにコンパイルに失敗してしまいました。

何度も質問すみません


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,896ポイント)   Date: 2008/11/12(水) 03:51   No:23909     
Title: Re:VisualC++ 2008 Express Edition    
うちのサンプルコードはC++対応のコンパイラじゃないとコンパイル出来ない部分があるのに
基本的な書き方はC言語という超中途半端仕様になってます(汗

C++のファイルにしない理由はなにかあるのでしょうか?
.cppファイルでコンパイルしてみてはどうでしょう?
後、コンパイルエラーが出たときは、そのエラーメッセージも一緒に書いてもらえると解り易いです。
詳しくは規約をご覧下さい。


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

Name: うい  ..ぴよぴよ(179ポイント)   Date: 2008/11/12(水) 03:58   No:23910     
Title: Re:VisualC++ 2008 Express Edition    
bccでやっているのですが、まず準備の段階のところので


Error DxLib.h 35 11: Cannot open file: windows.h

** error 20018 ** deleting Debug\game.res

Make End !! (Elapsed time 0:00.515)


というのが出てしまいます。
これは設定の問題なのでしょうか?


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

Name: うい  ..ぴよぴよ(265ポイント)   Date: 2008/11/12(水) 04:04   No:23911     
Title: Re:VisualC++ 2008 Express Edition    
ちなみにやり方(準備)の方はbccのためDXライブラリ置場のほうを参照してやりました。
PC内にVisualC++ 2008 Express Editionもある状況でしたが、始めうまくいかなかったのでこちらでやることにし、
VisualC++ 2008 Express Editionのほうは今アンインストール中です。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,953ポイント)   Date: 2008/11/12(水) 04:20   No:23912     
Title: Re:VisualC++ 2008 Express Edition    
SDKがちゃんと入っていないのではないですか?
DXライブラリの設定をもう一度よく見て設定してみてください。
また、VC++の方が後々便利だと思いますので、こちらを使った方がいいと思います。


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

Name: うい  ..ぴよぴよ(367ポイント)   Date: 2008/11/12(水) 04:29   No:23913     
Title: Re:VisualC++ 2008 Express Edition    
もう一度やってみましたが変化なしでした。
SDKというものはどのタイミングで入れているのか教えてもらえるとありがたいです。


VC++はあまりにもややこしいので、できれば慣れてから使いたいところです。
何度も質問ほんとにすみません。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(882,201ポイント)   Date: 2008/11/12(水) 05:02   No:23914     
Title: Re:VisualC++ 2008 Express Edition    
サンプル実行用フォルダに入っているプロジェクトを使えばややこしくは無いと思いますが・・。
VC++2008はSDKを入れる必要がないので、こっちの方が逆に設定は簡単だと思いますよ。

それからSDKを入れる順番は特にありません。DXライブラリの設定欄にかいてある説明通りにすれば出来ます。



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

Name: うい  ..ぴよぴよ(408ポイント)   Date: 2008/11/12(水) 19:36   No:23929     
Title: Re:VisualC++ 2008 Express Edition    
もう一度VC++2008でやってみることにします。
アドバイスありがとうございました。



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



Name: がまぐち  ..ぴよぴよ(380ポイント)   Date: 2008/11/11(火) 22:14   No:23894       
Title: デスクトップマスコット    
DXライブラリを使用して「デスクトップマスコット」を作って
みたいのですが、ウィンドウ外に画像を描画する方法が分かり
ません(泣)

もし、描画する方法がお分かりになる方は教えてください。
よろしくお願いします。

 VC++2005EEとDXライブラリを使用しています。


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


Name: Justy  ..ハッカー(264,458ポイント)   Date: 2008/11/12(水) 00:29   No:23899     
Title: Re:デスクトップマスコット    
 「ウインドウ外」に表示しているデスクトップマスコットを見たことがないのすが、

Win9xのデスクトップ・マスコットに挑戦してみる
ttp://www.6809.net/tenk/html/prog/winmas.htm
 こちらのサイトが参考になるのではないかと。


 あとは作ったウインドウハンドルを DXライブラリに食わせて
WM_PAINTで描画すればいい・・・のかな?

 試したことはないで、ほんとに出来るかどうかはわかりませんが。

 あとそれ系の書籍も出てたと思うので、それも参考にしてみて下さい。


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

Name: がまぐち  ..ぴよぴよ(557ポイント)   Date: 2008/11/12(水) 11:28   No:23918 解決!     
Title: Re:デスクトップマスコット    
>こちらのサイトが参考になるのではないかと。

サイトを見てみたところ、ウィンドウを透明化、または四角以外の形に変えていることが
分かりました。ウィンドウが表示されていなかったので、てっきりウィンドウ外に画像を
描画する方法があるのかと思っていました(汗)

紹介していただいたサイトで勉強してみます。

Justy様、回答ありがとうございました。


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



Name: 素人  ..初心者(8,113ポイント)   Date: 2008/11/08(土) 21:04   No:23758       
Title: 3D上に三角形を書き色を塗る    
今回初めて3Dに挑戦します。

3D上に三角形を書き色を塗りたいのですが色の設定の仕方がわからないです。
現在は黒で三角形をかくことに成功しました。

以下を修正して赤単色(255)などで作る方法を教えていただけないでしょうか?

typedef struct{
float x,y,z;
}D3DVERTEX;

D3DVERTEX v[3]= {
{ 1,1,0 },
    { 0,1,1 },
{ 1,0,1 },
};

lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,v,sizeof(D3DVERTEX));


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


Name: Justy  ..ハッカー(259,809ポイント)   Date: 2008/11/08(土) 21:52   No:23760     
Title: Re:3D上に三角形を書き色を塗る    
 その構造体 D3DVERTEXを

    struct D3DVERTEX
    { 
        float x,y,z; 
        D3DCOLOR col;
    };

 としてカラー値を付け加えます。

 使うときはこんな感じです。
 

    D3DVERTEX v[3]=
    { 
        { 1,1,0, D3DCOLOR_ARGB(255, 0, 0), }, 
        { 0,1,1, D3DCOLOR_ARGB(255, 0, 0), }, 
        { 1,0,1, D3DCOLOR_ARGB(255, 0, 0), }, 
    }; 
    lpD3DDev->SetFV(D3DFVF_XYZ|D3DFVF_DIFFUSE); 
    lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,v,sizeof(D3DVERTEX));


 この方法ですと頂点毎に色を変えることができます。

 が、頂点が大量にあって一括で指定したい場合はレンダーステートを変更した方が簡単かもしれません。 
http://www.play21.jp/board/formz.cgi?action=res&resno=23372&page=&id=dixq&rln=23735


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

Name: 素人  ..初心者(8,311ポイント)   Date: 2008/11/08(土) 22:09   No:23763     
Title: Re:3D上に三角形を書き色を塗る    
レスありがとうございます。

D3DCOLOR_ARGBの引数が少ないと警告が出たのですが
D3DCOLOR_ARGB(255, 0, 0), をD3DCOLOR_ARGB(255,255, 0, 0)に直しても大丈夫でしょうか?
                      ↑一つ目は透明度?

また
error C2039: 'SetFV' : 'IDirect3DDevice9' のメンバではありません。
'IDirect3DDevice9' の宣言を確認してください。
とエラーが出てしまいます。


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

Name: 素人  ..初心者(8,350ポイント)   Date: 2008/11/08(土) 22:15   No:23764     
Title: 連スレすいません    
SetFVFにしたらエラーがでませんでした><
ただ色が黒のまま変更されません・・・


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

Name: Justy  ..ハッカー(259,859ポイント)   Date: 2008/11/08(土) 22:20   No:23765     
Title: Re:3D上に三角形を書き色を塗る    
 すみません。
 D3DCOLOR_ARGBに関しては一つ目の引数に透明度を加えると言うことでOKです。
 SetFVの方はご指摘の通り SetFVFです。


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

Name: トピ主  ..ぴよぴよ(28ポイント)   Date: 2008/11/08(土) 22:23   No:23767     
Title: Re:3D上に三角形を書き色を塗る    
Justy様
せっかく説明していただいているのに挙げ足を取ってしまうような言い方になり申し訳ないです。

色の方が黒から変更されないのですが、色を読み込めていないのでしょうか?


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

Name: Justy  ..ハッカー(259,911ポイント)   Date: 2008/11/08(土) 22:26   No:23768     
Title: Re:3D上に三角形を書き色を塗る    

>ただ色が黒のまま変更されません・・・

 うーん、何ででしょうね。
 今こちらでテストコードを書いてみたのですが、普通に赤い三角形が出ました。

 全体のコードとかって、提示できますか?


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

Name: t_white  ..入門者(2,623ポイント)   Date: 2008/11/08(土) 22:29   No:23771     
Title: Re:3D上に三角形を書き色を塗る    
自分も最近DirectXに手をつけ始めたので間違っていると悪いのですが

// 頂点の色を使用する
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

を一応どこかに入れておくといい感じかも・・・。

このレンダーステート変更しないでも頂点色適応されるんでしたっけ?
もう既に書いてある場合すみませんです。


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

Name: Justy  ..ハッカー(260,122ポイント)   Date: 2008/11/08(土) 23:40   No:23777     
Title: Re:3D上に三角形を書き色を塗る    

>レンダーステート変更しないでも頂点色適応されるんでしたっけ?

 補足ありがとうございます。
 たしかテクスチャステージ0の D3DTSS_COLORARG2のデフォルトは D3DTA_CURRENT
(ステージ0での D3DTA_CURRENTは D3DTA_DIFFUSEと同じ)なので、
デフォルトから変更していなければ無くても大丈夫だと思います。


 で、結局原因はよくわからないので、こちらで作成したかなりてきとーなサンプルを添付しておきます。
 Render()でその処理を行っています。
 違いを見比べてみて下さい。



# 0:22 最後の最後で直したところがおかしかったので添付のソースを修正しました。


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

Name: t_white  ..入門者(2,728ポイント)   Date: 2008/11/09(日) 00:13   No:23780     
Title: Re:3D上に三角形を書き色を塗る    
>>たしかテクスチャステージ0の D3DTSS_COLORARG2のデフォルトは D3DTA_CURRENT
なるほど!
横からレスしといて勝手に勉強させてもらいましたです。(笑)
やっぱり回答レスするのはもっと色々勉強してからにしよう。_| ̄|○


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

Name: Justy  ..ハッカー(260,405ポイント)   Date: 2008/11/09(日) 00:24   No:23784     
Title: Re:3D上に三角形を書き色を塗る    

>横からレスしといて勝手に勉強させてもらいましたです。(笑)
>やっぱり回答レスするのはもっと色々勉強してからにしよう。_| ̄|○

 いやいやいや、気付いたことがあればどんどんレス入れて下さい!
 今回のにしても、テクスチャステージ周りを変更していたりしたら有効な回答ですよ。


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

Name: 素人  ..初心者(8,411ポイント)   Date: 2008/11/12(水) 00:47   No:23901     
Title: Re:3D上に三角形を書き色を塗る    
lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);

を付け加えたらできました><

ありがとうございます。


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



Name: 大阪人  ..ぴよぴよ(206ポイント)   Date: 2008/11/11(火) 11:50   No:23869       
Title: for文をうまく使い文字を読みきる    
"123",,,"456"..."789"
この場合において123,456,789のダブルクオートで囲まれたものを抽出したい場合
while(pinto,sizeof pinto,fp != NULL){

tp = strchr(pinto,'"');
strcpy(cdmy,strtok(pinto,"\""));
printf(cdmy);

}
これで123は間違いなく取れると思うんですけど
456,789をとりたい場合どうしたらいいでしょうか??
かなり悩んでいましてどなたかお力を貸していただきたく投稿いたしました。
どうぞよろしゅう頼みます。


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


Name: バグ  ..ハッカー(124,783ポイント)   Date: 2008/11/11(火) 12:15   No:23870     
Title: Re:for文をうまく使い文字を読みきる    
その処理を繰り返せばいいのではないでしょうか?

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

Name: non  ..入門者(2,700ポイント)   Date: 2008/11/11(火) 12:49   No:23871     
Title: Re:for文をうまく使い文字を読みきる    

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

int main(void)
{
char str[] = "\"123\",\"456\",\"789\"";
char *tp;
tp = strtok( str, "\"," );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL,"\"," );
if ( tp != NULL )
puts( tp );
}
return 0;
}



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

Name: 大阪人  ..ぴよぴよ(233ポイント)   Date: 2008/11/11(火) 13:12   No:23874 解決!     
Title: Re:for文をうまく使い文字を読みきる    
助かりました。ありがとう

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



Name: sakana  ..ぴよぴよ(525ポイント)   Date: 2008/11/10(月) 23:54   No:23864       
Title: CSVファイルへの出力方法    
CSVへの出力方法を調べていたら、たどり着きました。
お時間があるときで構いませんので、CSVファイルへの出力方法のアドバイス
をいただけたらと思います。

現在、C言語にて(VC++6.0)CSVファイルから数値のみの任意のレコード
を読込、レコードの合計値を加算した結果を最後に付け加え、元のレコードの
位置にCSVとして出力するというプログラムを作成しています。

レコード長は可変であり、下記のイメージのように実現したいと思ってます。

○イメージ
1,2,3,4,5,6,7
5,6,7,8   → ここを取得
9,0,1

加算後
1,2,3,4,5,6,7
5,6,7,8,26  ← ここに出力
9,0,1

ftellでレコード位置を取得し、fseekで移動してfprintfで出力と考えていますが、
実際にやってみると、

1,2,3,4,5,6,7
5,6,7,8,26
5,6,7,8,26  ← 二重になってしまう。
9,0,1

失敗しています。
このような関数、考え方があるで構いませんので、アドバイスいただけたらと思います。
ソースコードは現在手元にありませんので、載せられません。

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








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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,483ポイント)   Date: 2008/11/11(火) 03:01   No:23865     
Title: Re:CSVファイルへの出力方法    
ソースコードが手元に戻ってから、それを元に指摘を受けたほうが早くないでしょうか?


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

Name: バグ  ..ハッカー(124,769ポイント)   Date: 2008/11/11(火) 10:26   No:23867     
Title: Re:CSVファイルへの出力方法    
C++は無しでしょうか?

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

Name: non  ..入門者(2,547ポイント)   Date: 2008/11/11(火) 10:32   No:23868     
Title: Re:CSVファイルへの出力方法    
よくわからないのですが、これってシーケンシャルファイルなんでしょ?
レコードの最後に追加するって・・・?元ファイルに?
任意のレコードって?レコードの区切りは改行?



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



Name: けんたろうちゃん  ..かけだし(2,025ポイント)   Date: 2008/11/10(月) 02:51   No:23845       
Title: 龍神録プロジェクト43章について(誤字、脱字)    
ページ内のコード中に脱字と思われる箇所がありました


void fps_wait(){
int term,i,gnt;
static int t=0;

の後の

static FILE *fp=fopen("txt.txt","w");

が抜けてると思います

また本文&ソースコード中で

if(fps_count==600)
fclose(fp);

とありますが、正しくは

if(fps_count==(FLAME-1))
fclose(fp);

が正しいと思います(元のままだとtxtファイルを無限に書き続けるので


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,477ポイント)   Date: 2008/11/10(月) 04:27   No:23846     
Title: Re:龍神録プロジェクト43章について(誤字、脱字)    
う・・テストの為に書いたプログラムが消さずに残ってますね;
このプログラムは本来あるべきではないもので、
私が単に時間を計る為に入れたテストコードです。
不要なものなので、削除しておいて下さい^^;
アップしているプログラムはこちらで削除しておきます。
ご報告ありがとうございますm(_ _;)m


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

Name: けんたろうちゃん  ..かけだし(2,125ポイント)   Date: 2008/11/10(月) 21:49   No:23860     
Title: Re:龍神録プロジェクト43章について(誤字、脱字)    
ところで不要と思われるプログラム中の

static FILE *fp=fopen("txt.txt","w");
fprintf(fp,"%d:%d\n",fps_count,term);
fclose(fp);

の三行を外すと、FPSの制御ができないようなのですが(僕の環境だけかも知れませんが
fprintf〜の行のみ外すと正常に制御できるので、ぜひよければ理由を教えてください
(僕のプログラム読解力がないだけかもしれませんが・・・)


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,457ポイント)   Date: 2008/11/10(月) 22:42   No:23862     
Title: Re:龍神録プロジェクト43章について(誤字、脱字)    
fclose(fp);の前のif(fps_count==600)も消していますか?
こちらで確認したところ、75Hzのモニタでもきちんと60FPSで表示されました。
制御できないというのは具体的にどういう状態になります?
75Hzのモニタで動かすと75FPSになりますか?


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

Name: けんたろうちゃん  ..かけだし(2,160ポイント)   Date: 2008/11/11(火) 09:30   No:23866 解決!     
Title: Re:龍神録プロジェクト43章について(誤字、脱字)    
if(fps_count==600)を消すことで制御できるようになりました
(制御できないといってたのは60FPSより小さいのFPSに変えられないということです


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



Name: 大工  ..プログラマー(32,597ポイント)   Date: 2008/11/09(日) 14:05   No:23807       
Title: SAT問題を解くプログラム    
いつもお世話になっています,大工です.

いま,SAT問題(充足可能性問題)についてC++で作っています.
data.in に含まれるデータを隣接行列に見立ててそこから各ノードが隣接しているか判断しています.
data.in においては行列の上半分だけデータとして取り込んでいます.(下半分は同じ事なんで)
問題になっているのは sat.cpp での二重 for ループにある
// 論理関数に登録する.
booleanfunc.push_back(clause(tlit1, tlit2));
booleanfunc.push_back(clause(flit1, flit2));
が問題になっています.これを実行すると
a, b
0xbfae3e94
a1, b1,
0xbfae3e94
a0, b0,
a, c
0xbfae3e94
a1, c1,
0xbfae3e94
a0, c0,
0xbfae3e94
a1, c1,
0xbfae3e94
a0, c0,
a, e
0xbfae3e94
a1, e1,
0xbfae3e94
a0, e0,
0xbfae3e94
a1, e1,
0xbfae3e94
a0, e0,
0xbfae3e94
a1, e1,
0xbfae3e94
a0, e0,
と表示され期待通りになりません.
私が期待しているのは booleanfunc は
booleanfunc
+--------+--------+--------+--------+--------+
| 0x11 | 0x12 | 0x13 | 0x14 | 0x15 |
+--------+--------+--------+--------+--------+
このようにばらばらのアドレスを保存させたいのです.
(アドレスが一緒だったら引数を変えても同じものとりますもんね^^;)
関数 clause 内では新しく new で領域をとっているつもりなのですが同じ領域をとってしまいます.
どうにかならないでしょうか?
あと,ヘッダファイルで int a; とグローバル変数を定義すると
/tmp/cccIwGSL.o:(.bss+0x0): multiple definition of `a'
/tmp/cciZxMSI.o:(.bss+0x0): first defined here
collect2: ld はステータス 1 で終了しました
と怒られます.どのように回避出来ますか?

環境:Linux(Ubuntu8.10) 端末

===data.in===
1101
001
10
0
(上にグラフを描いてみました)
==sat.cpp== メインルーチンを含むプログラム

#include"sat.h"
#include<fstream>

int main(void) {

int NOTREV = 1;

std::ifstream fin;
std::list<std::list<Literal*>*> booleanfunc;
std::list<std::list<Literal*>*>::iterator ipp;

int nodes;
std::cout << "How many nodes in the Graph? >>";
std::cin >> nodes;

fin.open(fname);
if (!fin.is_open()) {

// エラー処理.
exit(1);
}

char c;
char charac1, charac2;
charac1 = 'a'; charac2 = 'b';

for(int i = 0; i < nodes - 1; i++) {

for(int j = 0; j < nodes - NOTREV; j++) {

fin.get(c);
if(CONECT == c) {

// リテラルの生成.
std::cout << charac1 << ", " << charac2 << std::endl;
Literal tlit1(charac1, true), tlit2(charac2, true);
Literal flit1(charac1, false), flit2(charac2, false);

// 論理関数に登録する.
booleanfunc.push_back(clause(tlit1, tlit2));
booleanfunc.push_back(clause(flit1, flit2));

for(ipp = booleanfunc.begin(); ipp != booleanfunc.end(); ipp++) {

std::cout << *ipp << std::endl;
}
}

charac2++;
}
// 改行を読み飛ばす.
fin.get(c);
charac1++;

charac2 = 'b' + NOTREV;
NOTREV++;
break;
}

for(ipp = booleanfunc.begin(); ipp != booleanfunc.end(); ipp++) {

//std::cout << *ipp << std::endl;
}

fin.close();

return 0;
}


==sat.h== クラスの定義をするヘッダ

#include<iostream>
#include<stdlib.h>
#include<list>
#include<string>

const char CONECT = '1';
const char fname[] = "data.in";

class Expression {

// コピーコンストラクタ・代入演算子の使用を禁止.
private:
Expression(const Expression&);
Expression& operator=(const Expression&);

protected:
char char_;

public:
Expression() : char_(' '){}
Expression(char c) : char_(c) {}
char charac() {return char_;}
};

class Literal : public Expression {

// var_:あり(false),なし(true).
private:
bool var_;

public:
Literal() : Expression(), var_(true) {};
Literal(char lt, bool var) : Expression(lt), var_(var) {};
bool var() {return var_;}
};

std::list<Literal*>* clause(Literal&, Literal&); // clause 関数:節を作成する.
std::ostream& operator<<(std::ostream&, std::list<Literal*>*);


==func.cpp== 具体的な関数の定義をするプログラム

#include"sat.h"
#include<iostream>

std::list<Literal*>* clause(Literal& lit1, Literal& lit2) {

std::list<Literal*>* clause;
clause = new std::list<Literal*>;

clause->push_back(&lit1);
clause->push_back(&lit2);

return clause;
}
std::ostream& operator<<(std::ostream& stream, std::list<Literal*>* lit) {

std::list<Literal*>::iterator it;

std::cout << &lit << std::endl;
for(it = lit->begin(); it != lit->end(); it++) {

stream << (*it)->charac() << (*it)->var();
stream << ", ";
}

return stream;
}


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


Name: Justy  ..ハッカー(263,603ポイント)   Date: 2008/11/09(日) 15:55   No:23810     
Title: Re:SAT問題を解くプログラム    

>表示され期待通りになりません.
>数 clause 内では新しく new で領域をとっているつもりなのですが同じ領域をとってしまいます

 たしかにclause()内部で newでリストを生成していますが、問題なのは

    clause->push_back(&lit1);
    clause->push_back(&lit2);

 のようにポインタを入れていることです。
 これがヒープに確保されたポインタとかならばいいのですが、この lit1や lit2は
呼び出し元を見るとただのローカル変数です。

 ということはこの lit1や lit2は呼び出し元の if(CONECT == c)の {}が
終わった段階で消滅しているはずです。

 従って、最終的に出来上がったリストは破棄されたはずのクラスのポインタを指すリストになる、
というわけです。



>あと,ヘッダファイルで int a; とグローバル変数を定義すると
>/tmp/cccIwGSL.o:(.bss+0x0): multiple definition of `a'

 エラーメッセージに書いてあるとおりです。
 aが多重定義されているからです。
 同一名前空間の中で同じ名前を持つグローバル変数を複数のファイルで定義することは
できませんよ。


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

Name: 大工  ..プログラマー(32,703ポイント)   Date: 2008/11/09(日) 21:00   No:23833     
Title: Re:SAT問題を解くプログラム    
clause関数は設計しなおします.ありがとうございました.

名前空間?ですか?namespaceはどこにも書いてないのですがこれはどういうことでしょうか?


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

Name: Justy  ..ハッカー(263,941ポイント)   Date: 2008/11/09(日) 21:27   No:23838     
Title: Re:SAT問題を解くプログラム    

>名前空間?ですか?namespaceはどこにも書いてないのですが

 書いてなくても名前空間内に配置されます。
 この場合はグローバル名前空間ですね。

C++編(言語解説) 第18章 名前空間
ttp://www.geocities.jp/ky_webid/cpp/language/018.html
の下の方参照


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

Name: 大工  ..プログラマー(32,735ポイント)   Date: 2008/11/09(日) 21:32   No:23839     
Title: Re:SAT問題を解くプログラム    
あ,なるほど・・・・
グローバル変数を使いたいときはどのようにすればよいのでしょうか?


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

Name: Justy  ..ハッカー(263,972ポイント)   Date: 2008/11/09(日) 21:44   No:23840     
Title: Re:SAT問題を解くプログラム    
 このページが参考になるかと思います。


Cプログラミング診断室/これでもプロ/構造的欠陥
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.2.4.html


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

Name: 大工  ..プログラマー(32,741ポイント)   Date: 2008/11/10(月) 01:51   No:23844     
Title: Re:SAT問題を解くプログラム    
sat.h の先頭と最後に
#ifndef INCLUDE_SAT_H_
#define INCLUDE_SAT_H_
===本体===
#endif
としましたが,変化はありませんでした...
あと,const をつけるとエラーが出ないのはなぜなのでしょうか?


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

Name: Justy  ..ハッカー(264,146ポイント)   Date: 2008/11/10(月) 14:02   No:23849     
Title: Re:SAT問題を解くプログラム    

>としましたが,変化はありませんでした...

 すみません。
 こちらの方がわかりやすいかもしれません。

C言語編 第32章 ファイル分割
ttp://www.geocities.jp/ky_webid/c/032.html

 同じ名前のグローバル変数を複数のファイルで定義することは
できないので、1つのファイルにだけ定義し、後のファイルでは extern宣言を使って
参照するような形に書き直せばうまくいくはずです。



>あと,const をつけるとエラーが出ないのはなぜなのでしょうか?

 constをつけた場合変数ではなく定数として扱われ、デフォルトで内部リンケージ、
つまり static を付けたのと同じような扱いになりますので、多重定義のエラーにはなりません。
 
ロベールのC++教室 - 第69章 リンケージ -
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01069.html


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

Name: 大工  ..プログラマー(32,803ポイント)   Date: 2008/11/10(月) 23:13   No:23863     
Title: Re:SAT問題を解くプログラム    
返信がおそくなりました.

なるほど,extren ですか・・・忘れてました><


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



Name: 紅葉  ..入門者(3,001ポイント)   Date: 2008/11/09(日) 12:50   No:23802       
Title: マウスで動かせるX-FileViewerの作成    
所有しているパソコンで「X-FileViewer」が使えないのといろいろな機能を追記するため

http://www.play21.jp/board/formz.cgi?action=res&resno=23372&page=&id=dixq&rln=23735

に添付してあるライブラリで「X-FileViewer」みたいなものを作ろうと考えています。
とりあえずはマウス操作だけを実装しようとしています。
「X-FileViewer」の動きがクリックを開始する位置で回転の方向が変わるのですが
これはどの様に書いているのでしょうか?

想像もできないのでご存知の事がありましたら教えていただけないでしょうか?


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


Name: Justy  ..ハッカー(263,714ポイント)   Date: 2008/11/09(日) 18:33   No:23817     
Title: Re:マウスで動かせるX-FileViewerの作成    
 X-FileViewerって何でしょう?

 Xファイルを見るためのツールというのはわかりますが、
その名前と似たような名前を持つツールは幾つかあるので、
わかりません。


 そもそも何故そのツールが使えないのでしょうか?


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

Name: 紅葉  ..入門者(3,022ポイント)   Date: 2008/11/09(日) 18:47   No:23818     
Title: Re:マウスで動かせるX-FileViewerの作成    
Xファイルを開いた時に出る画像のものです。
なぜかはわかりませんが強制終了します。
ただ現在位置を自由に変えられる機能など作る予定なので
URLのライブラリを使い作ろうかと考えています。

とりあえずはマウスで動かせるようにと考えているのですが
クリックを開始する位置によって回転する方向が変わることを知り
どのような処理をしているか気になりました。


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

Name: Justy  ..ハッカー(263,912ポイント)   Date: 2008/11/09(日) 19:11   No:23821     
Title: Re:マウスで動かせるX-FileViewerの作成    
 それは "DirectX Viewer"ですね。
 検索してみるとどうも SDKのバージョンによって動いたりエラーに
なったりしているようです。

Problems with DirectX Viewer - GameDev.Net Discussion Forums
http://www.gamedev.net/community/forums/topic.asp?topic_id=428832

 もし古い SDKを使っているなら新しいのに変えてみれば動くかもしれませんし、
たしか DirectX Viewerはソースが付いていたはずなので、リビルドして
テストすれば動かない原因を特定することはできるかもしれません。


 で、挙動の方ですがうちのPCには "DirectX Viewer"が入っていないので
回転の挙動の方はちょっとわかりません。
 ソースが付いているはずなので解析してみてはどうでしょうか。


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

Name:    ..かけだし(1,128ポイント)   Date: 2008/11/10(月) 22:32   No:23861     
Title: Re:マウスで動かせるX-FileViewerの作成    
XファイルビューワーよりMeshViewのが多機能ですよ。
同じMS製です。
http://fatalita.sakura.ne.jp/3DLib/Tips/TrimX/index.html


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



Name: 羽流布 [URL]  ..中級者(11,716ポイント)   Date: 2008/11/10(月) 19:14   No:23857       
Title: MacにおけるBMPファイル操作    
この度、講義でプレゼンをすることになり、僕はバイリニア補間をプログラムで実現することにしました。

とりあえず、BMPファイルを操作するプログラムを書いたのですが(都合上、添付ファイルは削除)、
Winでは正常に動作するものの、プレゼンで使用するMacではヘッダ情報の書き込み時に問題が発生するようです。
MacでBMPを開くためのソフトを使用して開こうとしたら、ファイルが壊れていると怒られました(;^^

バイナリエディタで開いてみると、こんな感じでした。

【Winの場合】
42 4D 36 0C 00 00 00 00 00 00 36 00 00 00 28 00
00 00 20 00 00 00 20 00 00 00 01 00 18 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00

【Macの場合】
4D 42 00 00 0C 36 00 00 00 00 00 00 00 36 00 00
00 28 00 00 00 20 00 00 00 20 00 01 00 18 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00


どうしましょう……。
Macのことはよく解りませんorz

macでコンパイルに使用したソフトは、Xcodeというものです。


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


Name: Mist  ..プログラマー(31,511ポイント)   Date: 2008/11/10(月) 19:26   No:23858     
Title: Re:MacにおけるBMPファイル操作    
Win
> 36 0C 00 00

Mac
> 00 00 0C 36

エンディアンの問題ですね。
以下のHPを参照してください。
http://www.ertl.jp/~takayuki/readings/info/no05.html
http://son-son.sakura.ne.jp/programming/tips.html

多バイトデータの出力時に、上位バイトと下位バイトの入れ替えをすると正しくなります。
以下、私がよく使う変換用のマクロです。


#define SWAP2(x) ((((x) << 8) & 0xff00) | (((x) >> 8) & 0x00ff))
#define SWAP4(x) ((((x) >> 24) & 0x000000ff) | (((x) >> 8) & 0x0000ff00) | (((x) << 8) & 0x00ff0000) | (((x) << 24) & 0xff000000))




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

Name: 羽流布 [URL]  ..中級者(11,810ポイント)   Date: 2008/11/10(月) 20:48   No:23859 解決!     
Title: Re:MacにおけるBMPファイル操作    
迅速な回答ありがとうございます^^

エンディアンの違いだったのですね……。
参考HPのほうは勉強になりました。

これで何とかなりそうです。
変換用マクロもありがとうございますm(_ _)m
活用させていただきます。


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



Name: えっと  ..ぴよぴよ(327ポイント)   Date: 2008/11/10(月) 10:22   No:23847       
Title: カウンタについて    
龍神録プログラミングの館で「stage」,「stage_count」,「stage_title_count」,「stage_title.appear_cnt」という変数が出てきますが、それらの違いが分からないので教えてください。
あわせて、GV.hにある「フラグ・ステータス変数」と「設定用変数」の意味も教えてください。
初歩的な質問ですみません・・。


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,607ポイント)   Date: 2008/11/10(月) 14:45   No:23850     
Title: Re:カウンタについて    
あらゆる物体が時間と共に変化するにはカウンタが必要です。
今、エフェクトが登録されたとします。例えばそのエフェクトが1秒かかって「キラン」とするとします。
そのためには60FPSなら60回カウントする必要があります。
そのカウンタによって画像を変えたり音を出したりするわけです。
60を超えるとフラグをオフにし、そのエフェクトを消します。
このようにあらゆるものにはカウンタが必要なのです。
stageは現在のステージ数、stege_countはそのステージ内でのカウント数、
stage_title_countは全てのステージのタイトルをいつの時刻(カウンタ数)で出現させるかの設定用カウンタ数、
stage_title.appear_cntはその各ステージのタイトルがいつ表示されるかというカウンタ数です。
stage_title_countには1面なら200,2面なら300,という風に全て予め入っています。
この辺は後からキレイに書き換えます。
stage_title.という構造体はその面のタイトルについての構造体なので、中身はそのステージごとにかわります。
中身のカウンタ数はstage_title_countを受け継ぎます。

ですから、カウンタと設定用変数では、実際にカウントを計算する変数か、時刻(カウント数)をいれておく変数かという違いがあります。


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

Name: えっと  ..ぴよぴよ(570ポイント)   Date: 2008/11/10(月) 17:53   No:23854     
Title: Re:カウンタについて    
丁寧な説明ありがとうございます。
それぞれのカウンタの意味するものは分かりました。
さらに2つ質問させていただきます。

GV.hに
//フラグ・ステータス変数
GLOBAL int func_state,stage_count,count,stage; //関数制御用変数
とありますが、
関数制御用変数という言葉の意味がわかりません。
これらの変数の使われ方にはどういった共通点があるのですか?
(答えにくい質問の仕方でごめんなさい。)

あと、もう1点。
GV.hで
GLOBAL int stage_title_count[STAGE_NUM];
と書いてあるのに、
ini.cppで
stage_title_count[stage];
と書いていいのですか?
STAGE_NUMとは全ステージの数のことで、
stageとは現在のステージのことですよね?
stage_title_countのあとの[]の中身が違うものになっていますが良いのですか?





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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(881,369ポイント)   Date: 2008/11/10(月) 18:19   No:23855     
Title: Re:カウンタについて    
それは最初

//フラグ・ステータス変数
GLOBAL int func_state; //関数制御用変数

だったんですが、後から変数を付け足して

//フラグ・ステータス変数
GLOBAL int func_state,stage_count,count,stage; //関数制御用変数

こうなりました。なので、関数制御用変数はfunc_stateです。解りにくくてごめんなさい。
1章から順番に読んでもらったら具体的な意味が解ると思います。

func_sateはメイン関数のメインループで使用しているものです。
どの関数を呼ぶか制御している変数です。

>stage_title_count[stage];  と書いていいのですか?

どこか変ですか?
普通にstage_title_count配列に入っているstage番目の要素を指定しているだけです。
ちなみにSTAGE_NUM個配列要素を用意した時、STAGE_NUM番の要素は存在しません。

int a[5];

で配列を用意した時、a[0]〜a[4]が用意されますが、a[5]はありませんよね。
stageは現在0なので、0番の要素が指定されているはずです。
配列要素番号の指定は[0]でも[1]でも[2]でも0以上STAGE_NUM未満の整数なら何番でもいいはずです。


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

Name: えっと  ..ぴよぴよ(601ポイント)   Date: 2008/11/10(月) 18:37   No:23856 解決!     
Title: Re:カウンタについて    
あっそうか。
基本的なこといろいろ頭から抜けていたみたいです・・。
すみません。ありがとうございます。


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



Name: nopy  ..ぴよぴよ(1ポイント)   Date: 2008/11/10(月) 11:24   No:23848       
Title: 縦スクロールから横スクロールへ    
はじめまして、いつもこのサイトを参考にゲームプログラムを作っています。

それで質問なんですけど、今ある縦スクロールのシューティングゲームを横スクロールにしたいと思っているのですが、どう変更すればいいのかわかりません・・・
それと自機が敵の攻撃1発で死んでしまうので、自機にもHPをつけようとおもうのですけど、これも、どこをいじればいいのかわかりません・・・

もし宜しければお力添え頂けないでしょうか。

環境 Windows
コンパイラ名 VisualC++用 DXライブラリ
バージョン VC++ 2008EEです


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(880,972ポイント)   Date: 2008/11/10(月) 14:57   No:23851     
Title: Re:縦スクロールから横スクロールへ    
プログラムの内容は独自のプログラムですか?龍神録の館とほぼ同じですか?
ここまで大きく変えるのなら、基本概念を勉強してから、1から作ってはどうですか?
縦スクロールを横スクロールにする為に、今どこまで変更すればいい箇所がわかっていますか?
もし一つもわかる箇所が無いような状態なら、この先数え切れないほど躓いてしまうと思います。
それなら1から自分で自分が作ったコードを頼りに作っていった方が応用もし易いかと思います。
固執してもらうほどたいしたプログラムじゃないですから・・。

もしもそれでも変更の方が良いという場合は、1章から入念にプログラムを見て行って下さい。
コードを完全に理解しないとここまで変更するのは難しいと思います。
また、どうすれば横スクロールに出来るかということですが、
変更箇所が多すぎてここに書ききれません。

まずは、縦シューティングのフォーマットを変更し、新しくドット絵を用意して下さい。

//フィールドの広さ
#define FMX 384
#define FMY 448
//フィールドの左上の座標
#define FX 32
#define FY 16

FMXは640,FMYは480でFXは0,FYは0にすれば全画面になります。
キャラの初期位置も左に、進む方向を右にします。
現在キャラが撃つ弾は上方向つまり-PI/2方向に飛んでいますから、これを0ラジアンの方向に飛ばすように変更し、
背景も--x方向に流して、yを固定するように変更、
敵の移動パターンも左に流れるように変更し、敵の初期位置もxが画面外右、yは240付近に変更・・。

書き始めたらキリが無いので、やはり、
「ここでつまってるんだけど、ここはどうやったら実現できるのか?」
というピンポイントな質問の仕方をしてもらったほうがいいと思います。
とりあえずどこまで解っていて、どこが解らないかを具体的にして下さい。


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



Name:  ..ぴよぴよ(73ポイント)   Date: 2008/11/07(金) 03:11   No:23629       
Title: 誰か教えてもらえませんか??    
画像の表示がうまくいきません 保存している場所は、あっていると思うのですが・・・ 解決方法をお願いします!!

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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(876,309ポイント)   Date: 2008/11/07(金) 03:57   No:23633     
Title: Re:誰か教えてもらえませんか??    
今回の質問はゲームプログラミングの館の質問ということでしょうか?
使っているライブラリはDXライブラリですか?
画像はどこに表示できないのでしょう。DXライブラリで生成したウィンドウでしょうか?
もしそうだとしたら「ちゃんと表示できなかった人はこちらで、問題を解消してください。」のページは確認されましたでしょうか?


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

Name:  ..ぴよぴよ(385ポイント)   Date: 2008/11/07(金) 23:08   No:23700     
Title: :誰か教えてもらえませんか??    
忙しい中 返事を頂きありがとうございます。
ライブラリは、DXライブラリを使っています。 
伝説なるハッカーさんの言うとおり”こちら”から問題解決を
図ったのですが(保存場所がまちがっている)と出ました。
しかし「サンプルプログラム実行用フォルダ」の中画像をいれても結果は、同じでした。
使ったのは、Borland社の方では、ありません

解決方法がありましたら是非お願いします。 
状況説明が分かりにくかったらすいません。


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

Name:  ..ぴよぴよ(454ポイント)   Date: 2008/11/07(金) 23:20   No:23702     
Title: ::誰か教えてもらえませんか??    
追記します。
環境 Windowsです 
コンパイラ名 VisualC++用 DXライブラリです
バージョン VC++ 2008EEです

遅れてすみません!!


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

Name: kazuoni  ..プログラマー(36,555ポイント)   Date: 2008/11/07(金) 23:41   No:23705     
Title: Re:::誰か教えてもらえませんか??    
あ・・・伝説のハッカーさんは現段階では称号です^^;
実際回答なさったのは管理人さんです。

ファイルの名前、画像形式の記述は間違っていませんか?


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

Name:  ..ぴよぴよ(588ポイント)   Date: 2008/11/08(土) 00:18   No:23707     
Title: Re:::誰か教えてもらえませんか??    
返事ありがとうございます!
ファイルの名前も確認済みです。
画像形式は、いじくっていないので大丈夫だと思います!
ほかの関数とかは、うまく利用できるのですが、画像取り込みの関数だけ利用できません!

原因がまったくわかりません 
解決方法よろしくお願いします。


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

Name: kazuoni  ..プログラマー(36,713ポイント)   Date: 2008/11/08(土) 00:48   No:23710     
Title: Re:::誰か教えてもらえませんか??    
>しかし「サンプルプログラム実行用フォルダ」の中画像をいれても結果は、同じでした

ということは、新たに自分でプロジェクトを作っているということでしょうか?
ゲームプログラミングの館にそってはいないということですか?
画像はプロジェクトと同じ場所に入れてください。


>コンパイラ名 VisualC++用 DXライブラリです
DXライブラリはコンパイラではないです。その名の通りライブラリです。
コンパイラはVC++ 2008でよいと思います。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(876,712ポイント)   Date: 2008/11/08(土) 01:50   No:23713     
Title: Re:::誰か教えてもらえませんか??    
まずは自分でプロジェクトを作らず、サンプル実行用フォルダのプロジェクトを利用してみて下さい。
ファイル名、ファイル形式をしっかり確認して下さい。
ウェブからビットマップで保存した後、自分でpngに名前を変えたりしていませんか?

どうしても解決しないのでしたら現在試行錯誤しているサンプル実行用フォルダごと圧縮してどこかのアップローダに上げて下さい。
こちらで確認してみます。


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

Name:  ..ぴよぴよ(649ポイント)   Date: 2008/11/09(日) 17:13   No:23816     
Title: Re:::誰か教えてもらえませんか??    
返事ありがとうございます 皆さんの意見を参考に
色々自分なりにやってみます
それでもできなっかたらもう一度聞きに来ます
わがままいってすみません


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

Name:  ..ぴよぴよ(706ポイント)   Date: 2008/11/09(日) 23:20   No:23843 解決!     
Title: :誰か教えてもらえませんか??    
ようやく出来ました!!ありがとうございました
皆さんの意見、参考になりました。
本当にありがとうございます


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +