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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 22:47:35 ] 丘
3 名前:デフォルトの名無しさん [2008/09/06(土) 22:57:39 ] お勧めのC/C++開発環境ってありますか VC++ Express 2008は、C言語サポートがしょぼくて・・・。 リファクタリングとか、関数のテンプレートとか作れたり出来るとうれしいんですが
4 名前:デフォルトの名無しさん [2008/09/06(土) 22:59:04 ] ???
5 名前:デフォルトの名無しさん [2008/09/06(土) 23:01:39 ] メモリリークのチェックのために #define new ::new(_T(__FILE__), __LINE__) ってやってるんだが、 placement newを使いたいときはどうしたらいい?
6 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:03:35 ] コメントをつけるとき↓どれがいいですか? // ウィンドウクラスを登録 // ウィンドウクラスを登録する // ウィンドウクラスを登録する。 // ウィンドウ・クラスを登録 // ウィンドウ・クラスを登録する // ウィンドウ・クラスを登録する。 // ウィンドウのクラスを登録 // ウィンドウのクラスを登録する // ウィンドウのクラスを登録する。
7 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:06:36 ] // ウィンドウクラスの登録
8 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:07:44 ] Regist window class.
9 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:08:13 ] >>6 /* ウィンドウクラスを登録 BOOL RegisterWindowClass() { 〜〜〜 } */
10 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:09:40 ] >Regist window class. 生半可な知識もここまで来ると笑えるな。
11 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:10:39 ] みじかいのがいい
12 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:13:26 ] >>6 関数名で処理が自明なものにコメントは不要だよ。What じゃなくて、 Why を書くようにしたほうがいいね。
13 名前:5 mailto:sage [2008/09/06(土) 23:18:18 ] 事故解決?した。 ml.tietew.jp/cppll/cppll/thread_articles/9887#ar9888 これでやってみる
14 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:18:45 ] // 窓級登録
15 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:24:03 ] コメントとかいらねーだろ
16 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:26:23 ] 関数のコメントってみんなどんなのつけてるんだろう・・・
17 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:27:26 ] フリーのリソースエディタでお勧めのものはありますか。
18 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:29:26 ] /// <summary> /// ほげほげな関数 /// </summary>
19 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:34:35 ] >>18 C++だとあんまり役に立たないだろ。
20 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:35:37 ] Doxygenとかに食わせたりしないの?
21 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:41:31 ] >>8 Regist という英単語はない
22 名前:5 mailto:sage [2008/09/06(土) 23:44:19 ] >>13 だと new A()->f(); ってやったときにまずいことになることが発覚 だれかいい方法おせえて
23 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:46:29 ] >>5 ,22 そんなマクロは捨てて auto_ptr なり scoped_ptr, shared_ptr なりのスマートポインタを使う。
24 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:02:15 ] どうでも良い様な話なんですが、 RECT* SetRect(RECT* pDst, int x, int y, int width, int height) { pDst->left = x; 〜 } みたいなアサイン補助関数があるじゃないですか。 こういう関数は戻り値でデスティネーションを返して、 if(xend > SetRect(〜)->right) みたいな使い方ができるように なってますが、この戻り値って*で返すのと&で返すのと どちらにするべきなんでしょうね? どちらかに統一した方が見た目がすっきりしそうなのですが。
25 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:04:33 ] *で受け取るなら*で返す &で受け取るなら&で返す のがわかりやすいのではないか
26 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 04:52:27 ] SHA-1 のコリジョンの起こるサンプルデータを探しています. ググってみると MD5 の方はすぐに見つかったのですが,SHA-1 の方は衝突記事はたくさん引っ掛るのですが, 肝心のデータが見つかりません.どこにあるか知っていたら教えていただけないでしょうか?
27 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 10:54:48 ] 何故このスレで?
28 名前:26 mailto:sage [2008/09/07(日) 12:08:32 ] ごめん,ぶっちゃけ どのスレで聞いたら良いか分からなかったんだ. あと RFC についてた MD5 と SHA-1 アルゴリズムのサンプルが C で書かれていたから, このスレが比較的適当かと思ったんだ…. あの後調べてたんだけど SHA-1 で見つかったコリジョンは計算回数を減らした奴で,完全版のほうは コリジョンハッシュを生成する比較的現実的な計算量のアルゴリズムが見つかっただけなのかな? それともアルゴリズムが改良されてもう見つかっている?ここらへんがよくわからんとです….
29 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:11:21 ] CRCで十分
30 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:15:37 ] CPUのbit数以下であれば、計算コストは同じですか? (32bitCPUで、intの和算、charの和算等) もしそうであれば、前スレで64bitOSでも doubleは64bit、floatは32bitってあるけど、 これも同じことがいえますか? また、別件で、64bitOSでもintは32bitだったり64bitだったりとありますが、 intが32bitだとfloatと、64bitだとdoubleと共有したい場合、 何か方法ありませんか?
31 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:22:28 ] 計算時間は実測する
32 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:26:50 ] >>30 int 以下の大きさの整数の演算は int に変換してから行う、と規格で決められている。 だから計算コストは同じ。読み取りと書き込みのコストは違うかもしれないけどね。 double, float についてはこういう規則は決められてないんで、同じことは言えない。 特定の環境に限って実験結果があれば別だけど。 別件については「共有」の意味がわからんので、なんとも。
33 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:27:18 ] >>30 後者は共用体で。
34 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:36:36 ] >>32 サンクス 共有は共有体(union)のことです intのビットサイズがOSによって変わるなら intが32bitの場合はfloatと、 intが64bitの場合はdoubleと共有体を組むべきだと思ったんですが そのセオリーな方法はないのかと思いまして
35 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:40:50 ] >>34 <stdint.h>あるいは<boost/cstdint.hpp>のint32_t/int64_t
36 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:43:14 ] >>34 ×共有体 ○共用体
37 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:49:33 ] >>34 typedef 一段かませばいいんじゃない? どうやって int のビット数を判別するかは、環境依存のマクロがあればそれでもいいし、 C++ でテンプレートメタプログラミングしてもいい。
38 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:50:33 ] >>35 32bitOSでも64bitに固定しろってことなんですかね? せめてコンパイル環境によって 判定してくれるようなマクロを期待していたんですが >>36 そうでした、お恥ずかしい
39 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:58:27 ] 判定したいならこれでどう #include <limits.h> #if INT_MAX == 2147483647
40 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:09:20 ] template<std::size_t n> struct FP{ }; template<> struct FP<sizeof(float)>{ typedef float type; }; template<> struct FP<sizeof(double)>{ typedef double type; }; typedef FP<sizeof(int)>::type FPint;
41 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:21:49 ] >>39 にゃるほど >>37 ,40 テンプレートはクラスにしか使ったことなかったんですが 本来そういう使用方法だったんですね メタプログラミングについて勉強してきます ありがとうございました
42 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:50:40 ] >>41 いや、メタプログラミングは本来の使い方じゃないからね。 ライブラリ実装内で使うならともかく、他人に使わせるようなところで使うのは控えたほうがいいよ。
43 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 14:55:03 ] それでもマクロのifとか使うよりはTMPの方が余程健全に思えるわ
44 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:04:32 ] C++の事で質問です ::func()という表記はグローバルスコープで宣言されたfuncを明示的に呼び出す場合に使用するものだったと思いますが ::new Hogeという風にnew演算子に対して::を付けている場合はどういう動きになるのでしょうか?
45 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:20:36 ] グローバルなnew演算子を呼び出す。
46 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:20:48 ] >28 ■暗号技術【ROUNDsurea】■ ttp://pc11.2ch.net/test/read.cgi/tech/1180280982/
47 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 19:19:25 ] >17 フリーのリソースエディタ ResEdit www.forest.impress.co.jp/lib/stdy/program/progsupt/resedit.html
48 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:03:00 ] 皆さんの現場では、ウォーターフォール形式で開発しているところが多いのですか? これ以外のプロトタイプ形式とか経験ないのですが、なんか能率悪いと思う
49 名前:デフォルトの名無しさん [2008/09/07(日) 22:22:00 ] マ板に池
50 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:41:04 ] アドバイス頂きたいのですが、プログラム終了時まで値を保存する、なんかのデータ型のオブジェクトの配列を確保したいと思ったのですが、プログラム実行時まで配列の要素数が分からない性質のプログラムだとします。 その場合、C++だと char* ch[] とか int* dt[] だけでは storage size of `ch' isn't known (MinGW)のようにエラーになってしまうので、事前に配列を宣言しておくことができません。 なので、今回のように必要な数がプログラム実行時まで不明な同型のオブジェクトを動的に確保して、それらを一まとめにしておくには、配列ではなく次の要素へのポインタを格納したオブジェクトのリストを使うしかないでしょうか?
51 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:48:12 ] >>50 mallocで必要なサイズの領域を確保すればいいんでない
52 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:50:46 ] std::vector
53 名前:デフォルトの名無しさん [2008/09/08(月) 18:00:42 ] malloc (new) 以外に何か必要なの?
54 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 18:05:10 ] >>53 いいえ、std::vectorを使いましょう。
55 名前:50 mailto:sage [2008/09/08(月) 18:06:43 ] ありがごうございます。 >>51 プログラム開始から終了の間に、順々に必要な要素数が増えていく感じなので、最初に一気にmalloc とか new int [10] とかではダメだったのです。 >>52 そーか、要素がpriority_queueのポインタでして、ポインタってvectorに格納できないと勝手に思いこんでたんですが、調べてたらポインタでも大丈夫なんですね。 vecotrでなんとかなりそうです。ありがとうございましたm(_ _)m
56 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:01:16 ] まったくの初心者ですが #include <stdio.h> int main(){ int a,b,c; printf("足し算をします。計算する数字を2つ入力し下さい。\nなお数字の区切りには,を入力してください。\n"); scanf("&d , &d",&a,&b); c=a+b; printf("%d+%dは%dです。\n",a,b,c); return 0; } 何がいけないんですか?
57 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:13:59 ] >>56 &d → %d
58 名前:56 mailto:sage [2008/09/08(月) 19:17:55 ] >>57 ありがとうございます。
59 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:07:57 ] 次からは、「どんな結果になった(どんなエラーが出た)のか」 「それは自分の望みとどう違うのか」くらいは書いてくれよ。 >>56 のケースは、たまたまコトの次第がすぐ特定できる内容だからスムーズに行ったけども。
60 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:21:54 ] >>59 すみません、今後気を付けます。
61 名前:デフォルトの名無しさん [2008/09/09(火) 19:31:39 ] hStdOutputの出力を、char型配列にするにはどうしたらいいですか?
62 名前:デフォルトの名無しさん [2008/09/09(火) 19:45:58 ] すなわちメモリのハンドルが取得したいんです
63 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 19:53:38 ] そういうことは出来ません。
64 名前:デフォルトの名無しさん [2008/09/09(火) 19:53:38 ] GlobalAllocでできることがわかりました。 ところでVirtualAllocなど種類がありますがどんな違いがありますか?
65 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 20:01:07 ] マニュアルやAPIをちゃんと読みましょう。
66 名前:デフォルトの名無しさん [2008/09/09(火) 20:09:20 ] みつけたよ konuma.txt-nifty.com/blog/2006/03/heapallocvirtua_5d49.html ・ HeapAlloc 異なるメモリブロックを多数作成するときに利用します。パフォーマンスを最大にしたい場合、 同じブロック長のみで構成したヒープハンドルを複数作成する必要があります。 ・ VirtualAlloc 多量のデータを格納する空間を用意する必要があるが、一部は利用しないかもしれない場合に 重宝します(ハッシュテーブル等)。部分的に領域の確保を遅らせることが出来ます。 多量のメモリを確保する場合は基本的にこの関数に頼るべきです。 ・ LocalAlloc/GlobalAlloc どちらもWin16時代の名残です。Win32APIが要求しない限り、新規にこれを採用する理由はありません。 ・ malloc (new) データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりします。 またマルチスレッドに対する耐性があるバージョンも存在し、賢いですが、その分最も遅いです。一般的には最後にHeapAllocを呼び出す結果になります。
67 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 08:46:26 ] 個人のブログをソースにするのはどうかと、MSDN読めよ。
68 名前:デフォルトの名無しさん [2008/09/10(水) 12:38:43 ] 出力が変になります。 「あ」の前にゴミがつきます。どこがだめかわかりますか char *sh=new char[1024]; lstrcat(sh, "あいうえおかき"); printf("%s\n", sh); delete sh;
69 名前:デフォルトの名無しさん [2008/09/10(水) 12:47:08 ] 自己解決しました char *p=new char[1024]; strcpy(p,"あいうえ"); printf("%s\n", p); delete p;
70 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 12:48:06 ] >>68 lstrcatは文字列を末尾に結合する関数。 newで確保した領域の中身は不定。 だからlstrcatはsh内の最初の'\0'を探してその位置に"あいうえおかき"を挿入する。 予めsh[0]に'\0'を入れておけば意図どおりの動作はする。
71 名前:デフォルトの名無しさん [2008/09/10(水) 12:50:53 ] >>70 サンクス
72 名前:デフォルトの名無しさん [2008/09/10(水) 13:50:46 ] メモリ確保の方法別に速度を測ったのですが、違いがでません。どうしたら差のでる比較になりますか? #include <windows.h> #include <iostream> using namespace std; #define memsize 32400000 #define T GetTickCount() int main(){ int s[4][3]; memset(s, 0, 48); for(int n=0;n<10;n++){ int cl=GetTickCount(); HANDLE hHeap = HeapCreate(NULL, 0, 0); char *p0 = (char*) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, memsize); cl=T-cl;s[0][0]+=cl; cl=T; memset(p0, 97, memsize); cl=T-cl; s[0][1]+=cl; cl=T; HeapFree(hHeap, NULL, p0); HeapDestroy(hHeap); cl=T-cl; s[0][2]+=cl; cl=T; HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0, memsize, "MEMTEST"); char *p1 = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, memsize); cl=T-cl; s[1][0]+=cl; cl=T; memset(p1, 97, memsize); cl=T-cl; s[1][1]+=cl; cl=T; UnmapViewOfFile(p1); CloseHandle(hShare); cl=T-cl; s[1][2]+=cl; cl=T; char *p2 = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE); cl=T-cl; s[2][0]+=cl; cl=T; memset(p2, 97, memsize); cl=T-cl; s[2][1]+=cl; cl=T; VirtualFree(p2, memsize, MEM_DECOMMIT); cl=T-cl; s[2][2]+=cl; cl=T; char *p3=new char[memsize]; cl=T-cl; s[3][0]+=cl; cl=T; memset(p3, 97, memsize); cl=T-cl; s[3][1]+=cl; cl=T; delete p3; cl=T-cl; s[3][2]+=cl; } printf("HeapAllocの速度の合計 確保%d コピー%d 解放%d\n",s[0][0],s[0][1],s[0][2]); printf("FileMappingの速度の合計 確保%d コピー%d 解放%d\n",s[1][0],s[1][1],s[1][2]); printf("VirtualAllocの速度の合計 確保%d コピー%d 解放%d \n",s[2][0],s[2][1],s[2][2]); printf("newの速度の合計 確保%d コピー%d 解放%d \n",s[3][0],s[3][1],s[3][2]);}
73 名前:72 [2008/09/10(水) 14:01:24 ] メモリ300Mの確保では、newが最速という結果が出ました。なぜかコピーが速いです。
74 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:07:37 ] それぐらいこだわりを入れるなら、ポインタを使ったほうがいいよ。
75 名前:デフォルトの名無しさん [2008/09/10(水) 14:25:45 ] いやいや、ポインタは一回はまると難しすぎるから初心者には無理無理w
76 名前:72 [2008/09/10(水) 14:27:12 ] すみません質問です。これは途中でerrで停止するのですが原因わかりますか? #include <windows.h> #include <iostream> using namespace std; #define memsize 200000000 int main(){ for(int n=1;n<100;n++){ printf("%d回目の確保\n",n); char *q = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE); q[memsize-1]=0; VirtualFree(q, memsize, MEM_DECOMMIT); HANDLE hd = HeapCreate(NULL, 0, 0); char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, memsize); if(p==NULL){cout<<"err\n";return -1;} p[memsize-1]=0; HeapFree(hd, NULL, p); HeapDestroy(hd);}}
77 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:28:12 ] っGetLastError
78 名前:デフォルトの名無しさん [2008/09/10(水) 14:32:24 ] 当たり前だ 10回行かないだろ 言語のまえにバソポンについて勉強汁
79 名前:72 [2008/09/10(水) 14:33:12 ] 自己解決しました。 VirtualFree(q, memsize, MEM_DECOMMIT);を VirtualFree(q, 0, MEM_RELEASE);にしたら成功しました。 でも、コミット解除と、領域解放の違いがわかりません。
80 名前:72 [2008/09/10(水) 14:40:54 ] 領域確保をHDD増設すると、コミットはFormatみたいなものですか? コミット解除は、NTFSをOSが管理できないFormatと見なすようなものですか?
81 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:46:47 ] >>79 説明すると長くなるからMSDNのメモリ管理に関する項目読んで。
82 名前:72 [2008/09/10(水) 15:05:56 ] >>81 みてみたのですがわかりませんでした。 別々のメモリを確保して、ハンドルも取得したい場合は、hdとheはどのように求めればいいですか? char *p = (char*)VirtualAllocEx(hd, NULL, memsize, MEM_COMMIT, PAGE_READWRITE); char *q = (char*)VirtualAllocEx(he, NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
83 名前:デフォルトの名無しさん [2008/09/10(水) 15:09:41 ] メモリ確保関数のうち、巨大な確保が一番成功しやすいのは、VirtualAllocExでしょうか? あと、CreateFileMapping(INVALID_HANDLE_VALUE,・・・)はVirtualAllocExと同じですか? メインメモリ。仮想記憶のどこかに確保されて性能に違いはありませんか?
84 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:11:53 ] ぜんぶMSDNにかいてあるから探せ
85 名前:デフォルトの名無しさん [2008/09/10(水) 15:38:40 ] どうやらメモリ確保の最大容量は、newが少ないほかは全部同じでした。大容量時は使いやすいやつでいいってことですかね #include <windows.h> #include <iostream> using namespace std; int main(){ printf("HeapAllocのメモリ確保耐久テスト\n"); unsigned int size=200000000; while(1){ HANDLE hd = HeapCreate(NULL, 0, 0); char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, size); if(p==NULL){printf("エラーサイズ = %d\n",size);break;} size*=1.05; HeapFree(hd, NULL, p); HeapDestroy(hd);} printf("\nVirtualAllocのメモリ確保耐久テスト\n"); size=200000000; while(1){ char *q = (char*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); if(q==NULL) {printf("エラーサイズ = %d\n",size);break;} size*=1.05; VirtualFree(q, 0, MEM_RELEASE);} printf("\nCreateFileMappingのメモリ確保耐久テスト\n"); size=200000000; while(1){ HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0,size, "MEMTEST"); char *r = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, size); if(r==NULL) {printf("エラーサイズ = %d\n",size);break;} size*=1.05; UnmapViewOfFile(r); CloseHandle(hShare);} printf("\nnewのメモリ確保耐久テスト\n"); size=200000000; while(1){ char *s=new char[size]; if(s==NULL) {printf("エラーサイズ = %d\n",size); break;} else printf("成功サイズ = %d\n",size); size*=1.05; delete s;}}
86 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:42:26 ] インデントを整えてくれ 醜い
87 名前:デフォルトの名無しさん [2008/09/10(水) 16:49:38 ] メモリが512Mしか乗っていなくて、確保できた最大サイズ1.6Gの読み書きテストをすると 動作がおそくなります。 物理メモリの確保サイズはせいぜい300Mという所とおもいます。 300M以上の場合、メモリや仮想メモリを使わずに、ファイルにマッピングしたいと思います。 アロケータというのを聞きますが、newやSTLを自前で管理するにはどうしたらいいですか?
88 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 16:59:53 ] newはoperator new アロケータは3番目のテンプレート引数に指定できる
89 名前:デフォルトの名無しさん [2008/09/10(水) 17:19:32 ] 自前のアロケータを使用してSTLを実用で使うまでにはどのような手順をとればいいかりません。 どうしたらいいですか
90 名前:デフォルトの名無しさん [2008/09/10(水) 17:21:59 ] templateを勉強し始めたのですがなぜエラーなのかわかりません。ご教授ください。 以下、該当ソースです。 typedef struct taghoge { int val1; union { struct { int val2_1_1; int val2_1_2; } val2_1; struct { long val2_2_1; } val2_2; } val2; } hoge; template <typename T> const char* func(T& temp) { return typeid(temp).name(); } void main() { hoge h; printf("h = %s\n", func(h)); printf("h.val1 = %s\n", func(h.val1)); printf("h.val2 = %s\n", func(h.val2)); printf("h.val2.val2_1 = %s\n", func(h.val2.val2_1)); // 1: OK printf("h.val2.val2_2 = %s\n", func(h.val2.val2_2)); // 2: NG } 1の箇所はコンパイルも実行もできます。2の箇所はコンパイルできません。 エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。 なぜこのようなコンパイルエラーになるのでしょうか。 環境は VC++2005 ExpressEdition + SP1 です。
91 名前:90 [2008/09/10(水) 17:25:57 ] unionのなかのstructに名前をつけたらコンパイルはとおりますが、 つけないで通す方法と、なぜ通らないかが理解したい箇所です。
92 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:27:50 ] >>89 どういうキーワードでググッた?
93 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:42:57 ] >>87 そんなことしたって速くならないよ。 それで速くなるならアプリはみんなそうするし、メモリを何Gも積む奴もいない。
94 名前:デフォルトの名無しさん [2008/09/10(水) 17:59:03 ] >>92 アロケータ、STLなどです。 >>93 他のOSなどのメモリを食い尽くさないためです。 実メモリが無くなれば他のソフトにまで影響が出ます。
95 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:30:22 ] >>90 2008 SP1では通ったぞ 規格的に適合してるかは知らん
96 名前:デフォルトの名無しさん [2008/09/10(水) 18:46:28 ] 一瞬で10Gの空ファイルを作るにはどうすればいいんですか?
97 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:47:06 ] 環境による
98 名前:デフォルトの名無しさん [2008/09/10(水) 18:49:02 ] 魔法使いに頼む
99 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:58:45 ] 空ファイルってサイズあるの?
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;}
201 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:06:39 ] 1CPUなのに2スレッドは凄い効果あります。およそ倍速出ます。 何度もメモリ読んでいるうちに、キャッシュが効いたりするのではと思い 一番最後にもう一度1スレッドを計算しても速度ははじめと同じでした。
202 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:13:22 ] >>201 こっちの方が早くね? 主な変更はローカル変数 x の導入 unsigned WINAPI g0(void*dummy){unsigned int x=0;char *p=&a[0],*q=&b[0];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[0]=x;return 0;} unsigned WINAPI g1(void*dummy){unsigned int x=0;char *p=&a[N/2],*q=&b[N/2];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[1]=x;return 0;}
203 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:23:58 ] BCC2009の速度最適化したときの数値は1700 clockくらいなんですが、 VC++2008の速度最適化したときの数値は250 clockくらいです。 BCCの速度が鈍いだけで。VC++2008だと、1スレッドが最も速かったです。 >>202 このようにしてもVC++では大して効果なく1スレッドが最速でした。1コアCPUなんですが。 unsigned WINAPI h0(void*){int m=0; double x=0; for(int n=0;n<N/4;n++){x+=a[m]/b[m];m+=4;} s[0]=x; return 0;}
204 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 21:44:21 ] CPUによって違うだろ。Core2使ってるの? Athlon64だとどちらも1スレッド>2スレッド>4スレッドとなる。 近々X2かPhenom買うのでそちらも試してみたい。
205 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:15:20 ] 初期のセレロンの1コア2GHzですよ
206 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:19:00 ] NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ
207 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 23:31:29 ] すみません、初心者な私に教えて下さい。 #include <list> using namespace std; class C { public: int ic; C (int c) { ic = c; } }; int main() { list<C *> mylist; mylist.push_back( new C(0) ); mylist.push_back( new C(1) ); mylist.push_back( new C(2) ); } こんな感じになってるとして、ic == 1 であるようなオブジェクトだけを、 ・list から削除し、 ・かつ delete する には、どのように書けばよいのでしょう。
208 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:32:06 ] #include <iostream> #include <list> #include <algorithm> using namespace std; class C { public: int ic; C (int c) { ic = c; } ~C() { cout << "~C" << endl; } }; struct delete_equal_to: public std::binary_function<C *, int, bool> { bool operator ()(C * p, int c) const { return (NULL != auto_ptr<C>(p->ic == c ? p: NULL).get()); } }; int main() { list<C *> mylist; mylist.push_back( new C(0) ); mylist.push_back( new C(1) ); mylist.push_back( new C(2) ); cout << mylist.size() << endl; mylist.remove_if(bind2nd(delete_equal_to(), 1)); cout << mylist.size() << endl; }
209 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:41:07 ] >>208 returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。 そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。
210 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:45:31 ] 「まだ」C++標準ではないのでね。
211 名前:207 mailto:sage [2008/09/14(日) 00:57:04 ] ぐっは、難しい…。 もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。 でも一つずつ読解してみます。 ありがとうございました!
212 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:59:34 ] ついでに言っておくけど mylist.push_back( new C(0) ); はpush_backに失敗するとnew C(0)したオブジェクトがリークする
213 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:15:33 ] 馬鹿な私に教えて下さい。 宿題板で、作って頂いたc++なのですが習ってない部分も出ていて、 よくわからず、困っています。 習っていない関数を使うのには、特に問題はないのですが 提出の際に説明書っぽいのをつけるのですが作成できず困っています。 例えば、この作業をするには?とか、オプションでこんな事も出来ます とかです。 スレチかもしれませんが、宜しくお願いします。 ちなみに、宿題板ではボロボロに言われ、ここにきました。 すいません。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7720.txt
214 名前:207 mailto:sage [2008/09/14(日) 01:18:29 ] なるほど…。 ということは、push_back() の引数として直接与えるんじゃなくて、 いったん C *p = new C(0); して、とりあえず mylist.push_back( p ); としてみて、 std::bad_alloc が投げられたらあきらめて delete する、 みたいな感じでしょうか。
215 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:22:08 ] >>213 そんなの一から読めって言うのかよ。 大まかな機能ぐらい説明しろよ。 お前が作らせたんなら分かるだろうが。 というか、宿題スレ池。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/
216 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:29:56 ] >>215 わかりました。宿題スレに行きます。 すいませんでした。ご迷惑お掛けしました。 ちなみに、内容はエンコドとデコドで テキストを吐き出し、オプションでプリントするみたいな感じです。 失礼しました。
217 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:33:41 ] 見たけどコメントついてるじゃん 無理せずに単位落としたら?
218 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:36:08 ] >>214 bad_allocが投げられたらdeleteする必要はないぞ。
219 名前:207 mailto:sage [2008/09/14(日) 01:42:05 ] >>218 了解しました。 どうもありがとうございます。
220 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 02:24:00 ] >>218 お前は読み間違えてる
221 名前:207 mailto:sage [2008/09/14(日) 02:29:02 ] >>220 あ、やっぱ delete(p); は必要ですか。 ていうか私が言葉足らずでした。
222 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:02:24 ] std::bad_alloc例外が投げられるという事はメモリ確保に 失敗しているのだから、deleteしたらまずいだろう
223 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:37:51 ] こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。 C *p = new C(0); try { mylist.push_back(p); } catch (std::bad_alloc const&) { delete p; throw; } auto_ptrでもいける。 std::auto_ptr<C> p(new C(0)); mylist.push_back(p.get()); p.release();
224 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:54:17 ] >>223 ああそういう意味かごめん そりゃdeleteは必要だわ newとpush_backを分離する事を前提とした 話なのね
225 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:23:11 ] >>207 さらっと、というか自分でループまわす構文はあるよ。 STL的ではないけど。 for(list<C *>::iterator it=mylist.begin(); it != mylist.end();) { // 1なら if((*it)->ic == 1) { delete *it; it= mylist.erase(it); } // 1じゃないなら else { ++it; } }
226 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:53:47 ] 確かboostだとこう書ける #include <boost/ptr_container/ptr_list.hpp> typedef boost::ptr_vector<C> list_type; //ポインタ指定しないが、中身はポインタになる list_type mylist; mylist.push_back( new C(0) ); 〜 for(list_type::iterator it = mylist.begin(); it != mylist.end();) { if(it->ic == 1) { it = mylist.erase(it); //消去動作で自動でdeleteされる } 〜 //あとは225と一緒 詳細 ttp://www.kmonos.net/alang/boost/classes/pointer_container.html
227 名前:207 mailto:sage [2008/09/14(日) 10:05:26 ] >>223 > こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。 あ、そうです。言葉足らずというのはそれが言いたかったのでした。 >>225 おおお、これです。こんな感じのを期待していました! > STL的ではないけど。 というのは、イテレーションしていく過程はあくまでイテレータにまかせるべきで、 「it= mylist.erase(it);」のような「つなぎかえ」(?)のようなことを外野がやるのは スマートじゃない、ということでしょうか。 うーむ、「実行時に動的に new したものを連結させておき、いらなくなったらそこだけ外す」 というのは良くあるケースかと思っていたのですが、もしかしてそもそもデータ構造の 選び方が間違ってますか……? >>224 氏も、 > newとpush_backを分離する事を前提とした > 話なのね とおっしゃってるし……。 >>226 いろいろな環境で動かしたいのでできれば boost は避けたいのですが、 でも勉強になります。特にリンク先の「etc」のところ。 ありがとうございます。
228 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:03:52 ] >>227 boostって静的リンク(?)だから大丈夫じゃないの?
229 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:44:57 ] ファイル分割+テンプレートの特殊化で悩んでいます。 Test.h(Testクラス ヘッダファイル) Test.cpp(Testクラス コンストラクタ) show.cpp(Test<T>::show() 関数) show1.cpp(Test<Test<int>>::show() show()のテンプレート特殊化) で構成されています。 show.cppにあるTest<T>::show()を アップしたファイルのように書き換えるとコンパイルエラーが発生してしまい、 これを解決できません。 よろしくお願いします。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7722.txt
230 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 17:58:13 ] Test.hのtemplate <typename T>class Testのメンバ関数として friend ostream &operator << (ostream &str, T const &val) { return str << val ; } C++はあまり使ったことはないけど、これでも追加するといいかも エロいひとの解答待つか
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です。
332 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:19:29 ] ロケール設定してないからだろ
333 名前:デフォルトの名無しさん [2008/09/18(木) 14:28:55 ] いい状態になりました #include <iostream> #include <locale.h> using namespace std; main(){ setlocale(LC_ALL, "japanese"); unsigned char a[]="Aあ"; wchar_t b[10]; printf("a[] no size = %d\n",strlen(a)); for(int n=0;a[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]); }
334 名前:デフォルトの名無しさん [2008/09/18(木) 16:43:57 ] while(true) { for(int i=0; i < 10; i++) ; } 上のやつってwhileが回っている間int型の変数分のメモリをどんどん食っていく? 開放せん?
335 名前:デフォルトの名無しさん [2008/09/18(木) 16:46:52 ] ローカル変数は有効範囲をすぎると無くなります
336 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 16:48:58 ] ファイルを指定すると更新日を表示するプログラム。 VCで動いてたコードをBCCに持ってきたら動かない現象が発生しました。 _fstatで0が返ってくるのに中身がちゃんと入ってないみたいです。 up01.ayame.jp/up/download/1221723883.c あれこれ弄ってみたけどうまくいかないorz
337 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:45:00 ] >>336 先頭にアンダーラインが付いてる関数は基本的に移植性がない。 BCCではPOSIX準拠の fstat() を代わりに提供している。 www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
338 名前:デフォルトの名無しさん [2008/09/18(木) 17:50:16 ] コンパイラ限定の命令は使わないようにしよう WinならAPIでいいだろう 無理なら、boostとかから探すとか
339 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:55:29 ] BCC って SEH の __try と __finary を実装しているのだろうか? まず表面化することないだろうけどね Win32例外
340 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 18:03:06 ] >>339 __tryは実装していない。__finallyのみ実装しているが これは__tryに対応するものではない。
341 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 18:07:07 ] >>340 ありがとー WinAPI だからといって必ずしも全て利用可能ではない ってことか ま、SEHはかなり特殊だから仕方ない部分ではあるな
342 名前:336 mailto:sage [2008/09/18(木) 18:22:33 ] >>337 ,338 stract _stat → stract stat _fstat() → fstat() に変更したらBCCでも問題なく動きました。ありがとうございます。 本業はマイコン/ラダー屋なのもあって、こういった部分はあまり気にする機会がなく勉強になりました。 Boost覗いてみました。 C++はBCBでも殆どC記述で組むような状態でオブジェクト指向が身についてないので サンプルを見ながら少しずつ導入していこうと思います。
343 名前:デフォルトの名無しさん [2008/09/18(木) 19:12:50 ] インクルードについて教えてください。 あるサンプルソースコードを入手して、 ~~.slnを実行して、デバッグしたら動きました。 ファイル入出力をしようと思って、 メイン関数が書いてある.cファイルで#include <iostream>とすると、 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':' 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。 が大量に出てきてしまいました。 インクルードしただけです。 何がいけなかったのでしょうか?
344 名前:デフォルトの名無しさん [2008/09/18(木) 19:16:53 ] cppにする
345 名前:345 [2008/09/18(木) 19:32:12 ] 344さん、ありがとうございます。解決しました。
346 名前:デフォルトの名無しさん [2008/09/18(木) 20:55:40 ] 親クラス ┣親クラス及び全ての子クラスで使うデバッグ用クラス ┣子クラス ┣子クラス ・ ・以下略 ・ ┗子クラス ┗子クラス という構成なんですが、子クラスがデバッグクラスにアクセスする、定石のような方法ってどういうのがありますか? 今自分がやっているやり方は、子クラスをnewで作成した後に、デバッグクラスのポインタをchildcls->SetDebugCls( cls )みたいな感じで渡しています。 しかしそれだと、全ての子クラスにセットしなくてはならず、非常に手間がかかっています。 実際はデバッグクラス以外にも、全ての子クラスで使いたいクラスが数個あります。 良い方法があったら教えてください
347 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 21:13:31 ] 単一のデバッグクラスのインスタンスを子クラスで共有するの?
348 名前:346 mailto:sage [2008/09/18(木) 21:25:09 ] >>347 はい。全ての子クラスで1つのデバッグクラスを操作したいのです。 デバッグでそれぞれのクラスのデータを集計し、統計のようなものを出したいデバッグクラスなので、単一の方向でお願いします。
349 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 21:32:10 ] 基底クラスのインナークラスとしてデバッグクラスを記述して、 基底クラスがそのデバッグクラスを包含するのじゃ駄目なの?
350 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 22:39:51 ] デバッグクラスをグローバルにすればいいだけじゃないの? それかシングルトン
351 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 22:58:27 ] 俺もグローバルで良いと思うけど。 まぁグローバル変数が嫌なら、 デバッグクラスかそれへのポインタの staticなメンバ変数でも用意すれば良いんじゃね?
352 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 23:12:31 ] 流れが分からん デバッグクラスが派生クラスにかかわらず単一なのは分かった そのインスタンスは1個だけ? それとも各インスタンスにつき1個ずつ? いずれにしてもデバッグクラスを基底クラスの内部クラスとして定義して、 基底クラスの通常のメンバなり、静的メンバなりにそのデバッグクラスのインスタンスを持たせればいいと思うが
353 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 23:27:15 ] 親クラスにstaticで持たせるのが正解の気がする まだエスパー歴が浅いから間違ってるかもしれんが
354 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 00:36:34 ] 文字の上下4ビットを入れ替える関数(RevChr)を作成しなさい。 ただし、RevChr関数の命令は1行で書かなくてはいけません。←ここ重要! できた人から、提出するように。 って問題だされたんだけど。
355 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 00:43:55 ] >>354 強引にやってみた。アホだ、俺。 (char>>4 + char<<4)
356 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 01:42:15 ] 優先順位・・・
357 名前:デフォルトの名無しさん [2008/09/19(金) 02:28:18 ] 319だけど、wcharをcharに変換する速度は、 WideCharToMultiByte 250ms wcstombs 1720ms あらかじめ計算しておいた配列を使う 2170ms となって圧倒的にwinAPIが速かったです。 前にローケル設定しなくてwcstombsが速いとか間違えを書きました。
358 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 03:58:49 ] >>309 その後、実際につかう数字で計算してみたところ、3次の項までは必要となりました。 しかし、logで計算するより5倍は速いので助かりました。
359 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 09:39:44 ] for_each を使って、int型の配列 v の集計をしなさいという問題なので、 class sum { int total; public: sum() : total(0) { } void operator()(int i) { total += i; } int get() { return total; } }; sum s; s = for_each(v.begin(), v.end(), s); としたのですが、代入しなければならないことが気に入りません。 for_each<vector<int>::iterator, sum&> (v.begin(), v.end(), s) とすれば出来たのですが、やっぱり何か違う気がします。 何かいい表現方法は無いでしょうか?
360 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 10:23:41 ] std::for_each(v.begin(), v.end(), std::bind1st(std::mem_fun(&sum::operator ()), &s)); なんで代入したくないのか知らんが、↓のように書いたほうがシンプルでいいと思うけど。 sum s = for_each(v.begin(), v.end(), sum());
361 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 11:01:51 ] なんでsumを使うか知らないが、↓のように書いたほうがスンプルでいいと思うけど。 int sum = std::accumulate(v.begin(), v.end(), 0, std::plus<int>());
362 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 11:28:36 ] >for_each を使って、int型の配列 v の集計をしなさいという問題なので、
363 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 11:30:31 ] >>361 for_each を使って、集計をしなさい
364 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 11:37:37 ] そうですかごめんなさい早漏にて候
365 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 11:51:24 ] >>359 TR1を使えば以下のようにできる。 std::for_each(v.begin(), v.end(), std::tr1::ref(s) ) ; ただし、sumを次のように変更する必要がある。 class sum { public : typedef void result_type ;//ネストされたresult_typeという型で、関数オブジェクトの戻り値の型を表す //省略 } ; あるいは、unary_functionを継承すること。
366 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 12:02:09 ] VC2008でマリオもどきを作ろうとしてるんですが、↓のソース(関係無さそうなメソッドとかは省略してます)をコンパイルすると >v:\projects\mario\player.cpp(8) : error C2511: 'Player::Player(int,int,pleyer_type)' : オーバーロードされたメンバ関数が 'Player' にありません。 > v:\projects\mario\player.h(8) : 'Player' の宣言を確認してください。 となります。どこがおかしいのでしょうか?(見づらい質問でごめんなさい) //Player.h #include "Characters.h" class Player : public Characters{ private: enum player_type ptype; public: Player(void); Player(int x,int y,enum player_type type); }; //Player.cpp #include "Player.h" Player::Player(void){ this->x = 1; this->y = 1; this->ptype = PTYPE_NOM; } Player::Player(int x,int y,enum pleyer_type type){ this->x = x; this->y = y; this->ptype = type; } //Characters.h class Characters{ enum char_type ctype; public: Characters(void); Characters(int x,int y,enum char_type cp); };
367 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 12:12:44 ] >>366 × pleyer_type ○ player_type ってことだと思うよ
368 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 12:15:56 ] ……死にたいorz 宣言と定義が違うって事だったんですか、回答有り難うございました
369 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 12:33:35 ] >>359 int s = for_each(v.begin(),v.end(),sum()).get();
370 名前:359 mailto:sage [2008/09/19(金) 12:41:58 ] みなさん、ありがとうございました。 >>365 が いいと思い、(自分の処理系ではTR1が使えないので)boost::refでやってみたら、 > error C2064: 1 引数を取り込む関数には評価されません。 と出て、ダメでした。 TR1とboostはほとんど一緒と聞いていたのに残念でした。
371 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 13:01:28 ] >>370 TR1は、確かにBoostを念頭においているとはいえ、より考えられている。 というのも、Boostは単にreference_wrapperで包んでいるに過ぎないので、 このままでは関数オブジェクトとして、operator ()を適用できない。 そこで、TR1では、メタプログラミングを駆使して、単項か二項として呼べるようになっている。
372 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 13:22:41 ] この出力は0になります。STLの新規のresizeは常に初期化されますか? vector<int> r; r.push_back(1); r.push_back(2); r.resize(1); r.resize(2); cout<<r[1];
373 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 13:29:32 ] されます
374 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 13:47:28 ] dクスです
375 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 15:54:53 ] これでどんな環境でも、メモリは解放されますか? クラス側で解放処理をしなくても、STLを使っている範囲(newは使わない)では自動開放されますか? class A{ public:vector<char> x; A(){x.resize(10000000);}}; main(){ map<string,string> w; w["hage"].resize(10000000); cout<<"enterを押すとstringのメモリを解放します。 "; getchar(); w.erase("hage"); cout<<"メモリは解放されましたか。 "; getchar(); map<string,A> z; z["piza"].x[0]; cout<<"enterを押すとクラスのメモリを解放します。 "; getchar(); z.erase("piza"); cout<<"メモリは解放されましたか。 "; getchar(); }
376 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:01:47 ] STLのメモリ解放は変な点がありますから心配です。 というのも、vectorでclear();使っても全く解放できないからです。swapしかないので。
377 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:10:25 ] ブロックでくくれば抜けたとき解放されるだろ
378 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:11:03 ] 何も変な点なんてねぇよ。 clearやresizeでメモリを解放する必要などない。
379 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:13:50 ] MinGW3.4.5を使っているのですが、 list<vector<int> > l; vector<int> v(10,0); l.push_back(v); とすると、 stl_list.h:435: warning: '__p' might be used uninitialized in this function という警告が出ます。 l.insert(l.end(),v); とすれば警告は出ないのですが、何が問題となっているのでしょうか?
380 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:51:32 ] >>376 効率を上げるために、開放されないよ。 clearするってことは、次に直ぐ追加される可能性があるかもしれないってことで、バッファっは保持されるんだ。
381 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:39:19 ] AUX CON NUL PRN をファイル名に使うとバグりますか?
382 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:43:25 ] バグるかもしれないし、バグら無いかもしれない
383 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:45:05 ] DOSの予約デバイス名が入っていたときに処理がおかしくなる代表例を教えてください。 WindowsXP以上でAPIを使ったときバグりますか?
384 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:47:45 ] うちのパソコンだと、AUXを名前に含めても、エラーが出ずに エクスプローラーで書き換えられます。 問題出ますか?
385 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 19:04:12 ] 一意的な絶対パスに変換する方法教えてください。 下のpはパスとして正常なんですけど・・・ これを変換する関数は無いですか? char p[]="C:\\hoge_hoge\\..\\windows\\Notepad.exe"; system(p); //パスが有効か? char q[300]; GetLongPathName(p, q, 300); wcout<<p<<"\n->\n"; wcout<<q<<endl;
386 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 19:20:50 ] 自己解決しました char p[]="C:\\////\\hoge_hoge\\..\\windows\\Notepad.exe"; char q[300]; GetFullPathName(p, 300, q, NULL); printf("%s\n", q);
387 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 20:34:56 ] すみません。 wchar_t型配列に、世界各国語と英字の大文字・小文字が入っているとき 大文字を小文字に変換するにはどうしたら良いでしょうか?
388 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 20:47:41 ] towlower
389 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:00:05 ] すみません。このようにしたいんです。 中国語・・・ABCDF・・・中国語 →中国語・・・abcde・・・中国語 ロシア語・・・FUNCTION・・・ロシア語 →ロシア語・・・function・・・ロシア語
390 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:02:36 ] 何語でも出来ますか?? towlower() の動作は、現在のロケールの LC_CTYPE カテゴリに依存する。 この関数を Unicode 文字に対して使うのはあまり適切でない。なぜなら、 Unicode には大文字(upper case)・小文字(lower case)・タイトル文字(title case) という 3 つの "case" が含まれているからである。 manpages.ubuntu.com/manpages/feisty/ja/man3/towlower.html
391 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:36:50 ] こんな感じ? wchar_t us_tolower(wchar_t c) { if(c<='A' && c>='Z') { c=c-'A'+'a'; } return c; }
392 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:45:26 ] unicodeて、どのOS、コンパイラでもアルファベットはASCIIと同じですか?
393 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:47:34 ] 何?
394 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:48:44 ] >>391 なんか怪しいけど、せめてLを・・・
395 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:50:59 ] たまにはEBCDICも思い出してね
396 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:52:47 ] コンパイルした環境に依存しないで、たとえば日本のVC++でコンパイルして、 ロシアや中国でも小文字になりますか?
397 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:55:51 ] BCCでコンパイル中に任意のメッセージ書き出せるマクロみたいのってないよね?
398 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:59:15 ] GetUserDefaultLCID と LCMapString でやってみます。
399 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 02:19:19 ] intel c++はisostream入っていませんか?
400 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 02:38:34 ] 日本語体験版だと入ってないのかな? なんかヘッダが足らないみたいです インストールの失敗? 英語体験版をいれて日本語で上書きしたらいいかな?
401 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 02:50:42 ] わかりました。VC++2008との統合が失敗してたのですがそれが原因みたいです。 wikiより。 実行に必要なライブラリやリンカなどは付属していないため、他のコンパイラの環境に寄生した形で実行される。 WindowsではMicrosoft Visual Studioが、LinuxではGCCが必要である。
402 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 02:52:46 ] isostream?
403 名前:デフォルトの名無しさん [2008/09/20(土) 17:52:54 ] あるところからC++のソースコードをダウンロードして、 そのフォルダの中のsample.vcprojというのを実行すると、 VisualStadioが起動しました。 サンプルコードのはずなので、F5を押して実行すると、 「シンボル情報がありません:firefox.exeのデバッグ情報が見つからないか、 または一致しません。シンボルが読み込まれていません」 というウィンドウが表示されました。どうすればよいでしょうか?
404 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 17:57:33 ] あるところって、どこ?
405 名前:403 [2008/09/20(土) 18:10:55 ] 404さん www.cs.umd.edu/~mount/ANN/ からann_1.1.1.zipをダウンロードして、 MS_Win32→sample→sample.vcprojを実行しました。
406 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 18:29:16 ] プロジェクトの構成がReleaseになってるだけじゃないの? Ctrl+F5とかで実行したら?
407 名前:403 [2008/09/20(土) 18:36:34 ] 406さん プロジェクトの構成はDebugでした。 Ctrl+F5とすると、Firefoxが新しく起動しました。 プロジェクトの構成をReleaseにしてみて、 F5を押すと「デバッグセッションの実行可能ファイル」というウィンドウが出てきて、 「実行可能ファイル名」を選ばされました。 よく分からず、既定のWebブラウザを選んで実行しました。 それを過去にもやったため、Firefoxが動いているんだと思います。 「デバッグセッションの実行可能ファイル名」を何にすればよかったのでしょうか?
408 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:08:56 ] 1回かたの消しちまって、めんどくさくなった。 >>407 落としたけど、スタートアッププロジェクトがdllになってない? samleをスタートアッププロジェクトに設定しないと、VSからは起動できない。 あと、sampleをビルドして出来るのは、コマンドラインアプリだったので、 F5実行だと、DOS窓が一瞬出てすぐ消えた。 デバッグセッションの実行可能ファイル名で解決したいなら、 「展開したフォルダ\ann_1.1.1\MS_Win32\bin\ann_sample.exe」 じゃないかね
409 名前:403 [2008/09/20(土) 19:54:14 ] 408さん F5実行で、DOS窓が一瞬出てすぐ消えた、ところまではできました。 「引数無しで実行」したときはエラーになるようなので、 コマンド引数に「-df data.pts -qf query.pts」と設定して 実行してみました。すると「cannot open data file」と表示されました。 すこし前進したようです。 あとはどうやってファイルを開くのか試行錯誤しているところです。 query.ptsというのは点のデータだと思います。 Test dataフォルダには「data_pts」がありますがちょっと違う。 これを読めばいいのか、または別のところにデータがあるのか。。。
410 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:12:01 ] test1-data.pts,test1-query.pts,test2-data.pts,test2-query.pts ってのがあるみたいだけど
411 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:13:07 ] 俺が落としたヤツだと「ann_1.1.1\test\」の下に test1-data.ptsとtest1-query.ptsってのが転がってたんで、 それを「ann_1.1.1\MS_Win32\bin\」の下にコピってからDOS窓で ann_sample.exe -df test1-data.pts -qf test1-query.pts って打ったら動いたけど。 VCからだとカレントフォルダ分かりづらいから 別にDOS窓起動した方が良いんじゃない? 引数の設定にフルパスで書いても良いと思うけど。 まぁそろそろ飽きたんで引っ込む。
412 名前:403 [2008/09/20(土) 20:16:28 ] 411さん 長いことありがとうございました。 後は自分で進んでみます。
413 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:41:25 ] 逆アセンブラしてCのソースに貼り付けたら、動かせますか? コマンドラインの引数を、関数の引数に変換できますか
414 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:44:13 ] >逆アセンブラしてCのソースに貼り付けたら、動かせますか? そのまま貼り付けてコンパイルしたら動かないね いやそも逆アセンブラするってなんだよって話だが >コマンドラインの引数を、関数の引数に変換できますか main関数の引数になります
415 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:50:17 ] DOSプロンプトで動くツールで、ソースが無いものをパクリたいのですが・・ できないですか? test.exe ファイル名 > 出力名 というツールを char * test(char *ch){ アセンブラ } という関数に出来ませんか
416 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:57:14 ] 無理?
417 名前:デフォルトの名無しさん [2008/09/20(土) 20:59:24 ] 普通に通信して連携すれば?
418 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 21:00:36 ] 速度はひとつにした方が速いと思うんですが
419 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 22:12:24 ] >>415 関数が export されていて、インターフェイスが公開されているなら簡単にできるが、それ以外だと面倒 グローバル変数を使ってたりしたら「自作のほうが楽じゃね?」ってなるかもw
420 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 02:22:25 ] すみません こういうツールの作り方教えてください 圧縮ファイルをすべてのアプリに対してフォルダと認識させる方法です wINDOWSエクスプローラのみなら昔からできたのですが Zipファイルをマウントする?「Pismo File Mount Audit Package」 www.moongift.jp/2008/07/pismo_file_mount_audit_package/
421 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 03:16:01 ] #include <stdio.h> #include<math.h> double simpson(double, double, double, double); double func(double); int main(void){ /* 必要な変数の定義をする */ double h,xkisu,xguu,s0,s1,s2,ans,x1,x2,n,x0,i; scanf("%lf", &x1); scanf("%lf", &x2); printf("x1 = %f\n",x1); printf("x2 = %f\n",x2); /* 偶数の分割数を入力するまで繰り返す */ do{ scanf("%lf", &n); printf("n = %f\n",n); if ((n%2) != 0){ printf("!! Bunkatsu su ha gu-su- desu !!\n"); } else break; } while (n%2!=0);
422 名前:421 mailto:sage [2008/09/21(日) 03:17:12 ] すみません、みすって投稿してしましました。 上のは途中までのプログラムなのですが コンパイルすると 22: 浮動小数点の不正な使用(関数 main ) 25: 浮動小数点の不正な使用(関数 main ) とでます。 なぜでしょうか?
423 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 03:33:07 ] 小数を整数で割った余りって何なんだよ。 nはintとかにしとけ。
424 名前:デフォルトの名無しさん [2008/09/21(日) 04:52:19 ] Cでのメモリの取られ方についてご教授いただけませんでしょうか。 下記のようなコードを書いた場合、 static const char *teststr[6] = { "00000", "1111111111", "2", "3", "444", "555555" }; それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、 それらを指すポインタがteststrに格納されるのでしょうか? VCで試したところ、確かにteststrの各配列に指定した文字列が格納されていたのですが、 ポインタのみを確保して、その位置のデータを破壊して、指定文字列を格納しているということはないでしょうか? 組み込み(ARM)での開発に使用しようかと思っています。 よろしくお願いします。
425 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 05:02:09 ] そんなもの処理系によるとしか
426 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 05:12:15 ] Cで@や$や`記号が使われなかった理由ってあるんですか。
427 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 05:16:12 ] これ以上トリグラフ増やすのいやだったんじゃね
428 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 07:28:28 ] >>424 破壊はしない。
429 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 13:51:14 ] >>424 > それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、 > それらを指すポインタがteststrに格納されるのでしょうか? そのとおり。 文字列はROM、ポインタはRAMに置かれる。
430 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:26:49 ] >>429 ポインタが RAM にいっちゃうのは teststr に const が付いてないからだよね?
431 名前:デフォルトの名無しさん [2008/09/21(日) 15:27:21 ] Cから最近C++に移行しました。 関数を void foo(char* filename); と宣言して使うときに foo("data.dat"); とやると deprecated conversion string constant to char みたいな 警告が出ます。これは何が不味いのでしょうか?
432 名前:デフォルトの名無しさん [2008/09/21(日) 15:28:02 ] >>431 const 付けたらいいんじゃね?
433 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:28:17 ] >>431 文字列リテラルは書き換えできないから char const で受け取らないとあぶない。
434 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:34:55 ] マクロの中で " をあらわすにはどうしたらいいですか? エスケープを使うとエラーになり、そのまま使うと文字列リテラルとして解釈されてしまいます。。。
435 名前:デフォルトの名無しさん [2008/09/21(日) 15:35:43 ] つまり foo(const char* filename); と宣言すればよいということでしょうか?
436 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:35:48 ] >>434 状況が見えんな。エラーになるコードとエラーメッセージをどうぞ。
437 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:37:21 ] 現在二次元配列と2重ループを習っている超初心者です 質問なのですが列和と行和を求めるプログラムで、 列和も行和も同じループ内で処理できるのは何故なのでしょうか?
438 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:37:56 ] >>435 foo の中で filename の指す先を書き換えないんなら、それでいいはず。 っていうか、試せよ。
439 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:39:09 ] >>437 日本語でどうぞ
440 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:39:55 ] >>437 それだけ言われてもわかんねーよw 二次元配列を一次元配列にキャストしてるとか?
441 名前:437 mailto:sage [2008/09/21(日) 15:47:42 ] すみません・・・どう表現していいかわからず整理しないまま打ってしまいました 考察の一部なんですが、これ以外文章にしようがなくて困っています プログラムをあげたほうがいいでしょうか?
442 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:49:34 ] >>441 まだ相談したいならコード晒せ。あの文章じゃ無理だ。 コード晒せば答えが得られる保証はないけどな。
443 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:02:09 ] 簡単なことだ 二重ループは行列の全ての要素にアクセスするための手段でしかないから その扱いについては制限されない あとは各行和各列和を格納する配列を定義して要素に応じてそれぞれ適切に加算していくだけ
444 名前:441 mailto:sage [2008/09/21(日) 16:07:01 ] 初心者丸出しで長ったらしいプログラムなのでろだにあげてみました。 No.7729です。よろしくお願いします。
445 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:38:13 ] for(j=0;j<4;j++) for(i=0;i<3;i++) table[3][j]+=table[i][j]; これ行和しか求めてないよ。ソース中には列和を求める部分は見当たらなかったけど。
446 名前:444 mailto:sage [2008/09/21(日) 18:52:32 ] >>445 列和の計算を入れ忘れている事に気付きました。ありがとうございます この行和と列和を求めるプログラムの考察で、 列和も行和も同じループ内で処理できるのは何故かと言う問いなのですが 理由は>>443 でOKもらえますかね・・・?
447 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 19:11:38 ] >>446 >>443 は日本語がちょっとおかしいのでちゃんとした文章を自分で考えてくれろ 正解かどうかは知らないし
448 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 19:54:02 ] すいません質問なのですが、とあるクラスのprotectedメンバはその派生クラスの派生クラスからはアクセスできないんでしょうか?? MinGWで色々やっているのですが、間接継承の関係にあるクラスのprotectedメンバにアクセスしているプロググラムを実行すると、フリーズしてしまいます。 アドバイス頂けると幸いです。
449 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 20:29:22 ] >>448 フリーズするならそれはまったく別の問題。
450 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 20:40:54 ] >>448 フリーズならどこかで無限ループしてるんじゃ
451 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 21:27:02 ] VCの_COM_SMARTPTR_TYPEDEFなんですけど これで作ったCOMのスマートポインタもAttachで入れないと カウントがずれるですか?
452 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:02:33 ] 頻繁に使われる関数で常にメモリを100Kほど確保して置きたいのですが どのようにしたら良いですか? マルチスレッド対応の方法教えてください こういう警告と同じ箇所で英語のエラーがでます。 マルチスレッド アプリケーションのコンストラクタでローカル静的変数を使うことは危険
453 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:08:57 ] >>452 クラスにしとけ。
454 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:59:27 ] 100K みたいに大きいバッファは マルチスレッド関係なく動的に確保しる。
455 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 00:44:37 ] 頻繁に使うから、再確保はしないでそのままにしておきたいのですが。 2個以上同時に使われるとバッファが壊れますが、どうしたらいいでしょうか?
456 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 00:49:20 ] 確保してから、アプリケーションが終了する直前までずっと確保したままでいい。 とりあえずマルチスレッドプログラムを組む場合は同期オブジェクトを勉強してください。
457 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 01:34:08 ] 寝る前だけど質問させてもらいます C++で横スクロールするアクションゲームっぽいもの 作ってるのですがキャラクターをクラスで扱っていて 場面ごとの関数1つ1つにクラスの変数やメソッドを使うから インスタンス定義ってのをやらなきゃいけないようで そうするとそのせいで場面の移り変わりのときに それまで使っていた変数が初期化されてしまって ttp://www.dotup.org/uploda/www.dotup.org0173.jpg このようになってしまいますよね キャラクターのクラスだけでなく他にも場面やステージを 隔てて初期値に戻ると困るものを保存したり引き継いだり できればいいのですがどうすればいいのでしょうか・・・
458 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 01:38:03 ] >>457 保存したり引き継いだりすればいいよ。 コンストラクタ含めて関数には引数が渡せるだろ。 その画像のプレゼン能力はすばらしい。
459 名前:424 mailto:sage [2008/09/22(月) 01:43:49 ] >>428 >>429 回答ありがとうございました。 これから検討してみたいと思います。
460 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 01:45:46 ] スコープが広めのリサイクルオブジェクトコンテナ見たいなのを作って、シーン終了時に必要なものを追加 次のシーン初期化時に、シーンのオブジェクトコンテナに移し変える
461 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 03:08:24 ] 質問です。 ファイルオープンで、ファイルから値を読込んでもう一つのファイルにその値を書込むプログラムで、 読込用はテキストファイル(.txt)、書込用はバイナリファイル(.bin)を用いました。 上記の2つのファイルサイズは少量ですけど違いました。 この違いは何によるものなんでしょうか。
462 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 03:13:07 ] 改行コードじゃない?
463 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 03:52:47 ] 読込ファイルの値はスペース区切りでした テキストファイルから「1 2」という値を読み込みバイナリファイルに書き込んで ファイルをエディタで開くと「01 00 00 00 02」と表示されますが、 つまりは書き込みがバイナリファイルだとスペースにもコードがあるから ファイルサイズが大きくなる・・・ということでいいんでしょうか・・・?
464 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 04:06:47 ] >>461 ,463 読み込んで形式変えて書き込んでるんだから、そもそも同じになるわけがないな。
465 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 04:30:31 ] 質問です。 他のプロセスのメモリを監視するプログラム作ろうとしています。 ReadProcessMemoryで値を取得することはできたのですが、 できればそのメモリアドレスの値が更新された時に取得を実行したいです。 この「メモリアドレスの値が更新された」というイベントを取得することは可能でしょうか?
466 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 04:54:21 ] >>451 コンストラクタならfalseー緒に渡せば、AddRefしないよ。 operator=は無理だな。
467 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 07:22:34 ] >>465 チートツールはほどほどにしとけよ
468 名前:448 mailto:sage [2008/09/22(月) 12:19:03 ] >>449 >>450 おっしゃる通り別の問題でした汗 ありがとうございましたm(_ _)m
469 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 12:42:19 ] 327です。 >329 ありがとうございます。 u_char *ucharAdr; ucharAdr = (u_char *)(gulngUpdataAddress & 0x0fffffff) + 0x0c800000; memcpy( ucharAdr, gushtUpdataArea, gulngUpdataDataCount * sizeof(short)); で、いけました。
470 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 12:45:08 ] CImageで(a,b)から(x,y)まで直線を引く方法はありませんか?? MoveTo、LineToを使用せずに描きたいです。
471 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 12:48:25 ] なんでMoveTo、LineToを使用したくないの?
472 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 13:13:47 ] >>470 おいらのCImageなら、メンバにLine(CPoint from, CPoint to)があるからそれを使えるよ。 でも、あんたの言っているCImageにそれがあるかどうかは知らんけどね。
473 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 19:04:58 ] const char str1[] = "str"; const char * str2 = "str"; "str"が配置されるのは、前者の場合、配列に格納するコードのところ 後者では文字列を置いておくところだと思うのですが、どういうときに、どちらを選べばいいのでしょうか 自分で考えたところでは、 ・上の場合は、コンパイル時に配列のサイズが決まるのでstrlenなどを使う必要がない ・下の場合は、自動変数の確保がポインタだけですむ(速い?) というちがいだと思うのですが、ほかにも違いがあるのでしょうか
474 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 19:18:10 ] >>473 後者は str2 = "another" のような代入が可能になってしまう。たぶん意図したものじゃないだろう。 static const char str3[] = "str"; ↑これなら挙げられた前者と同じメリットを得つつ、後者のメリットを上回る(自動変数の確保はゼロ)。
475 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 19:46:37 ] const char * const str2
476 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:16:33 ] >>474-475 ありがとうございます。 475さんのはstr2が同じものをさし続けるようにするのですね。 474さんのは静的変数の初期化に、コストを預けてるわけですね。
477 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:31:51 ] >>476 str3 の初期化にコストなんか要らないよ。どのケースでも必要になる文字列リテラルの 実体を直接割り付ければいいだけ。
478 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:16:49 ] >>473 #define str4 "str"
479 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:01:02 ] ここの場所でC2614のエラーが起きます。 クラスや構造体の初期化子リストに表示できるのは、メンバか基本クラスだけです。 規定クラスのメンバはどうやって初期化するですか? class A { public: A(int apple) protected: int m_banana; } class B : public B { B(int apple) : A(apple), m_banana(8) ←ここ { } }
480 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:04:32 ] 基底クラスのコンストラクタで行う。 class A { public: A(int apple) protected: A(int apple, int banana) : m_banana(banana) {} int m_banana; }; class B : public A { B(int apple) : A(apple, 8) { } };
481 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:05:16 ] できました。 ども
482 名前:デフォルトの名無しさん [2008/09/24(水) 07:57:18 ] VC++2005を利用しています 例外を勉強しているのですが、例外を発生させたときに、 catchで例外を処理しても、デバッガに例外があったことが出力されます catchで例外を処理するときは、 デバッガの出力に例外が発生したことが出力されるのを防ぎたいですが、どのようにすればいいでしょうか
483 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:37:12 ] >>482 出力って、例外時のデバッガのダイアログ?だったら、デバッグ->例外で設定できる デバッグ出力の例外のレポートだったら気にするな。レポートが出すぎて困るのだったら例外の使い方が間違っている。
484 名前:482 [2008/09/24(水) 13:18:40 ] >>483 れす、ありがとうございます。後者です。 例外のつかいかたについては勉強していくところです。 もし、テストケースとかを今後記述するような場合に、デバッグ出力でOFFにできないのか探しています。
485 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 14:19:16 ] >>482 Visual Studio のスレで聞いたほうがいいんじゃないかな?
486 名前:346 mailto:sage [2008/09/24(水) 14:42:55 ] >>347-353 超連休で返事が遅くなって申し訳ない。レスありがとう。 グローバルとstaticがいい感じっぽいので、両方試してみます。
487 名前:482 [2008/09/24(水) 15:56:25 ] >>485 ありがとうございます。移動します。
488 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:35:28 ] private List<ISchedule> zTasks = new List<ISchedule>(); これを同じことを NET 1.1でやりたいんですが どうすればいいんですか?
489 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:39:34 ] ArrayList
490 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:15:17 ] >>489 すいません>< 具体的なコードを教えてくれると助かります^^;
491 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:24:23 ] C#スレ行けよ
492 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:38:05 ] tchar.hをインクルードしてあるのですが、コンパイルすると、_tstofが未定義の関数なるのは何故でしょうか?
493 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 20:14:44 ] >>492 ちゃんと確かめて無いので間違ってるかもだけど、 _tstofは内部でatofや_wtofを使ってるので、それらを使う ために必要な<stdlib.h><math.h><wchar.h>をincludeする必要があったかも?
494 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:14:43 ] >>493 その三つをインクルードしてみましたけど駄目でした。 環境の問題でこういう事ってありますかね?
495 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:56:07 ] >>493 その理屈はおかしいよ
496 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/25(木) 00:43:23 BE:279187542-2BP(50)] スペルはちゃんと合ってる?
497 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 06:09:59 ] BCC Developer使ってるんですけど、そのデバッガのTurbo Debugger がダウンロードできません どなたか入手方法教えてください
498 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 06:32:51 ] 自己解決しました すいませんでした
499 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 06:37:59 ] turbodebugger.exe
500 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 21:54:04 ] >>492 includeする順番を変えてみたらどうだろう? tcharではなかったかもしれないけど、以前にそんな感じの現象になったことがある。 そのときは、なにかのバージョン番号とかが順番によっては未定義になって 起きた現象だった。tchar.hの中をみて、どのように定義されているか確認すると いいかもね。
501 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 01:31:26 ] VC++2008は.NETの関数を使えるんですか?
502 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 01:49:00 ] 自己解決しました C++/CLI言語で出来ることがわかりました
503 名前:デフォルトの名無しさん [2008/09/26(金) 19:45:12 ] 動的な配列を作るにあたって、 引数付きコンストラクタを呼び出したいんですが、何か方法はありますか? Const なメンバ変数のために初期化リストを使いたいんですが・・・。 CHoge *hoge; hoge = new CHoge[2] //ここでHoge( X )のように引数を指定したい
504 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 20:18:13 ] ない
505 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 20:20:29 ] 0xかCLIでなら・・・・・・
506 名前:デフォルトの名無しさん mailto: Sage [2008/09/26(金) 21:32:03 ] プロパティページの中にスライダーコントロールをつけたいのですが setRangeをする場所がわかりません。 コンストラクタの中でやるとエラーで落ちてしまいます。 OnInitDialogでやっても何もダメでした。 何かよい方法は無いでしょうか? IMPLEMENT_DYNAMIC(CPropOption, CPropertyPage) CPropOption::CPropOption() : CPropertyPage(CPropOption::IDD) , m_xvEditPenthick(_T("")) , m_xvSliderPenthick(0) { // m_xcSliderPenthick.SetRange(0,10); //なぜかこれをつけると壊れる } VC 2003です
507 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 00:49:00 ] >>506 ありません
508 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 07:16:59 ] DLLをlibにするテクありませんか?
509 名前:デフォルトの名無しさん [2008/09/27(土) 07:55:01 ] すみません。質問なんですけど、charとwchar_tを比べたとき、charでは表せない文字やファイル名はありますか? VC++2008ではchar型は、SJISかEUCであってUNICODEは表せませんか?
510 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 07:59:35 ] char型に入るのは英数字とあといくらかなのでsjisとかeucだとか言う時点でなんかおかしい
511 名前:デフォルトの名無しさん [2008/09/27(土) 08:03:10 ] char配列でおねがいします
512 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 08:32:29 ] >>511 ただのバイト列だからなんでも入るよ
513 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 08:51:14 ] >>509 charは只の8bitの数値。それをどの文字コードで解釈するかってこと。 文字コード表を比較してください
514 名前:デフォルトの名無しさん [2008/09/27(土) 13:43:04 ] dクス
515 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:38:26 ] クラスが保持するstaticメンバ関数から 同一クラスのprivateメンバ変数へアクセスできない 書き方が悪いのか、それともそういうもんなの?
516 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:54:48 ] 実体を渡せよ thisとか
517 名前:デフォルトの名無しさん [2008/09/28(日) 03:10:16 ] >>515 class AAA { private: int m_a; public: static void func(int arg, AAA* pinst); }; void AAA::func( int arg, AAA* pinst) { pinst->m_a = arg; } こんな感じか
518 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 04:00:18 ] struct Hoge { Hoge() {} Hoge(const Hoge&) { Sleep(1000); } Hoge& operator=(const Hoge&) { Sleep(1000); return *this;} }; もしこのくらいコピーにコストがかかるクラスをSTLのコンテナに入れる場合、どうするのが良いですか。 特にvectorだとpush_backしていくうちに、サイズ増やすために全部コピーしたりしますよね。(listだとそういうことはないのでしょうか) ポインタ(std::vector<Hoge*>とかstd::vector<std::tr1::shared_ptr<Hoge> >)で管理するのが普通ですか。
519 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 05:00:37 ] >>518 listやset、mapはpush_back(insert)しても新たにコピーされることは無い ただまぁvectorと同じようには使えないので、boost::ptr_vectorあたりがお手軽か?
520 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:00:28 ] >>518 そのとおり、shared_ptrが無難
521 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 20:52:45 ] クラスAのメンバの配列を動的確保できるようにnewとdelete用の関数を作りました。 そうするとクラスAに全く関係のないクラスBのメンバの値がおかしくなりました。 調べていくと、 クラスBのコンストラクタで初期化完了 ↓ クラスAのコンストラクタでnewを使う ↓ クラスBのメンバの値がおかしくなる という流れでした。 これは何が原因なのでしょうか? ちなみにクラスAのnew用関数ではクラスBは全く使用していません。
522 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:01:43 ] クラスBのデストラクタにブレークポインタ打ってみそ
523 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:08:37 ] >>522 プログラム終了時のみにしか呼ばれてませんでした
524 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:09:04 ] new用関数て? operator new のオーバーロードをしてるわけじゃないよな
525 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:12:00 ] クラスBのインスタンスをウォッチしながらステップ実行してみそ
526 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:13:28 ] >>524 多次元配列なのでまとめてるんです void New() { int i;; for(i = 0; i < MAX; i++) p[i] = new int [SIZE]; } こんなのです
527 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:15:24 ] 全く関係ないところでスタックやヒープを壊してる悪寒
528 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:23:12 ] >>525 ググって見たんですけどやり方が今一分かりませんでした。 クラスA・Bどちらのインスタンスもグローバル変数でクラスBのほうが先に作られます。
529 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:23:20 ] >>526 pの領域は確保してるか?
530 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:33:09 ] >>529 pは int *p[SIZEX]; と宣言してます。
531 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:41:51 ] >>528 VisualStudioだったら、ウオッチにCLASS Bのインスタンスを表示させてステップ実行すると、値が変わったところで赤くなる。
532 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:51:48 ] >>531 クラスAのコンストラクタでnew用の関数が終わったときに値が変わりました。 原因がつかめないのでnewする前にクラスBの値を保存しておいて終わったらそれを代入することにしました。 皆さんありがとうございました。
533 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:12:57 ] 領域が重なってるんだヤバイ状態だ。 解決してから進まないと、あとで手が着けられない状態になるよ
534 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:13:29 ] >>532 MAX > SIZEX になってない?
535 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:22:12 ] >>534 思いっきりなってました・・・ 何で気づかなかったんだろう・・・ 直したら正常になりました。 ありがとうございました。
536 名前:デフォルトの名無しさん [2008/09/29(月) 01:08:29 ] Visual C++ 2003 MFC利用 でExcelファイルの読み書きをexcelのtypelibを使って行っているんですが、 CRangeオブジェクトのメンバ CString get_Address(VARIANT RowAbsolute, VARIANT ColumnAbsolute, long ReferenceStyle, VARIANT External, VARIANT RelativeTo) のReferenceStyleに設定すべき定数がどこにあるのかわからず困っています。 XlReferenceStyleをxlA1にすれば良いらしいのですが。 CRangeの"C8"などのアドレスを返す代替手段があればそちらでもかまわないです。 他の部分はほとんどなんとかなったんですがこれだけどうしようもないです。 よろしくお願いします。
537 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 10:10:33 ] >>508 インポートライブラリを作るってこと?できるよ。 環境によって違うけど。
538 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:01:34 ] fstreamでパスに日本語を含むファイルを開けないんですが、 std::localeとかimbue()つかってもダメで探してもlocaleのことしか見つかりません。 環境はVC2008使ってるけどやはりVCのバグ?fopenとか_openとか使えってことですかね?
539 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:05:07 ] ワイド文字版のコンストラクタを使えばいいよ
540 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:22:23 ] ストリーム関連のライブラリは設計段階でダメダメなので使わないほうがいい。 何しろ、一文字は7bitであるという前提が頭からこびりついて離れない西側諸国の連中が作ったんだから。
541 名前:538 mailto:sage [2008/09/29(月) 12:24:00 ] wfstreamでもダメだったんでやはりCライブラリですか
542 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:29:31 ] >>541 wfstreamはファイルの「中身」をワイド文字で読み書きしたいときに使うんだ ファイル名の問題とは関係ない つうか>>539 嫁 VC8以降は、fstreamにワイド文字版コンストラクタがあるんだよ
543 名前:541 mailto:sage [2008/09/29(月) 12:34:34 ] つまりfstreamのインスタンス作成のときにアドレスをワイド文字で渡せばおkということですか
544 名前:543 mailto:sage [2008/09/29(月) 12:54:55 ] できましたー >>542 ご指摘ありです。 >>539 理解できてなくてすません。 ところでVC8以降ってことはVC依存のコンストラクタ?他のビルダーとかだとマルチバイトで指定してもおk?
545 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 13:02:17 ] >>544 少なくとも非標準 他の環境でも利用したいのならboost使え
546 名前:544 mailto:sage [2008/09/29(月) 13:14:55 ] なるほど了解しました。
547 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:39:12 ] C++…というかC言語自体が初心者です。 C++の開発環境で、PCに『Visual Studio 2005』が入っていたのでそれを使おうとしたのですが、いまいち上手く使えません。 Visual Studio 2005 について解説しているサイトを見ながら設定し、それにのっているプログラムを丸写ししてみたのですが、ビルドが上手くいかなかったり、実行してもエラーが出たり出なかったりでよくわからない状態です。 これ以外で無料で使えて、それでいて使いやすい開発環境はありますか?
548 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 15:19:22 ] あきらめた方がいいよ
549 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 15:39:47 ] 開発環境のせいじゃないだろ。 一歩ずつ進めてみては
550 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:20:09 ] >>547 VS2005は簡単な部類だからあきらめないでね。
551 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:23:04 ] >>547 2008を入れて、この本を買いなさい。 www.amazon.co.jp/dp/4891005823 www.amazon.co.jp/dp/4891005769
552 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:25:45 ] なんか昔アカデミックのおまけについてたような本だなw
553 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:56:57 ] そういうツールの解説本は例外なく糞だ。 買うならこれだ。 www.amazon.co.jp/dp/0470843993
554 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:01:45 ] コンパイルができないってのは、独学者がぶつかる最初の壁だろ。 周囲に訊く人間がいなかったら、バカっぽくても画面写真が載りまくりのような本を見るしかない。
555 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:19:19 ] その辺は、まともな本ほど載ってないような話題だしな
556 名前:536 mailto:sage [2008/09/30(火) 00:40:35 ] 自己レスです。 enum XlReferenceStyle { xlA1 = 1, xlR1C1 = -4150 }; でした。全て解決しました。
557 名前:デフォルトの名無しさん [2008/09/30(火) 03:31:12 ] クラス名をつけたらコンストラクタ出来ますが、クラス名無しで変数だけ定義したら コンストラクタは出来ませんか?
558 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 03:34:39 ] 日本語でおk
559 名前:デフォルトの名無しさん [2008/09/30(火) 03:47:13 ] class cls{ int a; public: cls(){・・・} }; というクラスを class { int a; public: } hensuu; と書いた場合に、初期化が出来るか教えてください
560 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 04:12:46 ] それを構造体にしない理由は?
561 名前:デフォルトの名無しさん [2008/09/30(火) 07:25:39 ] >>560 後者にコンストラクタは定義できませんか? 構造体にしないのは初期化したいからですよ。
562 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:27:22 ] >>561 構造体にすれば初期化できるよw
563 名前:デフォルトの名無しさん [2008/09/30(火) 07:29:54 ] 初期化は、代入だけとは限らないですが出来ますか? 普通のプログラムも掛けますか
564 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:43:16 ] POD(Plain Old Data)の定義からも、 PODの初期化のルールからもはずれるから初期化されないと思う。 第一privateなint a;はどこからもさわれない、そこで警告なりなりラーなりになるような。
565 名前:デフォルトの名無しさん [2008/09/30(火) 07:47:18 ] クラス名を付ければ、初期化出来ますけど、クラス名無しだと初期化は無理って事ですか?
566 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:57:35 ] クラス名のあるなしは関係ない。 グローバル変数としてhensuuがあったら初期化ずみ。 ローカル変数としてhensuuがあったら未初期化。 このへんは普通の変数と同じ考え方でいい。 あとはPODでググる。PODならnewを使った場合にコンストラクタなしでも初期化される。 それから新規の質問以外はsageる。
567 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:07:47 ] struct { int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; が出来るのだから デフォルトの公開性が違うだけのclassでも class { public: int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; と出来るだろ。 やったことないけど。
568 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:14:06 ] >>567 そこまで書いたらやってみればいいよwww
569 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:15:04 ] それでいいはず。 なんでint a; が何でprivateなのだろ。 publicならPODだから、newやhoge xx = {} で初期化可能になる。
570 名前:デフォルトの名無しさん [2008/09/30(火) 08:18:42 ] 初期化っていうのはコンストラクタを起動出来るかという質問です。 class cls{ int a; public: cls(){a=10;} }; っていうのは出来ますけど、クラス名無しだと標準のコンストラクタ名が使えないですけど なんとか出来ますか?っていう質問です。
571 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:21:59 ] 無名ではコンストラクタは指定できない。メンバーをpublicにする。以上。
572 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:28:57 ] >>570 つーかいちいちあげるな
573 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:30:28 ] >>570 無名クラスではコンストラクタは作れないです もし名前空間を汚染したくないだけであれば無名名前空間を使うのも手です
574 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:43:28 ] トンクス
575 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:22:14 ] すみません質問良いでしょうか。 関数chk()の戻り値がFALSEになるまで待つにはどうしたらいいですか?
576 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:26:52 ] なるべくCPUを使わず、即座に進める方法おねがいします。
577 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:40:57 ] 自己解決しました。 関数の戻り値を監視するには、定期的に関数を呼び出すしかないようですね。
578 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:26:27 ] >>577 戻りが変わった可能性があることをイベントを使って検出してから見にいくといい。 OSのAPIにはそういうイベント関係の関数が多数ある。
579 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:36:18 ] >>570 PODをクリアするテンプレートクラスを作って、それをクラスに所有させる。するとデフォルトコンストラクタで初期化できるようになる。 template<class T) class tclear { T a; public: tclear() :a(0) { } }; class X { tclear<int> a; };
580 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 15:54:03 ] ICL10.1(win)でXP32bit用アプリ?をゴニョゴニョしてるんだけど、 SSEのインラインアセンブラとか組み込み関数を使うと、/archとか/Qxとかに関わり無くなぜか勝手に拡張命令を使うみたいなんで困ってます>< インラインアセンブラはともかく組み込み関数は汎用命令で何とかしてくれると思ってたのに・・・ 汎用命令以外吐かないようにする方法を教えてください、よろしくお願いします。
581 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:28:52 ] もうSSEの無い環境なんて切り捨ててもいい時期に来てるってことだろ。
582 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:14:32 ] そうだな C3 だとハングアップするソフトも結構あるしな ><
583 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:23:58 ] いや、SSE2未満なら切捨てでいいと思うけど オレが使いたいのはSSSE3(_mm_hadd_epi16)までなんでチョットまずいかなと・・ 俺自身SSSE3が動かないPCも使ってるし困るんです>< てかQaxがマトモに機能してれば困らない事に気付いたよ!! ICLがコピーと論理演算位しかベクトル化してくれないのが全部悪いんだ!!! 型が複数あると出来ないとか、無理矢理全部intでやったら複雑すぎとかふざけてるとしか思えない てことで普通の自動ベクトル化があるコンパイラ教えてください、お願いします。
584 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:35:54 ] 空の書き込み可能なテンポラリディレクトリを確保する命令ありますか? WindowsXPです。
585 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:38:29 ] GetTempFileName()のフォルダ版ないですか? 存在していない空のフォルダを作りたいのですが
586 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:51:20 ] 同じ名前のファイルとフォルダは同時に存在できない。
587 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:01:53 ] GetTempFileNameで取った名前使ってディレクトリ作れば?
588 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:16:51 ] >>587 それは無理。 GetTempFileNameの作ったファイルを消してディレクトリを作らないといけないから、 その間に他のプロセスに割り込まれる可能性がある。
589 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:15:32 ] これで出来ました。 GetTempdir(){ wchar_t w[1000], z[1000]; GetTempPathW(1000, w); if(!GetTempFileNameW(w, L"aa", 0, z) ) { wcscpy(w,L".\\temp\\"); CreateDirectoryW(w,NULL); if(!GetTempFileNameW(w, L"aa", 0, z) ) wcscpy(w,L"c:\\temp\\"); CreateDirectoryW(w,NULL); } wchar_t ch[9]; for(int n=0;n<100000;n++){ swprintf(ch,L"aa%06d",n); wcscat(w,ch); CreateDirectoryW(w,NULL); if( (GetFileAttributesW(w)&FILE_ATTRIBUTE_DIRECTORY) )break; w[wcslen(w)-8]=0;} }
590 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:26:38 ] まちがえました wchar_t ch[9]; for(int n=0;n<100000;n++){ swprintf(ch,L"aa%06d\\",n); wcscat(w,ch); int flg=GetFileAttributesW(w); if( flg==-1 || !(flg&FILE_ATTRIBUTE_DIRECTORY) ) {CreateDirectoryW(w,NULL); break;} w[wcslen(w)-9]=0;
591 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:30:25 ] GetTempdir が使われてないのと>>588 の意見を全つっぱした理由が気になるな
592 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:40:03 ] GetTempFileNameはファイル作らないよ?
593 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:41:36 ] >>592 作ったり作らなかったりする。 MSDN嫁あほ
594 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:21:58 ] C++なんですけど、(Cも同じでしょうか) グローバル変数でstatic付けるのと付けないのと、どんな違いがあるのでしょうか。
595 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:28:51 ] >>594 その名前がコンパイル単位の外から見えるかどうかが変わる。 C++ では無名の namespace に入れるのが推奨されてる。
596 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:34:01 ] >>594 つけると静的になり、ファイルスコープになる。 つまり、外部に公開しないで済む。
597 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 04:58:54 ] template< class T > class Base を継承したクラス Derived を作りたいのですが クラス定義はどのように記述すればいいんでしょうか?
598 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:15:16 ] template<class T> class Deriv : public Base<T> こうだろうか?
599 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:19:28 ] #include <iostream> template <class T> class Base { T a; public: Base(T b) : a(b) {} void print() const { std::cout << a << std::endl; } }; template <class T> class Derived : public Base<T> { T c; public: Derived(T a, T b) : Base<T>(a), c(b) {} void print() const { Base<T>::print(); std::cout << c << std::endl; } }; int main() { Derived<int> d(1, 2); d.print(); }
600 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 06:48:15 ] おふっ。 できました。ありがとうございます。
601 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:35:56 ] 例外を扱うとき場合 実行中どういう例外を吐いたかログを取るような仕組みを組みこんだりするのでしょうか? その場合、どういう方法でログ取りの仕組みを実装するのがよいでしょうか?
602 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:29:09 ] SYSLOGでも利用すれば
603 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 16:47:32 ] イベントログも使えば
604 名前:594 mailto:sage [2008/10/02(木) 18:21:18 ] >>595-596 ありがとうございます。 staticはローカル変数でしか使ったことがなく、ちゃんと理解してませんでした
605 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:31:59 ] まあ、まず使わん仕様だがな。
606 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:44:00 ] 質問があります。私は今WindowsGUIプログラムで、WinMainのスレッドでGUIの処理、別に作ったスレッドで ファイルへの書き込みを行っています。一定時間間隔で複数のデータをサンプリングしてファイルへ書き込んで いるのですが、メインスレッド終了時に、同時刻上のデータがすべて書き込み終わっている様にしたいのです。 ファイル書き込みスレッドを終了させた場合、どこまで処理を終えているのか確定できませんが、どのようにコントロール するのが一般的なのでしょうか。よろしくお願いします。
607 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:46:01 ] >>606 fflush 相当のことをすればいいんじゃないかと
608 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:57:36 ] >>606 書き込みスレッドにイベントを送って、書き込みスレッドがファイルをクローズしその後スレッド終了するようにすればいい。それを待ってwinmainのスレッドを終了させる。
609 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:00:18 ] イベントについて調べたところ、これで大丈夫そうです。ありがとうございました。
610 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:52:18 ] クラスをリスト化してるのですが クラスの一番最初のメンバ変数をsortを使って 昇順や降順に変更したいと思っています 何かいいやり方はないでしょうか?
611 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:20 ] reverseのが早いんじゃない? 使えるリストなのかは知らないけど
612 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:44 ] >>610 STLを使おう
613 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:57:42 ] >>609 豆知識 スレッドの実行が終わると、スレッドのハンドルがシグナル状態になる。結構便利
614 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:27:10 ] 豆知識ていうか必須知識だろ
615 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:37:04 ] >>606 文章の酷さが気になった もう少し読み書きしようぜ
616 名前:デフォルトの名無しさん [2008/10/03(金) 02:04:13 ] int hoge(int a) { return a++ * ++a; } という関数があるときに hoge(5) とすると、Return値は5×6で30になると思ったんだけど、g++とVC++の両方で 答えが36になりました。これってどうしてでしょうか? どうかお願いします。
617 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:20:56 ] >>616 それは未定義動作なのでそういうコードは書いちゃいけないけど、 あえてコンパイラの気持ちを大便するなら、 1. a++を発見。「評価後にaの値を+1する」と覚えておく 2. ++aを発見。「評価前にaの値を+1する」と覚えておく 3. コード生成開始 4. 評価前なのでaの値を+1するコードを生成 5. a*a のコードを生成して、その結果が返り値となるようにする 6. aの値を+1するコードを生成する。意味がないから最適化で削除されるかも。
618 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:23:42 ] 水に流せってことですか
619 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:35:14 ] 変な物を放り込むと詰まるという意味も
620 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 04:08:33 ] template < class T > class Hoge; で const の T を受け取った時に、 クラス内部で非 const な T 型を使いたい場合には どうすればいいんでしょう? 例えば Hoge< const string > というように呼ばれたとき、 内部で(非 const な) string 型を扱いたいのです。
621 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:54:20 ] >>620 boostのtype_traitsにconstを外した型を返せる remove_cってのがある。 ttp://www.kmonos.net/alang/boost/classes/type_traits.html 手法としてはtemplateの特殊化で行ってるらしい。
622 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:55:16 ] すまん、remove_constだね
623 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:36:56 ] サンクスです。boostが必要ということは もともと const 修飾された型から 非 const の型を特定するのは 難しいプログラム技術が必要だってことなわけですね・・・。 自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・
624 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:59:29 ] >>623 いや、試してないけど実装はたったこれだけで良いっぽいよ。 // remove_const : const修飾の除去 //非constが渡されたらこれが実体化 template <typename Type> struct remove_const { typedef Type type; }; //constの場合はこちらが実体化 template <typename Type> struct remove_const<Type const> { typedef Type type; }; //用例 remove_const<const int>::type i; //constが外れる
625 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:00:15 ] >>617 未定義動作じゃなくて不定動作だろ。 a++と++aの評価順が決まってない。
626 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:08:18 ] >>617 副作用完了点について理解しとかないと泣きを見るよ。
627 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:48:35 ] またそうやって「何かをわかってるフリ」したデタラメを書くw
628 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:51:43 ] >>625 ↓にはそういったコードは未定義だと書いてあるが・・・ www.kouno.jp/home/c_faq/c3.html#2
629 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:59:34 ] ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」 に改められたね。
630 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:17:57 ] >>624 おぉ!すごい!できました!革命的! が、これは安全なんでしょうか。^^; VC++2008では allocator::allocate, allocator::construct は const オブジェクトを引数に取れますが allocator::deallocate. allocator::destroy は const オブジェクトを引数に取れません。 つまり、例えば const string 型のオブジェクトのためのメモリ領域は確保できますが、 その領域を開放する術はありません。そこで、 // T は const string 型とする。 // T* p; // allocator< T > alloc; typedef typename remove_const< T >::type * not_constT; // T 型からコンストはずし alloc.destroy( const_cast< not_constT >( p ) ); // p からコンストはずし のようなコードを書いたわけですが、これが正常なのかどうか…。 コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので もしかしたらメモリリークでもしてるのでは、と。
631 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:29:18 ] スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど プロセスとスレッドの違いが良くわかりませぬ。 スレッドってなんだ?
632 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:42:34 ] ここのこと それはスレッド
633 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:44:55 ] >>632 それだけは言って欲しくなかった…
634 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:54:21 ] プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々 スレッド・・・全部のスレッドでひとつのメモリ空間を共有 メモリ空間を共有するので複数のスレッドからひとつの変数を 同時に書き換えたりとかわけわからんことにならぬよう注意せよ セマフォとかは普通にプロセス間でも使えるんじゃ?
635 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:15:19 ] >>634 ありがとう 確かに共有メモリがどうの聞いた!
636 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:17:08 ] 「業務」で未知状態でマルチスレッドか…… ご愁傷様って奴だな
637 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:25:13 ] 共有メモリとメモリ空間共有とは違うw
638 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:36:17 ] えらんツッコミのせいでせっかくの感動が台無しだ
639 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:40:48 ] 地獄への第一歩で感動とかされても
640 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:50:50 ] Windows3.xやWin32sのプロセスはスレッドだったのか
641 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:06:45 ] 地獄とかやめて 確かに既に炎上してるらしいが
642 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:21 ] 既に炎上してるところに知識のない奴が投入されるのか・・・ ご愁傷様という他ないな
643 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:35 ] passive hell and death
644 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:19:33 ] デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。 だって、どうせ出来上がらないんだから!
645 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:22:18 ] const char *hoge[5]={"test","test2","test3","test4","test5"}; というのを宣言します。 char *hoge2; hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・ 教えてください
646 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:26:08 ] >>645 そういうのを通さないためのconstです。 明示なcastをしてください。
647 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:11 ] >コンパイルが通りません エラーになった原因とかコードとかでてるだろ? それを調べてみればここで聞くまでもなく答えはすぐわかるよ。
648 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:42 ] 代入される変数がconstついてなければできるのだと思ってました hoge2 =(char)hoge[3];ですか?
649 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:29:53 ] hoge2にconst
650 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:25 ] char * だろ。 constのポインタをconstでないポインタに代入しようとしてるから。
651 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:32:21 ] 程よいレベルだとやっぱ群がるなぁ
652 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:24 ] >>649 hoge2はconstだと困るんです
653 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:38:02 ] char hoge2[5] でstrcpy
654 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:35 ] >>652 なんで困るのか言ってみようか
655 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:48 ] C++ならSTLのstd::string使うとか
656 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:43:37 ] >>650 それだといけました >>653 それもありなんですね >>654 いろいろ書き換えたいんです
657 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:50:41 ] 文字列定数を書き換えてはいけない 必ずstrcpyでコピーしる
658 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:53:18 ] そもそもなんとなく この宣言を使ってるんですが char *hoge[5]={"test","test2","test3","test4","test5"}; イメージ的にはどんな感じですか hoge[0] 文字列testへのポインタ hoge[1] 文字列test2へのポインタって感じですか?
659 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:24:19 ] そんな感じ
660 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:13:21 ] a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、 B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++) a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
661 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:15:04 ] >>660 class B の定義より前に class A の宣言だけしてみるとか class A;
662 名前:661 mailto:sage [2008/10/03(金) 19:16:28 ] ごめん >>661 は無しで
663 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:26:27 ] 質問です。 他クラスのメンバ変数にアクセスするにあたって privateなメンバにgetterを使ってアクセスするのと publicなメンバを直接参照するのではどちらが速いですか? CHoge hoge; int a = hoge.m_publicHoge; int b = hoge.getHoge(); // CHogeの実装 // const int& getHoge(){ return m_hoge; }; // public: : // int m_publicHoge; // private : // int m_hoge;
664 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:51 ] 一応 速度は直接アクセス 安全性はゲッター だろう一般的に 最適化で速度差無い事もあるけど 普通はゲッター使いなさいと教わるはず
665 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:52 ] >>660 それだけだとうまくいくはずなのでもうエスパーさんしか アドバイスできないんじゃないかと エラーの出る最小のコードをどうぞ
666 名前:デフォルトの名無しさん [2008/10/03(金) 19:32:06 ] VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。 私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
667 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:35:11 ] ほかのプログラムが満遍なくCPUを使っていただけだろ。
668 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:42:44 ] >>660 インクルードガードでぐぐれ
669 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:52:56 ] >>665 こんな感じです。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7751.zip
670 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:54:33 ] >>669 #include "ca.cpp" #include "cb.cpp" これは。。 ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
671 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:55:40 ] ボーランドのリンカ使い方知らないけど、 それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
672 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:57:11 ] >>671 makefileみたらそうなってるから >>670 だけでいいんじゃないかな
673 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:22:08 ] >>670 つまり、main.cppでa.hとb.hをインクルードして、 a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
674 名前:663 mailto:sage [2008/10/03(金) 20:37:11 ] >>664 サンクスです。 やはり直接アクセスの方が速いですか。。。 参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。 getter使うにしてもローカルで複数回使う場合 func1( hoge.getHoge(; ); func2( hoge.getHoge() ); func3( hoge.getHoge() ); とするより int& b = hoge.getHoge(); func1(b); func2(b); func3(b); のようにした方がオーバーヘッドは減りますよね?
675 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:42:29 ] メンバ関数はインライン関数にできてだな
676 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:43:35 ] 最適化を前提にするなら余計なことはしないほうがよいだろう。 get/setは*.hにインラインで記述するのが基本。 気になるならアセンブリリストを出力したり、実際に測定するといいよ。
677 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:05:57 ] >>674 intなら参照使わない方が早いんじゃね? どういう用途か知らないけど なんにせよ実測するのが一番だな
678 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:23:04 ] >>674 値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、 一通り操作が終わったら、メンバに書き戻す方が良いかも。 メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定 される点もメリット。
679 名前:673 mailto:sage [2008/10/03(金) 21:50:44 ] 解決しました。 どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で 形式上でもインクルードしておけ、って事ですね(多分)。 アドバイスくれた方々、ありがとうございました。
680 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:33:10 ] >>679 > a.cppとb.cppではインクルードガードをかける ヘッダ内でガードする。 多重インクルードされた結果、重複定義が発生する。 > ヘッダはインクルードガード付け となっているから理解したのかもしれないけれど。 すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。 リファクタリングって言葉も調べてみてください。
681 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:09:43 ] よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
682 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:31:17 ] エスパーに失敗した。もうちょっと情報頼む。
683 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:04:14 ] >>681 気分
684 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:22:24 ] >>681 そういう作りはWin16時代の遺物なので今となっては意味がない Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を InitApplication()に記述して、 WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。