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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
231 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:12:39 ] >>225 list だと、こうじゃなかったっけ? ごめん。調べないで書いてる。 for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) { if ((*it)->ic == 1) { delete *it; mylist.erase(it++); } else { ++it; } }
232 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:37:02 ] erase したイテレータを++するのは未定義動作じゃなかったか?
233 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:45:29 ] >>232 mylist.erase(it++); はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。 listのeraseでは消したイテレータ以外は無効にならないから。
234 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:04:13 ] 戻り値が次の要素じゃなかったっけ? it = mylist.erase(it);
235 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:41:25 ] listなら++でも安全だとしても、別なコンテナに変えられる可能性も 考慮して、戻りを代入するべきでは。
236 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:10:33 ] >>235 set,multissetとかだとeraseの戻り値の型がvoidだったりするから、 it == hoge.eraseが書けないときもある。 vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も 考慮してit++にするべきでは。
237 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:53:20 ] >>236 vectorならit++は使えない。
238 名前:229 [2008/09/14(日) 22:53:23 ] >>230 ありがとうございます。 <<のオーバーロードで修正がベスト何ですかね。
239 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:26:15 ] vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end) とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?
240 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 02:15:17 ] vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。 mapやsetはeraseの戻り値がvoidなので、it++するしかない。 シーケンスコンテナと連想コンテナの取り替えを想定するのは 無理があるって事だな。
241 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 09:14:33 ] effective STL に同じような話がある
242 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:28:05 ] Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど VC++が入ってないPCでも実行する方法を教えてください。
243 名前:207 mailto:sage [2008/09/15(月) 10:29:22 ] >>225 氏の方法でも >>231 氏の方法でもうまくいきました。 ありがとうございます。 「別なコンテナに変える」ということの意味はまだ良くわからないので、 引き続き勉強します。 >>241 > effective STL に同じような話がある なるほど、早速ポチりました。
244 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:47:02 ] >>242 エラーが出ないように修正する
245 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:53:17 ] >>244 VC++がインストールされているPCではエラーがなく実行できます。
246 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:54:07 ] >>242 まずはエラーの内容を示さないと・・・・ MFC7のdllがないとかか。
247 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:59:51 ] SideBySide絡みじゃ? MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも
248 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:49:58 ] >>246 ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。
249 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:52:21 ] 何で初心者って「エラーが出ます」「うまくいきません」 「動きません」って言って具体的なこと書かないんだろうな。
250 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:53:18 ] >>248 本当にメッセージそれだけ?
251 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:57:28 ] >>250 今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。 VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。
252 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:01:39 ] >>251 1. VC++のバージョンにあうランタイムライブラリをインストールさせる。 www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ja www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ja 2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
253 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:22:30 ] >>251 基本的によく分からないエラーが出たら、 スクリーンショットを撮る事。 そのプログラムのプロジェクトプロパティの 共通言語ランタイムサポートが「使用しない」以外なら .NET Framework Runtime をインストールする必要がある。 MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。 構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
254 名前:242 mailto:sage [2008/09/15(月) 12:26:45 ] 調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。 ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。 今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。 >>253 今はエラーを確認できないのでスクリーンショットも撮れません。
255 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:30:06 ] pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか
256 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:31:07 ] >>254 >それでいいのでしょうか。 お前、>>252-253 を読んだ上で言ってるの?
257 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:00 ] STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。 www.stlsoft.org STLSoftの中身 ACESTL (acestl.org ). ATLSTL (atlstl.org ). COMSTL (comstl.org ). .netSTL (dotnetstl.org ). InetSTL (inetstl.org ). MFCSTL (mfcstl.org ). UNIXSTL (unixstl.org ) WinSTL (winstl.org ). もうなんだか至れり尽せりですね。 自分がやっているプロジェクトの意味が無いように思えてきた・・・。おrz!!! d.hatena.ne.jp/studiokingyo/20061223
258 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:32 ] >>255 どういうソースで出るんだ?
259 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:53:36 ] >>252 できればほかのパソコンに何かインストールする方法は避けたいです。 >2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。 よくわかりませんでした。もう少し詳しく教えてください。 >>253 共通言語ランタイムサポートを使用しないになっています。 >MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。 > >構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。 この設定でコンパイルすると 1>MSVCRT.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。 1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Othello\Debug\Othello.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と、なってコンパイルできません。 >>256 調べてる間にレスがきてしまったので失礼しました。
260 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:55:16 ] >>257 自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い 問題が起きたとき、自力で解決出来んだろう
261 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:02 ] >>259 main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・ WinMain() で始まる windows プログラムなのに、 そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい
262 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:51 ] >>259 「/MDd」を「/MT」にしてないか? 「/MDd」なら「/MTd」だぞ。MD→MTなんだから。 あとプロジェクトプロパティの左上に構成ってあるだろ。 デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。 まぁ、リリース版だけでも良いと思うけど。
263 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:06:10 ] >>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ
264 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:03:24 ] 2chでスレたてて盛り上げていこうぜ > STLport 日本語の解説サイトも作る
265 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:04:29 ] STLport > STLsoft ね。
266 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:29:55 ] >>258 こんな感じだそうです。 pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。
267 名前:266 mailto:sage [2008/09/15(月) 14:30:56 ] 追記:その状態になってもダイアログを出したくないのです
268 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:54:55 ] double d; d = pow(0.0, -2.1); std::cout << d << std::endl; d = pow(-2.1, 0.1); std::cout << d << std::endl; d = pow(10e10, 100); std::cout << d << std::endl; --------------- 1.#INF -1.#IND 1.#INF 再現出来ないな。何が違うんだろう。
269 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 15:01:17 ] ウィンドウプロジェクトにするとなります。
270 名前:デフォルトの名無しさん [2008/09/15(月) 16:19:19 ] stlの質問です。 下記のプログラムを実行するとhoge関数が呼ばれて戻ってきた時には、TESTメンバのstrの領域はデストラクタで、 解放されてしまってます。この場合は、main()の最後でlistのstrを解放するしかないのでしょうか? もっと別のやり方があれば教えて下さい。宜しくお願いします。 #include <string> #include <list> struct TEST { std::string *str; TEST() : str(NULL) {} ~TEST() { delete[] str; } }; void hoge(std::list<TEST> &list) { TEST test; test.str = new std::string[10]; list.push_back(test); } int main() { std::list<TEST> list; hoge(list); // list.str不適切なポインタ return 0; }
271 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:02:15 ] C++で数値計算を行なっていて、 計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。 上記とは一切関係ない部分のバグを取って再度実行したら、 ファイルへの出力が途中からされなくなってしまいました。 1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。 出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。 このような症状の場合、どのような原因が考えられるか教えていただけませんか?
272 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:12:59 ] ・ストレージの空き容量が不足している。
273 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:20:56 ] ・ストリームをフラッシュしていない(勿論、クローズしていない)。
274 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:12 ] そんなわけ・・・・マジだ、吊ってきます orz エラーを出す方法とかありますか?
275 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:27 ] 380回のあたりで異常な文字列を吐いてしまって fstreamがエラー状態になっているとか。
276 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:33 ] >>270 TESTにきちんとコピーコンストラクタとoperator =を設ける。
277 名前:271 mailto:sage [2008/09/15(月) 17:25:52 ] >>274 は>>272 に対してのレスです。 申し訳ない
278 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:34:40 ] of.exceptions(badbit| failbit)としておけば、例外投げてくれる。 例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。
279 名前:242 mailto:sage [2008/09/15(月) 17:40:36 ] ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。 皆様ありがとうございます。
280 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:53:59 ] >>270 ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。
281 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:20:58 ] このプログラムで値が変わるのはなぜですか? main(){ char a[]="マルチバイト文字列 mbs の sz 文字分をワイド文字列に変換します。"; wchar_t b[300]; cout<<strlen(a)<<endl; MultiByteToWideChar(CP_ACP, 0, a, n, b, 300); cout<<wcslen(b)<<endl; }
282 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:28:54 ] 自己解決しました
283 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:46:12 ] 自己解決しませんでした。 値が変わります? なぜですか? int m,n; char a[]="マル"; wchar_t b[300]; n=strlen(a); mbstowcs(b,a,n); m=wcslen(b); wcstombs(a,b,m); cout<<n<<" "<<m<<" "<<strlen(a)<<endl;
284 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:50:03 ] 自己解決しました
285 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:08:59 ] chatとw_charの変換はWindows APIのほうが鈍いようです。 #include <windows.h> #include <time.h> #include <iostream> using namespace std; main(){ int m,n,r,k; char a[500]="マクロの動作は、有効になっているコンパイラ ディレクティブによって異なる。変換元と変換先の型が同じ場合は変換は行われない。コンパイラ ディレクティブでは、T および OLE を次のように変換する。"; wchar_t b[500]; n=strlen(a); mbstowcs(b,a,n+1); m=wcslen(b); wcstombs(a,b,m+1); int cl=clock(); for(k=0;k<1000000;k++){ r=MultiByteToWideChar(CP_ACP, 0, a, n, b, 500); b[r]=0; r=WideCharToMultiByte(CP_ACP, 0, b, m, a, 500, NULL, NULL ); a[r]=0;} cl=clock()-cl; cout<<cl<<endl; for(k=0;k<1000000;k++){ mbstowcs(b,a,n+1); wcstombs(a,b,m+1);} cl=clock()-cl; cout<<cl<<endl;}
286 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:34:51 ] MultiByteToWideCharの使い方が間違っているからです
287 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:44:31 ] 正しい使い方はどうすればできますか
288 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 10:03:56 ] MSDNをよく読む
289 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:28:05 ] サイズが決まっていないchar*型の文字列が10個ていどあって 一致する文字が存在するか見つける高速な方法はSTLのmapですか。 一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。
290 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:32:39 ] Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。 Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による 擬似 Trieといった 他の Trie の実装に比べ高速に動作します. オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが, Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています. chasen.org/~taku/software/darts/
291 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:49:12 ] hashmapはそれほど速くないです。 #include <windows.h> #include <iostream> #include <map> #include <hash_map> #include <string> #include <vector> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);} int n=0; string searchword(strgen()); #define N 500000 // 空のループ cl=timeGetTime();for(i = 0; i < N; i++) ;cl=timeGetTime()-cl; cout<<cl<<endl; // STLmap cl=timeGetTime(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl; // STLport_hashmap cl=timeGetTime(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl; // Vector cl=timeGetTime(); for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; cl=timeGetTime()-cl; cout<<cl<<endl;}
292 名前:十分速いじゃん… mailto:sage [2008/09/16(火) 16:25:57 ] #include <iostream> #include <map> #include <stlport/hash_map> #include <string> #include <vector> #include <boost/progress.hpp> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);} #define BEGIN { boost::progress_timer t; #define END } int n=0; string searchword(strgen()); #define N 500000 BEGIN;for(i = 0; i < N; i++) ;END; // 空のループ BEGIN; for(i = 0; i < N; i++) stlmap.find(searchword); END; // STLmap BEGIN; for(i = 0; i < N; i++) hashmap.find(searchword); END; // STLport_hashmap BEGIN; // Vector for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; END;} g++ hashmap.cxx -I /usr/include/stlport/ -lstlport -O2 % ./a.out |tr "\n" " " 0.00 s 0.66 s 0.17 s 4.95 s
293 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 16:35:30 ] 訂正: -O2 -> -O0
294 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:15:34 ] unordred_mapのがいいよ多分
295 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:35:55 ] unordred_mapきはなかなかですね。 #include <iostream> #include <map> #include <hash_map> #include <string> #include <vector> #include <unordered_map> #include <time.h> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; tr1::unordered_map<string,int> unorderedmap; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++){int r=rand(); str+=(char)(97+r&3)+(char)(97+(r>>2 )&3);} return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 10000; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);unorderedmap.insert(p);} int n=0; string searchword(strgen()); #define N 500000 // 空のループ cl=clock();for(i = 0; i < N; i++) ;cl=clock()-cl; cout<<cl<<endl; // STLmap cl=clock(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=clock()-cl; cout<<cl<<endl; // STLport_hashmap cl=clock(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=clock()-cl; cout<<cl<<endl; //unorderedmap cl=clock(); for(i = 0; i < N; i++) unorderedmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;}
296 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:02:46 ] GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。 ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。 articles.blog79.fc2.com/blog-entry-25.html
297 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:16:27 ] なんにもいれずにそのコードを実行しようとしてるようなレベルですか?
298 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 19:07:44 ] VC2008のhash_mapはstdext名前空間に入ってるのか コンパイルできずにしばらく悩んだ それにしてもDinkumwareは遅い・・・
299 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:05:05 ] >>298 SP1当てればstd::tr1::unordered_mapも使えるよ。 もちろん性能は変わらないだろうけど。
300 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:59:36 ] ある変数に連動して、複数のvectorのサイズを変更できますか? 自分で増減させると面倒です。
301 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:02:40 ] 自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。
302 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:13:45 ] 関数って良いよね…… 造形が凄くソソるよね……
303 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:19:27 ] free(normal) functionより major(static) function objectの方がそそります^q^
304 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:34:32 ] もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな
305 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:44:47 ] a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。 このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。 どのように計算するのが速いでしょうか? 100項目程度あるとします。
306 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:47:04 ] つTaylor展開の低次の項
307 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:59:26 ] log経由で計算するのが速いと思うのですが・・・ >>306 C++のソース教えてください
308 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:02:51 ] 2つの場合に限定してたとえば (1+a)^x (1+b)^y の(x+y)乗根 をRとおくと (x+y)logR=xlog(1+a)+ylog(1+b)となり、logの計算量がどの位かかるかってことです。
309 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:23:15 ] >>307 ソースはめんどくさい x+y+z+... = Sとおくと、答えはおよそ1+(ax+by+cz+...)/S a<<1の時の近似式(1+a)^x=1+axを使って、a,b,c,...の1次の項だけ取り出すとこうなる logとか使うまでもない
310 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:23:31 ] POWよりLOGのほうが速かったです。 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 200000 main(){ int n, *a=new int[N]; float *x=new float[N]; for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;} double kei=0; for(n=0;n<N;n++) kei+=a[n]; double s=1; int cl=clock(); for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl; printf("%g %d\n",s,cl); s=0; cl=clock(); for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl; printf("%g %d\n",s,cl); }
311 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:28:26 ] >>309 トンクス 教えてもらったものを付け加えましたが、値がかなり違っています。 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 200000 main(){ int n, *a=new int[N]; float *x=new float[N]; for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;} double kei=0; for(n=0;n<N;n++) kei+=a[n]; double s=1; int cl=clock(); for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl; printf("%g %d\n",s,cl); s=0; cl=clock(); for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl; printf("%g %d\n",s,cl); s=0; cl=clock(); for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl; printf("%g %d\n",s,cl); }
312 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:29:33 ] はじめとaとxの関係が違っているところが原因かもしれません 見直してきます
313 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:34:13 ] 誤差は大体、max(a[n])^2*nくらいで抑えられるはず
314 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:42:10 ] あるていど近づきました。 aとxが逆になっていました。 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 200000 main(){ int n, *a=new int[N]; float *x=new float[N]; for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;} double kei=0; for(n=0;n<N;n++) kei+=a[n]; double s=1; int cl=clock(); for(n=0;n<N;n++)s*=pow(1.0+x[n],a[n]/kei); cl=clock()-cl; printf("%g %d\n",s,cl); s=0; cl=clock(); for(n=0;n<N;n++)s+=a[n]*log(1+x[n]); s/=kei; s=exp(s); cl=clock()-cl; printf("%g %d\n",s,cl); s=0; cl=clock(); for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl; printf("%g %d\n",s,cl); }
315 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:47:04 ] しかし、おかしい点があります。 教えてもらった式は、小さい項を無視しているので 値が小さくなるはずですが、計算結果が他より大きいです。 あと、(1+A) (1+B) (1+C) ・・・のS乗根は、なぜ上のような式になりますか? Aの値は1より大きいかも知れないですが・・・すると高次の項のほうが大きいかもしれません。 (Aはaxなどです。)
316 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:48:25 ] というか、100項目程度の話じゃなかったのか? N=200000でやったら、そりゃ誤差でかくなるの当たり前
317 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:51:31 ] 要するに求めるのは(1+a)^(x/S)(1+b)^(y/S)...≒(1+ax/S)(1+by/S)...≒1+ax/S+by/S+... a,b,...<<1なんだから、ax/S,by/,...S<<1だよな
318 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:54:25 ] トンクス そういうことですか わかりました
319 名前:デフォルトの名無しさん [2008/09/18(木) 13:14:45 ] 質問です。 1バイト文字列とwchar_t文字列 (特にwchar_t型文字で可)はどのように 変換できますか? 自作できますか?
320 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:18:48 ] >>319 wchar_tの文字コードは処理系依存であって、変換はcharの文字コードとwchar_tの文字コードを明確に示してくれないと答えようがない。 とりあえず使ってるコンパイラから書くってのはどう?
321 名前:デフォルトの名無しさん [2008/09/18(木) 13:20:55 ] VC++2008、BCC2009でおねがいします。
322 名前:デフォルトの名無しさん [2008/09/18(木) 13:26:38 ] すみません。なるべく速く変換したかったのですが、いい方法が自分で判りました。 すべての一語を標準関数で求めておいて、配列にいれておくという方法です。
323 名前:デフォルトの名無しさん [2008/09/18(木) 13:29:33 ] >>320 文字列を記録している文字コードにも依存しますか? SJIS、EUCなど、それぞれで変換関数は変わりますか?
324 名前:デフォルトの名無しさん [2008/09/18(木) 13:31:57 ] コンパイラのフォルダを検索しましたが、wcstombsのコードはみつかりませんでした。 本体はlibになっているとおもいます。
325 名前:デフォルトの名無しさん [2008/09/18(木) 13:38:18 ] かなり簡単であるとおもいました。 wchar_t → charはこれでいいみたいです。 wctomb(char *s, wchar_t wc) { *s = (char)wc; } libc.blog47.fc2.com/blog-entry-71.html
326 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:42:17 ] またまたご冗談を
327 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:58:54 ] 下記のようなプログラムで、どのように記述すれば、正常に動作するのでしょうか? やりたいことは、gushtUpdataAreaが配列であり、gulngUpdataAddressの示すアドレスに対してオフセットしたアドレスにgushtUpdataAreaの中身をコピーするというものです。 volatile static u_short *pushtWrAdr; volatile static u_short *pushtRdAdr; volatile static u_long ulngAdr; u_long ulngI; ulngAdr = (gulngUpdataAddress & 0x0fffffff) + 0x0c800000; pushtRdAdr = gushtUpdataArea; pushtWrAdr = (u_long *)ulngAdr; for(ulngI = 0; ulngI < gulngUpdataDataCount; ulngI++ ){ *pushtWrAdr++ = *pushtRdAdr++; } pushtWrAdr = (u_long *)ulngAdr;の部分の記述が悪いと思うのですが、どうすればいいでしょうか?
328 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:10:06 ] >>327 コンパイルできてる? gulngUpdataAddressの型が気になる。
329 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:13:42 ] memcpy(reinterpret_cast<char*>(gulngUpdataAddress) + オフセット量, gushtUpdataArea, sizeof(gushtUpdataArea));
330 名前:デフォルトの名無しさん [2008/09/18(木) 14:14:37 ] 結果が変です。こうでます。 なぜですか? a[] no size = 3 65 130 160 b[] no size = 3 65 130 160 #include <stdio.h> #include <stdlib.h> #include <string.h> main(){ unsigned char a[]="Aあ"; wchar_t b[10]; printf("a[] no size = %d\n",strlen(a)); for(int n=0;b[n]!=0;n++) printf("%d ",a[n]); mbstowcs(b,a,strlen(a)+1); printf("\n\nb[] no size = %d\n",wcslen(b)); for(int n=0;b[n]!=0;n++) printf("%d ",b[n]); }
331 名前:デフォルトの名無しさん [2008/09/18(木) 14:18:48 ] mbstowcsという関数のバグと思います。 これはなんの変換もしていないみたいです。 BCC2009です。