1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.58【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1218023777/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
100 名前:デフォルトの名無しさん [2008/09/10(水) 19:10:23 ] これで1Gのファイル生成と、char型配列の関連づけできてますか? int main() { char temppath[300], tempfile[300]; GetTempPath(300, temppath); GetTempFileName(temppath,"mem",0,tempfile); HANDLE fp=CreateFile(tempfile, GENERIC_READ|GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 ); int size=1000000000; LockFile(fp,0,0,size,0); HANDLE mp=CreateFileMapping( fp, 0, PAGE_READWRITE|SEC_COMMIT, 0, size, "memtest"); char *q=(char*) MapViewOfFile( mp, FILE_MAP_ALL_ACCESS, 0, 0, 0); q[size-1]='a'; UnmapViewOfFile(mp); UnlockFile(fp,0,0,size,0); CloseHandle(fp);}
101 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 19:23:31 ] >>96 何の目的かわからないけどWinならスパースファイルを作ればいい。 見せ掛けだけだからディスク容量は減らないが。
102 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 19:25:34 ] 1Gのファイルを作って見たけど、体感で60秒ぐらいかかった。結構時間かかるんだね。 gcc
103 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 20:09:44 ] >>94 それで検索して一番目に作り方と使い方の説明ページが出てくるけど。 そのページでさっぱり分からないとなると、 ここで聞いても無駄だと思う。 レスで書ける文字数的に。 具体的にどこが分からないか書けばアドバイスしてくれる人も居るかもしれないけどね。
104 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 21:39:44 ] >>96 Winの場合、適当にファイル作ってファイルポインタを1GBの位置に移動、 ファイル終端をそこに設定すればいける
105 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 21:40:58 ] 1GBじゃなくて10GBだった。まあサイズはなんだっていいけど。
106 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 21:46:35 ] 超初心者です。 クラスを3つほど作り 数を入力して、もともと設定されている数と計算をし、 他のクラスの数から引いて、表示する ってのを作るにはどうしたらいいですか?
107 名前:デフォルトの名無しさん [2008/09/10(水) 21:49:34 ] >>106 宿題スレでもいくといいよ
108 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 21:53:35 ] >>107 宿題じゃなくて、宿題を片付けるための試しのプログラムだから・・・OTL
109 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 22:13:28 ] >>108 宿題スレでもいくといいよ
110 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 22:15:13 ] そもそも意味がわからん
111 名前:デフォルトの名無しさん [2008/09/10(水) 23:36:21 ] トランプを使ったプログラムについて質問です。 mainで、 int card[4][13]; char *mark[4]={"H","D","C","S"}; char *number[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; と宣言して、これを関数の中でも使いたいときってどうすればいいの? 例えば関数Aで使いたいとしたら void A( ) { } で( )の中には何をいれればいいんですか?
112 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 23:40:49 ] char**
113 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 23:47:07 ] int card[4][13]; と char *mark[4]={"H","D","C","S"}; char *number[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; で違う 後者は>>112 の通り 前者はint x[][13]とかint (*x)[13]とか
114 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 23:47:35 ] typedef
115 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 23:48:53 ] void A(int card[4][13], char *mark[4], char *number[13]) A(card, mark, number);
116 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 23:51:06 ] 作ってみたんですけど エラー E2176 ted.cpp 14: 宣言に型が多すぎる エラー E2193 ted.cpp 50: 呼び出し時のパラメータが足りない:M::Attacked(Kougeki)(関数 main() ) となって上手くいきません 指摘お願いします。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7709.txt
117 名前:111 [2008/09/10(水) 23:55:16 ] 111です。 ありがとうございました! できました!!
118 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 00:01:51 ] >>116 class Kougeki { (中略) }; ←ここにセミコロン m.Attacked(); ←Kougeki型の変数を渡さないといけない
119 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 00:06:45 ] k.damage == com * pow; ^^;
120 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 00:08:41 ] s.Attack(); m.Attacked(); ↓ m.Attacked(s.Attack()); かなあ?どうしたいのかよくわからないので何ともいえないけど。
121 名前:116 mailto:sage [2008/09/11(木) 00:09:26 ] 解決しますたー ありがとうございました!
122 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 00:22:00 ] 結局どうやったかを書いてくれないのがちょっと残念なとこだがいつものことだな
123 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 06:25:22 ] 自分をお客さんだと思ってるんだろうな。 getばかりでsetの概念が飛んでる。
124 名前:90 [2008/09/11(木) 07:07:34 ] その後・・・VC++2008 ExpressEdition だと問題なくコンパイル〜実行できました。 VC++2005 ExpressEdition + SP1 ではコンパイルエラーが出るようです。 コンパイラが対応していない記述方法が原因という理解をしました。 ありがとうございました。
125 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 07:09:52 ] >>124 あの糞なBCC(5.9.3)でもまともに走るぞ。 バグじゃね?
126 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 07:28:44 ] .
127 名前:デフォルトの名無しさん [2008/09/11(木) 09:29:38 ] 名前をつけてあげるといいと思うよ
128 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 09:41:55 ] ゴッドファーザーですな
129 名前:デフォルトの名無しさん [2008/09/11(木) 18:04:41 ] こんな風に関数の中でアドレスをコピーして 結果用の引数に入れて返すにはどうしたらいいですか? void CopyPtr(int* in, int* out) { out = in; } void main() { int* in; int* out; *in = 10; CopyPtr(in,out); cout << *out << endl; }
130 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:08:02 ] void CopyPtr(int* in, int*& out) { out = in; }
131 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:08:21 ] >>129 void CopyPtr(int* in, int** out) { *out = in; } ..... CopyPtr(in, &out); .....
132 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:24:34 ] >>130-131 できたぁ〜ありがとん!
133 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:35:56 ] ダイアログのOK、キャンセルを押してもダイアログが閉じません。 あとBCCFormで.rcと.hは作りました。 どうすればいいか教えてください。 あとフリーのリソースエディタで皆さんがいいと思うものを教えてください。 ttp://www2.uploda.org/uporg1664738.zip
134 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:43:21 ] >>133 ボタンのコントロールIDを IDOK や IDCANCEL にすればよい
135 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 18:51:17 ] >>134 できました! ありがとうございます。 あとBCCFormでリソースファイルを作成すると、include <windows.h>が作成されないんですけどほかのソフトのほうがいいでしょうか? ちょっと使いにくいかなと思って。
136 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 20:07:39 ] >>135 それはBCCがリソースコンパイルにwindows.hを必要としないが故の仕様
137 名前:デフォルトの名無しさん [2008/09/11(木) 22:59:31 ] 質問です。なるべく省メモリにしたいのですが。 DLLとEXEが提供されているプログラムがあり、 メモリ (DLLのみ) かファイルを渡して処理(or出力ファイル)を返すのですが ファイルを渡した方が省メモリになりますよね? この場合、ファイルが1Gあったとしてはじめの100Mだけ渡したい場合はどうすればいいですか?
138 名前:デフォルトの名無しさん [2008/09/11(木) 23:02:44 ] 100M分だけ切り抜いて渡すしかありませんか? メモリに格納すれば、書き込むコストが無くせますが、100M分余計にメモリを食います。 相手のプログラムがその100Mを作業領域に使ってくれればかまわないのですがその保証はありません。
139 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:04:16 ] ニホンゴでOKでーす
140 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:04:46 ] 「ファイルを渡す」ってのは具体的にはどういう処理なの?
141 名前:デフォルトの名無しさん [2008/09/11(木) 23:06:32 ] testprg.exe testfile という風にです。 標準ではプロンプトに出力が出ますが -o outputfileなども書けます。
142 名前:デフォルトの名無しさん [2008/09/11(木) 23:08:33 ] でかいファイルを、小さく見せかける方法がわかれば、コピーする必要がないのですが。 たとうばchar[]でいうと\0を途中にいれるような方法です。
143 名前:デフォルトの名無しさん [2008/09/11(木) 23:09:58 ] 中国か韓国の人に聞いたらどうですか?
144 名前:デフォルトの名無しさん [2008/09/11(木) 23:11:28 ] 1Gの後半900Mをロックしておいて、前半の100Mで一つのファイルと見せかけて 処理が終わったら、また1Gに戻すような方法はありますか?
145 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:12:48 ] >>141 じゃ、メモリを渡すってのは?
146 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:14:44 ] 100M切り取ってコピーして終わったら書き戻せよ
147 名前:デフォルトの名無しさん [2008/09/11(木) 23:14:51 ] メモリで渡すと、余分に100M使い込んでしまうんです・・・なんとかなりませんか?
148 名前:デフォルトの名無しさん [2008/09/11(木) 23:17:04 ] >>146 コピーすれば、処理後は削除するだけで良いとは思いますけど・・・ でもコピーのコストが掛かるのが嫌なんです。
149 名前:デフォルトの名無しさん [2008/09/11(木) 23:20:49 ] ファイル内容をロックしたまま、サイズだけを縮小出来れば、 HDD、メモリの物理的な動作は必要なく、一瞬で済むはずです。 戻すのも一瞬です。 教えてください。
150 名前:137 [2008/09/11(木) 23:26:23 ] 自己解決しました。
151 名前:デフォルトの名無しさん [2008/09/11(木) 23:26:50 ] してません
152 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:30:09 ] もうCは難しすぎるからやめた!
153 名前:デフォルトの名無しさん [2008/09/11(木) 23:30:10 ] 150は本物です。 その方法は、メモリマップドファイルでサイズ指定してDLLに渡すんです。 でもこれだと、exeしか提供されていない場合は出来ません。 exeでも出来る方法はありませんか
154 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:36:51 ] DLLだって、DLLしか提供されてなかったら、渡すほうから勝手に渡し方を決められないだろ。
155 名前:デフォルトの名無しさん [2008/09/11(木) 23:39:38 ] ついに中国共産党の幹部が動き出したぞ!
156 名前:デフォルトの名無しさん [2008/09/11(木) 23:39:51 ] DLLの場合は、ポインタchar *で渡すので同時にサイズを指定できるんです。 exeはファイルしか入力できないので、そのままだと1G全部処理してしまいます。 なんとかなりますか?
157 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:43:23 ] 通信しろよ
158 名前:デフォルトの名無しさん [2008/09/11(木) 23:48:10 ] まずこれがわかりません。 1Gのファイルを先頭100Mだけ残して縮めるのはどうしたらいいですか? あと、100Mと900Mのファイルをコピー無しに連結するのはどうしたらいいですか? どちらも書き込み不可にしておけば目的を達成できます。
159 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:49:44 ] うぜぇな。 しらねぇよ。 NTFSとMFTでもググって勝手にやれ。
160 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 00:01:29 ] >>156 154無視かよ、俺じゃないけど。 それはEXEだから、DLLだから、という問題ではない。 EXEでもファイル名と、そのうち何バイト目から何バイト目だけを処理するって オプションを指定できるようになっているものだってあるし、 DLLでも\0終端文字列を受け取るので、バイト数を直接的に指定できないってものもある。
161 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 00:10:02 ] バイナリデータならサイズ指定出来るのは普通ですよ。あとEXEにファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では? 縮小、結合方法を教えてもらいたいです。
162 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 00:40:41 ] constの付いたポインタは、const_cast使えばconstをはずせますが、 constの付いたポインタでない普通の変数(intとかdoubleとか)のconstを 一時的にはずす方法ってありますか?
163 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 01:09:47 ] *(type-name *)&variable = rvalue const int i = 10; *(int *)&i = 20; i = 30; 見なかったことにしてくれ
164 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 01:18:35 ] int& j = *const_cast<int*>(&i);
165 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 01:24:12 ] >>164 int& j = const_cast<int&>(i);でおk
166 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 01:30:27 ] >>161 関数にファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では? って言ってるのと同じに見える で、知りたいのは ・1つのファイルを、メモリに読み込むことなく分割する方法 ・2つのファイルを、メモリに読み込むことなく結合する方法 ってこと?それならたぶん無理だと思う そもそも、ファイルの内容をメモリに読み込まないと、ファイルの操作ができないから >>138 を見ると、どこで100M分余計にメモリを食うのかわからない。 dll なり exe なりに渡すとコピーが発生するって事? >>142 からそんな風に感じたんだけど。 でも>>149 見ると、その dll や exe が受け取ったデータのコピーを取るとは思えない。 ファイルの中身をメモリに読み込むのが『余計』だと考えてるなら、これは余計じゃないんで効率化は無理 10Mずつ読み込むとか、そういう解決方法しかないと思うよ 結論:何をしてるのか、何がしたいのか、が分からない。今やってることをそのまま書いた方が分かりやすいかもよ
167 名前:162 mailto:sage [2008/09/12(金) 01:52:35 ] >>164 >>165 (同じ人?) ありがとうございます。
168 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 02:16:59 ] inodeでぐぐる?
169 名前:162 mailto:sage [2008/09/12(金) 02:25:10 ] 続けて質問してしまいますが、お願いします。 typeid()を使っているのですが、 typeid(hoge).name()で帰ってくる文字列が本やサイトに載っているのと異なっています。 例えば、 int i; -> i string s; -> Ss vector<int> vi; -> St6vectorIiSaIiEE vector<vector<double> > vvd; -> St6vectorIS_IdSaIdEESaIS1_EE complex<int> ci; -> St7complexIiE class Test0{}; Test0 t0; -> 4Test という感じ(一部省略)になります。 なんとなく分かるのですが、完全には解読できません。 この表記の見方、もしくは解説サイトなどありましたら教えて下さい。
170 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 02:28:23 ] typeid(Type).name()はoperator=とoperator!=で比較するしか 意味がない。 返される文字列は処理系依存。だが異なる型は異なる文字列 になる事は保証されている。
171 名前:169 mailto:sage [2008/09/12(金) 03:03:42 ] >>170 ありがとうございます。 具体的に書いた方が良さそうなので、書きます。 今、 template<typename T> class Matrix{ private: vector<vector<T> > _matrix; ・・・ }; のような行列クラスを作成しているのですが、 行列を要素に持つ行列を考慮したいので、 T が Matrix<int> というのも考えられます。 行列の中身を参照(表示)するときに、 行列の要素の型がintやdoubleなどの場合と、 行列の要素の型がMatrixの場合とを区別するために、 typeid()を使って,Tの構造を知ろうと思っています。 なので、name()をうまく解読できればと思いました。 方向性自体ダメですか?
172 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 03:11:10 ] ダメダメだね。name()はそんなことに使えない。 それこそ"type0", "type1"みたいな連番でも構わないわけだし。 素直に特殊化で頑張ってください。
173 名前:169 mailto:sage [2008/09/12(金) 03:47:41 ] >>172 ありがとうございます。 便利なの見付けたと思ったのですが、 >それこそ"type0", "type1"みたいな連番でも構わない その通りですね。 出直してきます。m(_ _)m
174 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 06:03:33 ] PERL RUBY Pythonをcから使いたいとき、どれが最も必要なファイルが少なく済みますか? 合計のファイルサイズが小さい順に押してください。
175 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 06:38:55 ] IronPythonにきめました。C++(API)もC$(NET)も利用できてコンパイルして実行ファイルが作れるらしいです。
176 名前:デフォルトの名無しさん [2008/09/12(金) 06:40:46 ] よかったですねkがんばってください
177 名前:90 [2008/09/12(金) 07:46:35 ] >>127 名前をつけるという方法で解決はできるのですが、 何かライブラリとかで提供されてきたstructとかだったら、勝手に型名をつけられないなぁと。 それか、型名無しだから名前を勝手につけても問題はない・・・ということになるのでしょうか。 その後いろいろやってたらunionを入れなくても、 struct中に2つ以上の型名のないstructをいれても2つめからのstructで>>90 と同じエラーになります。 エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。
178 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 08:06:41 ] DuplicateHandleの効果を教えてください。コピーを作らずにsi.hStdOutput = hd;と書くと出力されません。 f(){ HANDLE hd, he; hd = CreateFile("out.dat", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 ); DuplicateHandle(GetCurrentProcess(), hd, GetCurrentProcess(), &he, 0, 1, DUPLICATE_SAME_ACCESS); STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = he; PROCESS_INFORMATION pi; pi.hProcess = NULL; CreateProcess(NULL, "xdoc2txt a.doc", NULL, NULL, TRUE,0, NULL, NULL, &si, &pi ); WaitForSingleObject(pi.hProcess,INFINITE);}
179 名前:デフォルトの名無しさん [2008/09/12(金) 10:08:18 ] C++についての質問です。 ファイルを単純にコピーするとき、次の二つの実行速度はどっちが速いですか? //A ifstream fl_in("file1.txt", ios::in| ios::binary); ifstream fl_out("file2.txt", ios::out| ios::binary); char ch_get; while(!file1.eof()){ ch_get= fl_in.get(); if(!file1.eof()) fl_out.put(ch_get); } //B copy(istreambuf_iterator<char>(fl_in), istreambuf_iterator<char>(), ostreambuf_iterator<char>(fl_out)); copyは<algorithm>のです。 もっと高速に処理できるコードがあったら、そちらもよろしくお願いします。
180 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 10:09:54 ] 実測したわけじゃないが、Cライブラリのfread fwriteを使った方が速いらしい。
181 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 10:13:36 ] WindowsAPIが最速なことは間違いない。 Cはコスト掛けた上で最後にAPIを呼ぶ。
182 名前:デフォルトの名無しさん [2008/09/12(金) 10:15:28 ] ありがとうございます。 今度試して見ます。 fread,fwriteで思い出しましたが、c++のread, write関数との速度の違いはいかがでしょうか? 自分としては、freadやfwriteは、使い勝手の面で、境界越えしそうで怖いのですが。
183 名前:デフォルトの名無しさん [2008/09/12(金) 10:40:48 ] Vistaのイベントログに重大のクラスのイベントを書き込みたいです。 ReportEventで何を渡せばいいのでしょうか? 調べたのですが重大だけが見つかりませんでした。。。
184 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 10:49:23 ] fread/fwriteは移植用で実際はネイティブのAPIを呼ぶ。 ネイティブAPIを避けるため、普通ならfwriteを呼ぶのがいい。
185 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 10:53:38 ] Windowsでスクロール付きのテキスト表示エリアを簡単に作れるライブラリはありませんか?
186 名前:デフォルトの名無しさん [2008/09/12(金) 10:55:06 ] ありがとうございます。 fwriteでがんばります。
187 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 12:16:10 ] >>185 エディットコントロール
188 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 12:26:10 ] トンクス
189 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 17:10:52 ] >>186 fread、fwriteは2Gまでの制限があるから注意な
190 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:50:04 ] >>178 CreateFileするときにSECURITY_ATTRIBUTESで継承を許可(bInheritHandle = TRUE)にしておけば、 CuplicateHandleは要らないはず。
191 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 04:30:38 ] >>185 C++Builder使え
192 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:00:13 ] 2の26乗 (=N) 個の配列どおしの要素を掛けた物の総和を求めたいと思います。 (a,b,c・・・) (x,y,z・・・)とするとき、ax + by + cz + ・・・です。 これを4スレッドに分けて計算したら早くなりますでしょうか? 0〜N/4、 N/4+1〜・・・と分割して和を求めるってことです。
193 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:01:25 ] シングルコアでやったらまず間違いなく遅くなる
194 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:35:11 ] >>192 寧ろ4で割った余りが0,1,2,3でスレッドを分けた方が早いかもよ。 特にIntelの2コアや4コアの場合。
195 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 19:59:55 ] >>192 Pen4,Core2Duo,AMD系ではおそらく逆に遅くなる Core2Quadなら上手くやれば早くなる 環境依存だけどプロセスの優先度上げて、 コンテキストスイッチ減らした方が良いんじゃない?
196 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 20:47:34 ] >>192 スレッド数が物理コア数以下なら速くなるはずだけど その処理内容だとメモリアクセスがボトルネックになりそう。 SIMDなんかがある環境ならそれ使うようにオプション指定するなり インラインアセンブラ使うのもいいんじゃないか。
197 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 20:48:36 ] 1コアです。 のろくなります。 分割します。 #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 110108864 char *a,*b; unsigned int s[4]; unsigned int f(void){unsigned int sum=0; for(int n=0;n<N;n++)sum+=a[n]*b[n];return sum;} unsigned WINAPI g0(void*){for(int n=0;n<N/2;n++)s[0]+=a[2*n]*b[2*n];return 0;} unsigned WINAPI g1(void*){for(int n=0;n<N/2;n++)s[1]+=a[2*n+1]*b[2*n+1];return 0;} unsigned int g(void){ s[0]=s[1]=0; HANDLE hd[2]; hd[0]=(HANDLE)_beginthreadex(NULL, 0, g0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, g1,NULL, 0 ,NULL); WaitForMultipleObjects(2, hd, TRUE, INFINITE); CloseHandle(hd[0]);CloseHandle(hd[1]); return s[0]+s[1];} unsigned WINAPI h0(void*){for(int n=0;n<N/4;n++)s[0]+=a[4*n+0]*b[4*n+0];return 0;} unsigned WINAPI h1(void*){for(int n=0;n<N/4;n++)s[1]+=a[4*n+1]*b[4*n+1];return 0;} unsigned WINAPI h2(void*){for(int n=0;n<N/4;n++)s[2]+=a[4*n+2]*b[4*n+2];return 0;} unsigned WINAPI h3(void*){for(int n=0;n<N/4;n++)s[3]+=a[4*n+3]*b[4*n+3];return 0;} unsigned int h(void){ s[0]=s[1]=s[2]=s[3]=0; HANDLE hd[4]; hd[0]=(HANDLE)_beginthreadex(NULL, 0, h0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, h1,NULL, 0 ,NULL); hd[2]=(HANDLE)_beginthreadex(NULL, 0, h2,NULL, 0 ,NULL); hd[3]=(HANDLE)_beginthreadex(NULL, 0, h3,NULL, 0 ,NULL); WaitForMultipleObjects(4, hd, TRUE, INFINITE); return s[0]+s[1]+s[2]+s[3];}
198 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 20:49:36 ] main(){ cout<<"初期値設定中・・・\n"; a=new char[N] ; b=new char[N] ; int n,cl; for(n=0;n<N;n++){int x=rand(); a[n]=(char)(x&15); b[n]=(char)((x>>4 )&15); } cout<<"計測開始・・・\n"; cl=GetTickCount(); cout<<"1 スレッド 計="<<f()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl; cl=GetTickCount(); cout<<"2 スレッド 計="<<g()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl; cl=GetTickCount(); cout<<"4 スレッド 計="<<h()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;}
199 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:02:22 ] 手間の掛かる処理にしてみました。浮動小数点の割り算。2スレッドが早くなりました。 #include <iostream> #include <windows.h> #include <process.h> using namespace std; #define N 10097152 double *a,*b; double s[4]; double f(void){s[0]=0; for(int n=0;n<N;n++)s[0]+=a[n]/b[n];return s[0];} unsigned WINAPI g0(void*){for(int n=0;n<N/2;n++)s[0]+=a[2*n]/b[2*n];return 0;} unsigned WINAPI g1(void*){for(int n=0;n<N/2;n++)s[1]+=a[2*n+1]/b[2*n+1];return 0;} double g(void){ s[0]=s[1]=0; HANDLE hd[2]; hd[0]=(HANDLE)_beginthreadex(NULL, 0, g0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, g1,NULL, 0 ,NULL); WaitForMultipleObjects(2, hd, TRUE, INFINITE); CloseHandle(hd[0]);CloseHandle(hd[1]); return s[0]+s[1];} unsigned WINAPI h0(void*){for(int n=0;n<N/4;n++)s[0]+=a[4*n+0]/b[4*n+0];return 0;} unsigned WINAPI h1(void*){for(int n=0;n<N/4;n++)s[1]+=a[4*n+1]/b[4*n+1];return 0;} unsigned WINAPI h2(void*){for(int n=0;n<N/4;n++)s[2]+=a[4*n+2]/b[4*n+2];return 0;} unsigned WINAPI h3(void*){for(int n=0;n<N/4;n++)s[3]+=a[4*n+3]/b[4*n+3];return 0;} double h(void){ s[0]=s[1]=s[2]=s[3]=0; HANDLE hd[4]; hd[0]=(HANDLE)_beginthreadex(NULL, 0, h0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, h1,NULL, 0 ,NULL); hd[2]=(HANDLE)_beginthreadex(NULL, 0, h2,NULL, 0 ,NULL); hd[3]=(HANDLE)_beginthreadex(NULL, 0, h3,NULL, 0 ,NULL); WaitForMultipleObjects(4, hd, TRUE, INFINITE); return s[0]+s[1]+s[2]+s[3];}
200 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:03:09 ] main(){ cout<<"初期値設定中・・・\n"; a=new double[N] ; b=new double[N] ; int n,cl; for(n=0;n<N;n++){int x=rand(); a[n]=1+(double)(x&15); b[n]=1+(double)((x>>4 )&15); } cout<<"計測開始・・・\n"; cl=GetTickCount(); cout<<"1 スレッド 計="<<f()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl; cl=GetTickCount(); cout<<"2 スレッド 計="<<g()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl; cl=GetTickCount(); cout<<"4 スレッド 計="<<h()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;}