【初心者歓迎】C/C++室 Ver.59【環境依存OK】
1 :
デフォルトの名無しさん :
2008/09/06(土) 22:45:12
丘
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を使いたいときはどうしたらいい?
コメントをつけるとき↓どれがいいですか? // ウィンドウクラスを登録 // ウィンドウクラスを登録する // ウィンドウクラスを登録する。 // ウィンドウ・クラスを登録 // ウィンドウ・クラスを登録する // ウィンドウ・クラスを登録する。 // ウィンドウのクラスを登録 // ウィンドウのクラスを登録する // ウィンドウのクラスを登録する。
// ウィンドウクラスの登録
Regist window class.
>>6 /* ウィンドウクラスを登録
BOOL RegisterWindowClass()
{
〜〜〜
}
*/
>Regist window class. 生半可な知識もここまで来ると笑えるな。
みじかいのがいい
>>6 関数名で処理が自明なものにコメントは不要だよ。What じゃなくて、
Why を書くようにしたほうがいいね。
13 :
5 :2008/09/06(土) 23:18:18
// 窓級登録
コメントとかいらねーだろ
関数のコメントってみんなどんなのつけてるんだろう・・・
フリーのリソースエディタでお勧めのものはありますか。
/// <summary> /// ほげほげな関数 /// </summary>
Doxygenとかに食わせたりしないの?
22 :
5 :2008/09/06(土) 23:44:19
>>13 だと
new A()->f();
ってやったときにまずいことになることが発覚
だれかいい方法おせえて
>>5 ,22
そんなマクロは捨てて auto_ptr なり scoped_ptr, shared_ptr なりのスマートポインタを使う。
どうでも良い様な話なんですが、 RECT* SetRect(RECT* pDst, int x, int y, int width, int height) { pDst->left = x; 〜 } みたいなアサイン補助関数があるじゃないですか。 こういう関数は戻り値でデスティネーションを返して、 if(xend > SetRect(〜)->right) みたいな使い方ができるように なってますが、この戻り値って*で返すのと&で返すのと どちらにするべきなんでしょうね? どちらかに統一した方が見た目がすっきりしそうなのですが。
*で受け取るなら*で返す &で受け取るなら&で返す のがわかりやすいのではないか
SHA-1 のコリジョンの起こるサンプルデータを探しています. ググってみると MD5 の方はすぐに見つかったのですが,SHA-1 の方は衝突記事はたくさん引っ掛るのですが, 肝心のデータが見つかりません.どこにあるか知っていたら教えていただけないでしょうか?
何故このスレで?
28 :
26 :2008/09/07(日) 12:08:32
ごめん,ぶっちゃけ どのスレで聞いたら良いか分からなかったんだ. あと RFC についてた MD5 と SHA-1 アルゴリズムのサンプルが C で書かれていたから, このスレが比較的適当かと思ったんだ…. あの後調べてたんだけど SHA-1 で見つかったコリジョンは計算回数を減らした奴で,完全版のほうは コリジョンハッシュを生成する比較的現実的な計算量のアルゴリズムが見つかっただけなのかな? それともアルゴリズムが改良されてもう見つかっている?ここらへんがよくわからんとです….
CRCで十分
CPUのbit数以下であれば、計算コストは同じですか? (32bitCPUで、intの和算、charの和算等) もしそうであれば、前スレで64bitOSでも doubleは64bit、floatは32bitってあるけど、 これも同じことがいえますか? また、別件で、64bitOSでもintは32bitだったり64bitだったりとありますが、 intが32bitだとfloatと、64bitだとdoubleと共有したい場合、 何か方法ありませんか?
計算時間は実測する
>>30 int 以下の大きさの整数の演算は int に変換してから行う、と規格で決められている。
だから計算コストは同じ。読み取りと書き込みのコストは違うかもしれないけどね。
double, float についてはこういう規則は決められてないんで、同じことは言えない。
特定の環境に限って実験結果があれば別だけど。
別件については「共有」の意味がわからんので、なんとも。
>>32 サンクス
共有は共有体(union)のことです
intのビットサイズがOSによって変わるなら
intが32bitの場合はfloatと、
intが64bitの場合はdoubleと共有体を組むべきだと思ったんですが
そのセオリーな方法はないのかと思いまして
>>34 <stdint.h>あるいは<boost/cstdint.hpp>のint32_t/int64_t
>>34 typedef 一段かませばいいんじゃない?
どうやって int のビット数を判別するかは、環境依存のマクロがあればそれでもいいし、
C++ でテンプレートメタプログラミングしてもいい。
>>35 32bitOSでも64bitに固定しろってことなんですかね?
せめてコンパイル環境によって
判定してくれるようなマクロを期待していたんですが
>>36 そうでした、お恥ずかしい
判定したいならこれでどう #include <limits.h> #if INT_MAX == 2147483647
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;
>>39 にゃるほど
>>37 ,40
テンプレートはクラスにしか使ったことなかったんですが
本来そういう使用方法だったんですね
メタプログラミングについて勉強してきます
ありがとうございました
>>41 いや、メタプログラミングは本来の使い方じゃないからね。
ライブラリ実装内で使うならともかく、他人に使わせるようなところで使うのは控えたほうがいいよ。
それでもマクロのifとか使うよりはTMPの方が余程健全に思えるわ
C++の事で質問です ::func()という表記はグローバルスコープで宣言されたfuncを明示的に呼び出す場合に使用するものだったと思いますが ::new Hogeという風にnew演算子に対して::を付けている場合はどういう動きになるのでしょうか?
グローバルなnew演算子を呼び出す。
皆さんの現場では、ウォーターフォール形式で開発しているところが多いのですか? これ以外のプロトタイプ形式とか経験ないのですが、なんか能率悪いと思う
49 :
デフォルトの名無しさん :2008/09/07(日) 22:22:00
マ板に池
アドバイス頂きたいのですが、プログラム終了時まで値を保存する、なんかのデータ型のオブジェクトの配列を確保したいと思ったのですが、プログラム実行時まで配列の要素数が分からない性質のプログラムだとします。 その場合、C++だと char* ch[] とか int* dt[] だけでは storage size of `ch' isn't known (MinGW)のようにエラーになってしまうので、事前に配列を宣言しておくことができません。 なので、今回のように必要な数がプログラム実行時まで不明な同型のオブジェクトを動的に確保して、それらを一まとめにしておくには、配列ではなく次の要素へのポインタを格納したオブジェクトのリストを使うしかないでしょうか?
>>50 mallocで必要なサイズの領域を確保すればいいんでない
std::vector
53 :
デフォルトの名無しさん :2008/09/08(月) 18:00:42
malloc (new) 以外に何か必要なの?
>>53 いいえ、std::vectorを使いましょう。
55 :
50 :2008/09/08(月) 18:06:43
ありがごうございます。
>>51 プログラム開始から終了の間に、順々に必要な要素数が増えていく感じなので、最初に一気にmalloc とか new int [10] とかではダメだったのです。
>>52 そーか、要素がpriority_queueのポインタでして、ポインタってvectorに格納できないと勝手に思いこんでたんですが、調べてたらポインタでも大丈夫なんですね。
vecotrでなんとかなりそうです。ありがとうございましたm(_ _)m
まったくの初心者ですが #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; } 何がいけないんですか?
58 :
56 :2008/09/08(月) 19:17:55
次からは、「どんな結果になった(どんなエラーが出た)のか」
「それは自分の望みとどう違うのか」くらいは書いてくれよ。
>>56 のケースは、たまたまコトの次第がすぐ特定できる内容だからスムーズに行ったけども。
61 :
デフォルトの名無しさん :2008/09/09(火) 19:31:39
hStdOutputの出力を、char型配列にするにはどうしたらいいですか?
62 :
デフォルトの名無しさん :2008/09/09(火) 19:45:58
すなわちメモリのハンドルが取得したいんです
そういうことは出来ません。
64 :
デフォルトの名無しさん :2008/09/09(火) 19:53:38
GlobalAllocでできることがわかりました。 ところでVirtualAllocなど種類がありますがどんな違いがありますか?
マニュアルやAPIをちゃんと読みましょう。
66 :
デフォルトの名無しさん :2008/09/09(火) 20:09:20
みつけたよ
http://konuma.txt-nifty.com/blog/2006/03/heapallocvirtua_5d49.html ・ HeapAlloc
異なるメモリブロックを多数作成するときに利用します。パフォーマンスを最大にしたい場合、
同じブロック長のみで構成したヒープハンドルを複数作成する必要があります。
・ VirtualAlloc
多量のデータを格納する空間を用意する必要があるが、一部は利用しないかもしれない場合に
重宝します(ハッシュテーブル等)。部分的に領域の確保を遅らせることが出来ます。
多量のメモリを確保する場合は基本的にこの関数に頼るべきです。
・ LocalAlloc/GlobalAlloc
どちらもWin16時代の名残です。Win32APIが要求しない限り、新規にこれを採用する理由はありません。
・ malloc (new)
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりします。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いですが、その分最も遅いです。一般的には最後にHeapAllocを呼び出す結果になります。
個人のブログをソースにするのはどうかと、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;
>>68 lstrcatは文字列を末尾に結合する関数。
newで確保した領域の中身は不定。
だからlstrcatはsh内の最初の'\0'を探してその位置に"あいうえおかき"を挿入する。
予めsh[0]に'\0'を入れておけば意図どおりの動作はする。
71 :
デフォルトの名無しさん :2008/09/10(水) 12:50:53
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が最速という結果が出ました。なぜかコピーが速いです。
それぐらいこだわりを入れるなら、ポインタを使ったほうがいいよ。
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);}}
っ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と見なすようなものですか?
>>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と同じですか? メインメモリ。仮想記憶のどこかに確保されて性能に違いはありませんか?
ぜんぶ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;}}
インデントを整えてくれ 醜い
87 :
デフォルトの名無しさん :2008/09/10(水) 16:49:38
メモリが512Mしか乗っていなくて、確保できた最大サイズ1.6Gの読み書きテストをすると 動作がおそくなります。 物理メモリの確保サイズはせいぜい300Mという所とおもいます。 300M以上の場合、メモリや仮想メモリを使わずに、ファイルにマッピングしたいと思います。 アロケータというのを聞きますが、newやSTLを自前で管理するにはどうしたらいいですか?
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に名前をつけたらコンパイルはとおりますが、 つけないで通す方法と、なぜ通らないかが理解したい箇所です。
>>87 そんなことしたって速くならないよ。
それで速くなるならアプリはみんなそうするし、メモリを何Gも積む奴もいない。
94 :
デフォルトの名無しさん :2008/09/10(水) 17:59:03
>>92 アロケータ、STLなどです。
>>93 他のOSなどのメモリを食い尽くさないためです。
実メモリが無くなれば他のソフトにまで影響が出ます。
>>90 2008 SP1では通ったぞ
規格的に適合してるかは知らん
96 :
デフォルトの名無しさん :2008/09/10(水) 18:46:28
一瞬で10Gの空ファイルを作るにはどうすればいいんですか?
環境による
98 :
デフォルトの名無しさん :2008/09/10(水) 18:49:02
魔法使いに頼む
空ファイルってサイズあるの?
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);}
>>96 何の目的かわからないけどWinならスパースファイルを作ればいい。
見せ掛けだけだからディスク容量は減らないが。
1Gのファイルを作って見たけど、体感で60秒ぐらいかかった。結構時間かかるんだね。 gcc
>>94 それで検索して一番目に作り方と使い方の説明ページが出てくるけど。
そのページでさっぱり分からないとなると、
ここで聞いても無駄だと思う。
レスで書ける文字数的に。
具体的にどこが分からないか書けばアドバイスしてくれる人も居るかもしれないけどね。
>>96 Winの場合、適当にファイル作ってファイルポインタを1GBの位置に移動、
ファイル終端をそこに設定すればいける
1GBじゃなくて10GBだった。まあサイズはなんだっていいけど。
超初心者です。 クラスを3つほど作り 数を入力して、もともと設定されている数と計算をし、 他のクラスの数から引いて、表示する ってのを作るにはどうしたらいいですか?
107 :
デフォルトの名無しさん :2008/09/10(水) 21:49:34
>>107 宿題じゃなくて、宿題を片付けるための試しのプログラムだから・・・OTL
そもそも意味がわからん
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( ) { } で( )の中には何をいれればいいんですか?
char**
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]とか
typedef
void A(int card[4][13], char *mark[4], char *number[13]) A(card, mark, number);
117 :
111 :2008/09/10(水) 23:55:16
111です。 ありがとうございました! できました!!
>>116 class Kougeki
{
(中略)
}; ←ここにセミコロン
m.Attacked(); ←Kougeki型の変数を渡さないといけない
k.damage == com * pow; ^^;
s.Attack(); m.Attacked(); ↓ m.Attacked(s.Attack()); かなあ?どうしたいのかよくわからないので何ともいえないけど。
121 :
116 :2008/09/11(木) 00:09:26
解決しますたー ありがとうございました!
結局どうやったかを書いてくれないのがちょっと残念なとこだがいつものことだな
自分をお客さんだと思ってるんだろうな。 getばかりでsetの概念が飛んでる。
124 :
90 :2008/09/11(木) 07:07:34
その後・・・VC++2008 ExpressEdition だと問題なくコンパイル〜実行できました。 VC++2005 ExpressEdition + SP1 ではコンパイルエラーが出るようです。 コンパイラが対応していない記述方法が原因という理解をしました。 ありがとうございました。
>>124 あの糞なBCC(5.9.3)でもまともに走るぞ。
バグじゃね?
.
127 :
デフォルトの名無しさん :2008/09/11(木) 09:29:38
名前をつけてあげるといいと思うよ
ゴッドファーザーですな
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; }
void CopyPtr(int* in, int*& out) { out = in; }
>>129 void CopyPtr(int* in, int** out)
{
*out = in;
}
.....
CopyPtr(in, &out);
.....
>>133 ボタンのコントロールIDを IDOK や IDCANCEL にすればよい
>>134 できました!
ありがとうございます。
あとBCCFormでリソースファイルを作成すると、include <windows.h>が作成されないんですけどほかのソフトのほうがいいでしょうか?
ちょっと使いにくいかなと思って。
>>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を作業領域に使ってくれればかまわないのですがその保証はありません。
ニホンゴでOKでーす
「ファイルを渡す」ってのは具体的にはどういう処理なの?
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に戻すような方法はありますか?
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
してません
もうCは難しすぎるからやめた!
153 :
デフォルトの名無しさん :2008/09/11(木) 23:30:10
150は本物です。 その方法は、メモリマップドファイルでサイズ指定してDLLに渡すんです。 でもこれだと、exeしか提供されていない場合は出来ません。 exeでも出来る方法はありませんか
DLLだって、DLLしか提供されてなかったら、渡すほうから勝手に渡し方を決められないだろ。
155 :
デフォルトの名無しさん :2008/09/11(木) 23:39:38
ついに中国共産党の幹部が動き出したぞ!
156 :
デフォルトの名無しさん :2008/09/11(木) 23:39:51
DLLの場合は、ポインタchar *で渡すので同時にサイズを指定できるんです。 exeはファイルしか入力できないので、そのままだと1G全部処理してしまいます。 なんとかなりますか?
通信しろよ
158 :
デフォルトの名無しさん :2008/09/11(木) 23:48:10
まずこれがわかりません。 1Gのファイルを先頭100Mだけ残して縮めるのはどうしたらいいですか? あと、100Mと900Mのファイルをコピー無しに連結するのはどうしたらいいですか? どちらも書き込み不可にしておけば目的を達成できます。
うぜぇな。 しらねぇよ。 NTFSとMFTでもググって勝手にやれ。
>>156 154無視かよ、俺じゃないけど。
それはEXEだから、DLLだから、という問題ではない。
EXEでもファイル名と、そのうち何バイト目から何バイト目だけを処理するって
オプションを指定できるようになっているものだってあるし、
DLLでも\0終端文字列を受け取るので、バイト数を直接的に指定できないってものもある。
バイナリデータならサイズ指定出来るのは普通ですよ。あとEXEにファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では? 縮小、結合方法を教えてもらいたいです。
constの付いたポインタは、const_cast使えばconstをはずせますが、 constの付いたポインタでない普通の変数(intとかdoubleとか)のconstを 一時的にはずす方法ってありますか?
*(type-name *)&variable = rvalue const int i = 10; *(int *)&i = 20; i = 30; 見なかったことにしてくれ
int& j = *const_cast<int*>(&i);
>>164 int& j = const_cast<int&>(i);でおk
>>161 関数にファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では?
って言ってるのと同じに見える
で、知りたいのは
・1つのファイルを、メモリに読み込むことなく分割する方法
・2つのファイルを、メモリに読み込むことなく結合する方法
ってこと?それならたぶん無理だと思う
そもそも、ファイルの内容をメモリに読み込まないと、ファイルの操作ができないから
>>138 を見ると、どこで100M分余計にメモリを食うのかわからない。
dll なり exe なりに渡すとコピーが発生するって事?
>>142 からそんな風に感じたんだけど。
でも
>>149 見ると、その dll や exe が受け取ったデータのコピーを取るとは思えない。
ファイルの中身をメモリに読み込むのが『余計』だと考えてるなら、これは余計じゃないんで効率化は無理
10Mずつ読み込むとか、そういう解決方法しかないと思うよ
結論:何をしてるのか、何がしたいのか、が分からない。今やってることをそのまま書いた方が分かりやすいかもよ
167 :
162 :2008/09/12(金) 01:52:35
inodeでぐぐる?
169 :
162 :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 という感じ(一部省略)になります。 なんとなく分かるのですが、完全には解読できません。 この表記の見方、もしくは解説サイトなどありましたら教えて下さい。
typeid(Type).name()はoperator=とoperator!=で比較するしか 意味がない。 返される文字列は処理系依存。だが異なる型は異なる文字列 になる事は保証されている。
171 :
169 :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()をうまく解読できればと思いました。
方向性自体ダメですか?
ダメダメだね。name()はそんなことに使えない。 それこそ"type0", "type1"みたいな連番でも構わないわけだし。 素直に特殊化で頑張ってください。
173 :
169 :2008/09/12(金) 03:47:41
>>172 ありがとうございます。
便利なの見付けたと思ったのですが、
>それこそ"type0", "type1"みたいな連番でも構わない
その通りですね。
出直してきます。m(_ _)m
PERL RUBY Pythonをcから使いたいとき、どれが最も必要なファイルが少なく済みますか? 合計のファイルサイズが小さい順に押してください。
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 番目の引数を '' から '&' に変換できません。」とでます。
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>のです。 もっと高速に処理できるコードがあったら、そちらもよろしくお願いします。
実測したわけじゃないが、Cライブラリのfread fwriteを使った方が速いらしい。
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で何を渡せばいいのでしょうか? 調べたのですが重大だけが見つかりませんでした。。。
fread/fwriteは移植用で実際はネイティブのAPIを呼ぶ。 ネイティブAPIを避けるため、普通ならfwriteを呼ぶのがいい。
Windowsでスクロール付きのテキスト表示エリアを簡単に作れるライブラリはありませんか?
186 :
デフォルトの名無しさん :2008/09/12(金) 10:55:06
ありがとうございます。 fwriteでがんばります。
トンクス
>>186 fread、fwriteは2Gまでの制限があるから注意な
>>178 CreateFileするときにSECURITY_ATTRIBUTESで継承を許可(bInheritHandle = TRUE)にしておけば、
CuplicateHandleは要らないはず。
2の26乗 (=N) 個の配列どおしの要素を掛けた物の総和を求めたいと思います。 (a,b,c・・・) (x,y,z・・・)とするとき、ax + by + cz + ・・・です。 これを4スレッドに分けて計算したら早くなりますでしょうか? 0〜N/4、 N/4+1〜・・・と分割して和を求めるってことです。
シングルコアでやったらまず間違いなく遅くなる
>>192 寧ろ4で割った余りが0,1,2,3でスレッドを分けた方が早いかもよ。
特にIntelの2コアや4コアの場合。
>>192 Pen4,Core2Duo,AMD系ではおそらく逆に遅くなる
Core2Quadなら上手くやれば早くなる
環境依存だけどプロセスの優先度上げて、
コンテキストスイッチ減らした方が良いんじゃない?
>>192 スレッド数が物理コア数以下なら速くなるはずだけど
その処理内容だとメモリアクセスがボトルネックになりそう。
SIMDなんかがある環境ならそれ使うようにオプション指定するなり
インラインアセンブラ使うのもいいんじゃないか。
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];}
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;}
手間の掛かる処理にしてみました。浮動小数点の割り算。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];}
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;}
1CPUなのに2スレッドは凄い効果あります。およそ倍速出ます。 何度もメモリ読んでいるうちに、キャッシュが効いたりするのではと思い 一番最後にもう一度1スレッドを計算しても速度ははじめと同じでした。
>>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;}
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;}
CPUによって違うだろ。Core2使ってるの? Athlon64だとどちらも1スレッド>2スレッド>4スレッドとなる。 近々X2かPhenom買うのでそちらも試してみたい。
初期のセレロンの1コア2GHzですよ
NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ
すみません、初心者な私に教えて下さい。 #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 する には、どのように書けばよいのでしょう。
#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; }
>>208 returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。
そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。
「まだ」C++標準ではないのでね。
211 :
207 :2008/09/14(日) 00:57:04
ぐっは、難しい…。 もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。 でも一つずつ読解してみます。 ありがとうございました!
ついでに言っておくけど mylist.push_back( new C(0) ); はpush_backに失敗するとnew C(0)したオブジェクトがリークする
214 :
207 :2008/09/14(日) 01:18:29
なるほど…。 ということは、push_back() の引数として直接与えるんじゃなくて、 いったん C *p = new C(0); して、とりあえず mylist.push_back( p ); としてみて、 std::bad_alloc が投げられたらあきらめて delete する、 みたいな感じでしょうか。
>>215 わかりました。宿題スレに行きます。
すいませんでした。ご迷惑お掛けしました。
ちなみに、内容はエンコドとデコドで
テキストを吐き出し、オプションでプリントするみたいな感じです。
失礼しました。
見たけどコメントついてるじゃん 無理せずに単位落としたら?
>>214 bad_allocが投げられたらdeleteする必要はないぞ。
219 :
207 :2008/09/14(日) 01:42:05
>>218 了解しました。
どうもありがとうございます。
221 :
207 :2008/09/14(日) 02:29:02
>>220 あ、やっぱ delete(p); は必要ですか。
ていうか私が言葉足らずでした。
std::bad_alloc例外が投げられるという事はメモリ確保に 失敗しているのだから、deleteしたらまずいだろう
こういうことだろ。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();
>>223 ああそういう意味かごめん
そりゃdeleteは必要だわ
newとpush_backを分離する事を前提とした
話なのね
>>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;
}
}
確か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 :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」のところ。
ありがとうございます。
>>227 boostって静的リンク(?)だから大丈夫じゃないの?
Test.hのtemplate <typename T>class Testのメンバ関数として friend ostream &operator << (ostream &str, T const &val) { return str << val ; } C++はあまり使ったことはないけど、これでも追加するといいかも エロいひとの解答待つか
>>225 list だと、こうじゃなかったっけ?
ごめん。調べないで書いてる。
for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) {
if ((*it)->ic == 1) {
delete *it;
mylist.erase(it++);
} else {
++it;
}
}
erase したイテレータを++するのは未定義動作じゃなかったか?
>>232 mylist.erase(it++);
はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。
listのeraseでは消したイテレータ以外は無効にならないから。
戻り値が次の要素じゃなかったっけ? it = mylist.erase(it);
listなら++でも安全だとしても、別なコンテナに変えられる可能性も 考慮して、戻りを代入するべきでは。
>>235 set,multissetとかだとeraseの戻り値の型がvoidだったりするから、
it == hoge.eraseが書けないときもある。
vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も
考慮してit++にするべきでは。
238 :
229 :2008/09/14(日) 22:53:23
>>230 ありがとうございます。
<<のオーバーロードで修正がベスト何ですかね。
vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end) とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?
vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。 mapやsetはeraseの戻り値がvoidなので、it++するしかない。 シーケンスコンテナと連想コンテナの取り替えを想定するのは 無理があるって事だな。
effective STL に同じような話がある
Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど VC++が入ってないPCでも実行する方法を教えてください。
243 :
207 :2008/09/15(月) 10:29:22
>>225 氏の方法でも
>>231 氏の方法でもうまくいきました。
ありがとうございます。
「別なコンテナに変える」ということの意味はまだ良くわからないので、
引き続き勉強します。
>>241 > effective STL に同じような話がある
なるほど、早速ポチりました。
>>244 VC++がインストールされているPCではエラーがなく実行できます。
>>242 まずはエラーの内容を示さないと・・・・
MFC7のdllがないとかか。
SideBySide絡みじゃ? MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも
>>246 ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。
何で初心者って「エラーが出ます」「うまくいきません」 「動きません」って言って具体的なこと書かないんだろうな。
>>250 今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。
VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。
>>251 基本的によく分からないエラーが出たら、
スクリーンショットを撮る事。
そのプログラムのプロジェクトプロパティの
共通言語ランタイムサポートが「使用しない」以外なら
.NET Framework Runtime をインストールする必要がある。
MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。
構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
254 :
242 :2008/09/15(月) 12:26:45
調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。
ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。
今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。
>>253 今はエラーを確認できないのでスクリーンショットも撮れません。
pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか
>>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 調べてる間にレスがきてしまったので失礼しました。
>>257 自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い
問題が起きたとき、自力で解決出来んだろう
>>259 main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・
WinMain() で始まる windows プログラムなのに、
そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい
>>259 「/MDd」を「/MT」にしてないか?
「/MDd」なら「/MTd」だぞ。MD→MTなんだから。
あとプロジェクトプロパティの左上に構成ってあるだろ。
デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。
まぁ、リリース版だけでも良いと思うけど。
>>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ
2chでスレたてて盛り上げていこうぜ > STLport 日本語の解説サイトも作る
STLport > STLsoft ね。
>>258 こんな感じだそうです。
pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。
267 :
266 :2008/09/15(月) 14:30:56
追記:その状態になってもダイアログを出したくないのです
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 再現出来ないな。何が違うんだろう。
ウィンドウプロジェクトにするとなります。
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; }
C++で数値計算を行なっていて、 計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。 上記とは一切関係ない部分のバグを取って再度実行したら、 ファイルへの出力が途中からされなくなってしまいました。 1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。 出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。 このような症状の場合、どのような原因が考えられるか教えていただけませんか?
・ストレージの空き容量が不足している。
・ストリームをフラッシュしていない(勿論、クローズしていない)。
そんなわけ・・・・マジだ、吊ってきます orz エラーを出す方法とかありますか?
380回のあたりで異常な文字列を吐いてしまって fstreamがエラー状態になっているとか。
>>270 TESTにきちんとコピーコンストラクタとoperator =を設ける。
277 :
271 :2008/09/15(月) 17:25:52
of.exceptions(badbit| failbit)としておけば、例外投げてくれる。 例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。
279 :
242 :2008/09/15(月) 17:40:36
ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。 皆様ありがとうございます。
>>270 ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。
このプログラムで値が変わるのはなぜですか? 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; }
自己解決しました
自己解決しませんでした。 値が変わります? なぜですか? 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;
自己解決しました
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;}
MultiByteToWideCharの使い方が間違っているからです
正しい使い方はどうすればできますか
MSDNをよく読む
サイズが決まっていないchar*型の文字列が10個ていどあって 一致する文字が存在するか見つける高速な方法はSTLのmapですか。 一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。
Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。
Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による
擬似 Trieといった 他の Trie の実装に比べ高速に動作します.
オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが,
Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています.
http://chasen.org/~taku/software/darts/
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;}
#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
訂正: -O2 -> -O0
unordred_mapのがいいよ多分
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;}
なんにもいれずにそのコードを実行しようとしてるようなレベルですか?
VC2008のhash_mapはstdext名前空間に入ってるのか コンパイルできずにしばらく悩んだ それにしてもDinkumwareは遅い・・・
>>298 SP1当てればstd::tr1::unordered_mapも使えるよ。
もちろん性能は変わらないだろうけど。
ある変数に連動して、複数のvectorのサイズを変更できますか? 自分で増減させると面倒です。
自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。
関数って良いよね…… 造形が凄くソソるよね……
free(normal) functionより major(static) function objectの方がそそります^q^
もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな
a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。 このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。 どのように計算するのが速いでしょうか? 100項目程度あるとします。
つTaylor展開の低次の項
log経由で計算するのが速いと思うのですが・・・
>>306 C++のソース教えてください
2つの場合に限定してたとえば (1+a)^x (1+b)^y の(x+y)乗根 をRとおくと (x+y)logR=xlog(1+a)+ylog(1+b)となり、logの計算量がどの位かかるかってことです。
>>307 ソースはめんどくさい
x+y+z+... = Sとおくと、答えはおよそ1+(ax+by+cz+...)/S
a<<1の時の近似式(1+a)^x=1+axを使って、a,b,c,...の1次の項だけ取り出すとこうなる
logとか使うまでもない
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); }
>>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);
}
はじめとaとxの関係が違っているところが原因かもしれません 見直してきます
誤差は大体、max(a[n])^2*nくらいで抑えられるはず
あるていど近づきました。 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); }
しかし、おかしい点があります。 教えてもらった式は、小さい項を無視しているので 値が小さくなるはずですが、計算結果が他より大きいです。 あと、(1+A) (1+B) (1+C) ・・・のS乗根は、なぜ上のような式になりますか? Aの値は1より大きいかも知れないですが・・・すると高次の項のほうが大きいかもしれません。 (Aはaxなどです。)
というか、100項目程度の話じゃなかったのか? N=200000でやったら、そりゃ誤差でかくなるの当たり前
要するに求めるのは(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だよな
トンクス そういうことですか わかりました
319 :
デフォルトの名無しさん :2008/09/18(木) 13:14:45
質問です。 1バイト文字列とwchar_t文字列 (特にwchar_t型文字で可)はどのように 変換できますか? 自作できますか?
>>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
またまたご冗談を
下記のようなプログラムで、どのように記述すれば、正常に動作するのでしょうか? やりたいことは、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;の部分の記述が悪いと思うのですが、どうすればいいでしょうか?
>>327 コンパイルできてる?
gulngUpdataAddressの型が気になる。
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です。
ロケール設定してないからだろ
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
ローカル変数は有効範囲をすぎると無くなります
338 :
デフォルトの名無しさん :2008/09/18(木) 17:50:16
コンパイラ限定の命令は使わないようにしよう WinならAPIでいいだろう 無理なら、boostとかから探すとか
BCC って SEH の __try と __finary を実装しているのだろうか? まず表面化することないだろうけどね Win32例外
>>339 __tryは実装していない。__finallyのみ実装しているが
これは__tryに対応するものではない。
>>340 ありがとー
WinAPI だからといって必ずしも全て利用可能ではない ってことか
ま、SEHはかなり特殊だから仕方ない部分ではあるな
342 :
336 :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 )みたいな感じで渡しています。 しかしそれだと、全ての子クラスにセットしなくてはならず、非常に手間がかかっています。 実際はデバッグクラス以外にも、全ての子クラスで使いたいクラスが数個あります。 良い方法があったら教えてください
単一のデバッグクラスのインスタンスを子クラスで共有するの?
348 :
346 :2008/09/18(木) 21:25:09
>>347 はい。全ての子クラスで1つのデバッグクラスを操作したいのです。
デバッグでそれぞれのクラスのデータを集計し、統計のようなものを出したいデバッグクラスなので、単一の方向でお願いします。
基底クラスのインナークラスとしてデバッグクラスを記述して、 基底クラスがそのデバッグクラスを包含するのじゃ駄目なの?
デバッグクラスをグローバルにすればいいだけじゃないの? それかシングルトン
俺もグローバルで良いと思うけど。 まぁグローバル変数が嫌なら、 デバッグクラスかそれへのポインタの staticなメンバ変数でも用意すれば良いんじゃね?
流れが分からん デバッグクラスが派生クラスにかかわらず単一なのは分かった そのインスタンスは1個だけ? それとも各インスタンスにつき1個ずつ? いずれにしてもデバッグクラスを基底クラスの内部クラスとして定義して、 基底クラスの通常のメンバなり、静的メンバなりにそのデバッグクラスのインスタンスを持たせればいいと思うが
親クラスにstaticで持たせるのが正解の気がする まだエスパー歴が浅いから間違ってるかもしれんが
文字の上下4ビットを入れ替える関数(RevChr)を作成しなさい。 ただし、RevChr関数の命令は1行で書かなくてはいけません。←ここ重要! できた人から、提出するように。 って問題だされたんだけど。
>>354 強引にやってみた。アホだ、俺。
(char
>>4 + char<<4)
優先順位・・・
357 :
デフォルトの名無しさん :2008/09/19(金) 02:28:18
319だけど、wcharをcharに変換する速度は、 WideCharToMultiByte 250ms wcstombs 1720ms あらかじめ計算しておいた配列を使う 2170ms となって圧倒的にwinAPIが速かったです。 前にローケル設定しなくてwcstombsが速いとか間違えを書きました。
>>309 その後、実際につかう数字で計算してみたところ、3次の項までは必要となりました。
しかし、logで計算するより5倍は速いので助かりました。
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) とすれば出来たのですが、やっぱり何か違う気がします。 何かいい表現方法は無いでしょうか?
std::for_each(v.begin(), v.end(), std::bind1st(std::mem_fun(&sum::operator ()), &s)); なんで代入したくないのか知らんが、↓のように書いたほうがシンプルでいいと思うけど。 sum s = for_each(v.begin(), v.end(), sum());
なんでsumを使うか知らないが、↓のように書いたほうがスンプルでいいと思うけど。 int sum = std::accumulate(v.begin(), v.end(), 0, std::plus<int>());
>for_each を使って、int型の配列 v の集計をしなさいという問題なので、
>>361 for_each を使って、集計をしなさい
そうですかごめんなさい早漏にて候
>>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を継承すること。
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); };
>>366 × pleyer_type
○ player_type
ってことだと思うよ
……死にたいorz 宣言と定義が違うって事だったんですか、回答有り難うございました
>>359 int s = for_each(v.begin(),v.end(),sum()).get();
370 :
359 :2008/09/19(金) 12:41:58
みなさん、ありがとうございました。
>>365 が
いいと思い、(自分の処理系ではTR1が使えないので)boost::refでやってみたら、
> error C2064: 1 引数を取り込む関数には評価されません。
と出て、ダメでした。
TR1とboostはほとんど一緒と聞いていたのに残念でした。
>>370 TR1は、確かにBoostを念頭においているとはいえ、より考えられている。
というのも、Boostは単にreference_wrapperで包んでいるに過ぎないので、
このままでは関数オブジェクトとして、operator ()を適用できない。
そこで、TR1では、メタプログラミングを駆使して、単項か二項として呼べるようになっている。
この出力は0になります。STLの新規のresizeは常に初期化されますか? vector<int> r; r.push_back(1); r.push_back(2); r.resize(1); r.resize(2); cout<<r[1];
されます
dクスです
これでどんな環境でも、メモリは解放されますか? クラス側で解放処理をしなくても、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(); }
STLのメモリ解放は変な点がありますから心配です。 というのも、vectorでclear();使っても全く解放できないからです。swapしかないので。
ブロックでくくれば抜けたとき解放されるだろ
何も変な点なんてねぇよ。 clearやresizeでメモリを解放する必要などない。
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); とすれば警告は出ないのですが、何が問題となっているのでしょうか?
>>376 効率を上げるために、開放されないよ。
clearするってことは、次に直ぐ追加される可能性があるかもしれないってことで、バッファっは保持されるんだ。
AUX CON NUL PRN をファイル名に使うとバグりますか?
バグるかもしれないし、バグら無いかもしれない
DOSの予約デバイス名が入っていたときに処理がおかしくなる代表例を教えてください。 WindowsXP以上でAPIを使ったときバグりますか?
うちのパソコンだと、AUXを名前に含めても、エラーが出ずに エクスプローラーで書き換えられます。 問題出ますか?
一意的な絶対パスに変換する方法教えてください。 下の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;
自己解決しました char p[]="C:\\////\\hoge_hoge\\..\\windows\\Notepad.exe"; char q[300]; GetFullPathName(p, 300, q, NULL); printf("%s\n", q);
すみません。 wchar_t型配列に、世界各国語と英字の大文字・小文字が入っているとき 大文字を小文字に変換するにはどうしたら良いでしょうか?
towlower
すみません。このようにしたいんです。 中国語・・・ABCDF・・・中国語 →中国語・・・abcde・・・中国語 ロシア語・・・FUNCTION・・・ロシア語 →ロシア語・・・function・・・ロシア語
こんな感じ? wchar_t us_tolower(wchar_t c) { if(c<='A' && c>='Z') { c=c-'A'+'a'; } return c; }
unicodeて、どのOS、コンパイラでもアルファベットはASCIIと同じですか?
何?
たまにはEBCDICも思い出してね
コンパイルした環境に依存しないで、たとえば日本のVC++でコンパイルして、 ロシアや中国でも小文字になりますか?
BCCでコンパイル中に任意のメッセージ書き出せるマクロみたいのってないよね?
GetUserDefaultLCID と LCMapString でやってみます。
intel c++はisostream入っていませんか?
日本語体験版だと入ってないのかな? なんかヘッダが足らないみたいです インストールの失敗? 英語体験版をいれて日本語で上書きしたらいいかな?
わかりました。VC++2008との統合が失敗してたのですがそれが原因みたいです。 wikiより。 実行に必要なライブラリやリンカなどは付属していないため、他のコンパイラの環境に寄生した形で実行される。 WindowsではMicrosoft Visual Studioが、LinuxではGCCが必要である。
isostream?
403 :
デフォルトの名無しさん :2008/09/20(土) 17:52:54
あるところからC++のソースコードをダウンロードして、 そのフォルダの中のsample.vcprojというのを実行すると、 VisualStadioが起動しました。 サンプルコードのはずなので、F5を押して実行すると、 「シンボル情報がありません:firefox.exeのデバッグ情報が見つからないか、 または一致しません。シンボルが読み込まれていません」 というウィンドウが表示されました。どうすればよいでしょうか?
あるところって、どこ?
405 :
403 :2008/09/20(土) 18:10:55
プロジェクトの構成がReleaseになってるだけじゃないの? Ctrl+F5とかで実行したら?
407 :
403 :2008/09/20(土) 18:36:34
406さん プロジェクトの構成はDebugでした。 Ctrl+F5とすると、Firefoxが新しく起動しました。 プロジェクトの構成をReleaseにしてみて、 F5を押すと「デバッグセッションの実行可能ファイル」というウィンドウが出てきて、 「実行可能ファイル名」を選ばされました。 よく分からず、既定のWebブラウザを選んで実行しました。 それを過去にもやったため、Firefoxが動いているんだと思います。 「デバッグセッションの実行可能ファイル名」を何にすればよかったのでしょうか?
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」がありますがちょっと違う。 これを読めばいいのか、または別のところにデータがあるのか。。。
test1-data.pts,test1-query.pts,test2-data.pts,test2-query.pts ってのがあるみたいだけど
俺が落としたヤツだと「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さん 長いことありがとうございました。 後は自分で進んでみます。
逆アセンブラしてCのソースに貼り付けたら、動かせますか? コマンドラインの引数を、関数の引数に変換できますか
>逆アセンブラしてCのソースに貼り付けたら、動かせますか? そのまま貼り付けてコンパイルしたら動かないね いやそも逆アセンブラするってなんだよって話だが >コマンドラインの引数を、関数の引数に変換できますか main関数の引数になります
DOSプロンプトで動くツールで、ソースが無いものをパクリたいのですが・・ できないですか? test.exe ファイル名 > 出力名 というツールを char * test(char *ch){ アセンブラ } という関数に出来ませんか
無理?
417 :
デフォルトの名無しさん :2008/09/20(土) 20:59:24
普通に通信して連携すれば?
速度はひとつにした方が速いと思うんですが
>>415 関数が export されていて、インターフェイスが公開されているなら簡単にできるが、それ以外だと面倒
グローバル変数を使ってたりしたら「自作のほうが楽じゃね?」ってなるかもw
#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 :2008/09/21(日) 03:17:12
すみません、みすって投稿してしましました。 上のは途中までのプログラムなのですが コンパイルすると 22: 浮動小数点の不正な使用(関数 main ) 25: 浮動小数点の不正な使用(関数 main ) とでます。 なぜでしょうか?
小数を整数で割った余りって何なんだよ。 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)での開発に使用しようかと思っています。 よろしくお願いします。
そんなもの処理系によるとしか
Cで@や$や`記号が使われなかった理由ってあるんですか。
これ以上トリグラフ増やすのいやだったんじゃね
>>424 > それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、
> それらを指すポインタがteststrに格納されるのでしょうか?
そのとおり。
文字列はROM、ポインタはRAMに置かれる。
>>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 文字列リテラルは書き換えできないから char const で受け取らないとあぶない。
マクロの中で " をあらわすにはどうしたらいいですか? エスケープを使うとエラーになり、そのまま使うと文字列リテラルとして解釈されてしまいます。。。
435 :
デフォルトの名無しさん :2008/09/21(日) 15:35:43
つまり foo(const char* filename); と宣言すればよいということでしょうか?
>>434 状況が見えんな。エラーになるコードとエラーメッセージをどうぞ。
現在二次元配列と2重ループを習っている超初心者です 質問なのですが列和と行和を求めるプログラムで、 列和も行和も同じループ内で処理できるのは何故なのでしょうか?
>>435 foo の中で filename の指す先を書き換えないんなら、それでいいはず。
っていうか、試せよ。
>>437 それだけ言われてもわかんねーよw
二次元配列を一次元配列にキャストしてるとか?
441 :
437 :2008/09/21(日) 15:47:42
すみません・・・どう表現していいかわからず整理しないまま打ってしまいました 考察の一部なんですが、これ以外文章にしようがなくて困っています プログラムをあげたほうがいいでしょうか?
>>441 まだ相談したいならコード晒せ。あの文章じゃ無理だ。
コード晒せば答えが得られる保証はないけどな。
簡単なことだ 二重ループは行列の全ての要素にアクセスするための手段でしかないから その扱いについては制限されない あとは各行和各列和を格納する配列を定義して要素に応じてそれぞれ適切に加算していくだけ
444 :
441 :2008/09/21(日) 16:07:01
初心者丸出しで長ったらしいプログラムなのでろだにあげてみました。 No.7729です。よろしくお願いします。
for(j=0;j<4;j++) for(i=0;i<3;i++) table[3][j]+=table[i][j]; これ行和しか求めてないよ。ソース中には列和を求める部分は見当たらなかったけど。
446 :
444 :2008/09/21(日) 18:52:32
>>445 列和の計算を入れ忘れている事に気付きました。ありがとうございます
この行和と列和を求めるプログラムの考察で、
列和も行和も同じループ内で処理できるのは何故かと言う問いなのですが
理由は
>>443 でOKもらえますかね・・・?
>>446 >>443 は日本語がちょっとおかしいのでちゃんとした文章を自分で考えてくれろ
正解かどうかは知らないし
すいません質問なのですが、とあるクラスのprotectedメンバはその派生クラスの派生クラスからはアクセスできないんでしょうか?? MinGWで色々やっているのですが、間接継承の関係にあるクラスのprotectedメンバにアクセスしているプロググラムを実行すると、フリーズしてしまいます。 アドバイス頂けると幸いです。
>>448 フリーズするならそれはまったく別の問題。
>>448 フリーズならどこかで無限ループしてるんじゃ
VCの_COM_SMARTPTR_TYPEDEFなんですけど これで作ったCOMのスマートポインタもAttachで入れないと カウントがずれるですか?
頻繁に使われる関数で常にメモリを100Kほど確保して置きたいのですが どのようにしたら良いですか? マルチスレッド対応の方法教えてください こういう警告と同じ箇所で英語のエラーがでます。 マルチスレッド アプリケーションのコンストラクタでローカル静的変数を使うことは危険
100K みたいに大きいバッファは マルチスレッド関係なく動的に確保しる。
頻繁に使うから、再確保はしないでそのままにしておきたいのですが。 2個以上同時に使われるとバッファが壊れますが、どうしたらいいでしょうか?
確保してから、アプリケーションが終了する直前までずっと確保したままでいい。 とりあえずマルチスレッドプログラムを組む場合は同期オブジェクトを勉強してください。
寝る前だけど質問させてもらいます
C++で横スクロールするアクションゲームっぽいもの
作ってるのですがキャラクターをクラスで扱っていて
場面ごとの関数1つ1つにクラスの変数やメソッドを使うから
インスタンス定義ってのをやらなきゃいけないようで
そうするとそのせいで場面の移り変わりのときに
それまで使っていた変数が初期化されてしまって
ttp://www.dotup.org/uploda/www.dotup.org0173.jpg このようになってしまいますよね
キャラクターのクラスだけでなく他にも場面やステージを
隔てて初期値に戻ると困るものを保存したり引き継いだり
できればいいのですがどうすればいいのでしょうか・・・
>>457 保存したり引き継いだりすればいいよ。
コンストラクタ含めて関数には引数が渡せるだろ。
その画像のプレゼン能力はすばらしい。
459 :
424 :2008/09/22(月) 01:43:49
スコープが広めのリサイクルオブジェクトコンテナ見たいなのを作って、シーン終了時に必要なものを追加 次のシーン初期化時に、シーンのオブジェクトコンテナに移し変える
質問です。 ファイルオープンで、ファイルから値を読込んでもう一つのファイルにその値を書込むプログラムで、 読込用はテキストファイル(.txt)、書込用はバイナリファイル(.bin)を用いました。 上記の2つのファイルサイズは少量ですけど違いました。 この違いは何によるものなんでしょうか。
改行コードじゃない?
読込ファイルの値はスペース区切りでした テキストファイルから「1 2」という値を読み込みバイナリファイルに書き込んで ファイルをエディタで開くと「01 00 00 00 02」と表示されますが、 つまりは書き込みがバイナリファイルだとスペースにもコードがあるから ファイルサイズが大きくなる・・・ということでいいんでしょうか・・・?
>>461 ,463
読み込んで形式変えて書き込んでるんだから、そもそも同じになるわけがないな。
質問です。 他のプロセスのメモリを監視するプログラム作ろうとしています。 ReadProcessMemoryで値を取得することはできたのですが、 できればそのメモリアドレスの値が更新された時に取得を実行したいです。 この「メモリアドレスの値が更新された」というイベントを取得することは可能でしょうか?
>>451 コンストラクタならfalseー緒に渡せば、AddRefしないよ。
operator=は無理だな。
468 :
448 :2008/09/22(月) 12:19:03
327です。 >329 ありがとうございます。 u_char *ucharAdr; ucharAdr = (u_char *)(gulngUpdataAddress & 0x0fffffff) + 0x0c800000; memcpy( ucharAdr, gushtUpdataArea, gulngUpdataDataCount * sizeof(short)); で、いけました。
CImageで(a,b)から(x,y)まで直線を引く方法はありませんか?? MoveTo、LineToを使用せずに描きたいです。
なんでMoveTo、LineToを使用したくないの?
>>470 おいらのCImageなら、メンバにLine(CPoint from, CPoint to)があるからそれを使えるよ。
でも、あんたの言っているCImageにそれがあるかどうかは知らんけどね。
const char str1[] = "str"; const char * str2 = "str"; "str"が配置されるのは、前者の場合、配列に格納するコードのところ 後者では文字列を置いておくところだと思うのですが、どういうときに、どちらを選べばいいのでしょうか 自分で考えたところでは、 ・上の場合は、コンパイル時に配列のサイズが決まるのでstrlenなどを使う必要がない ・下の場合は、自動変数の確保がポインタだけですむ(速い?) というちがいだと思うのですが、ほかにも違いがあるのでしょうか
>>473 後者は str2 = "another" のような代入が可能になってしまう。たぶん意図したものじゃないだろう。
static const char str3[] = "str";
↑これなら挙げられた前者と同じメリットを得つつ、後者のメリットを上回る(自動変数の確保はゼロ)。
const char * const str2
>>474-475 ありがとうございます。
475さんのはstr2が同じものをさし続けるようにするのですね。
474さんのは静的変数の初期化に、コストを預けてるわけですね。
>>476 str3 の初期化にコストなんか要らないよ。どのケースでも必要になる文字列リテラルの
実体を直接割り付ければいいだけ。
ここの場所でC2614のエラーが起きます。 クラスや構造体の初期化子リストに表示できるのは、メンバか基本クラスだけです。 規定クラスのメンバはどうやって初期化するですか? class A { public: A(int apple) protected: int m_banana; } class B : public B { B(int apple) : A(apple), m_banana(8) ←ここ { } }
基底クラスのコンストラクタで行う。 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) { } };
できました。 ども
482 :
デフォルトの名無しさん :2008/09/24(水) 07:57:18
VC++2005を利用しています 例外を勉強しているのですが、例外を発生させたときに、 catchで例外を処理しても、デバッガに例外があったことが出力されます catchで例外を処理するときは、 デバッガの出力に例外が発生したことが出力されるのを防ぎたいですが、どのようにすればいいでしょうか
>>482 出力って、例外時のデバッガのダイアログ?だったら、デバッグ->例外で設定できる
デバッグ出力の例外のレポートだったら気にするな。レポートが出すぎて困るのだったら例外の使い方が間違っている。
484 :
482 :2008/09/24(水) 13:18:40
>>483 れす、ありがとうございます。後者です。
例外のつかいかたについては勉強していくところです。
もし、テストケースとかを今後記述するような場合に、デバッグ出力でOFFにできないのか探しています。
>>482 Visual Studio のスレで聞いたほうがいいんじゃないかな?
486 :
346 :2008/09/24(水) 14:42:55
>>347-353 超連休で返事が遅くなって申し訳ない。レスありがとう。
グローバルとstaticがいい感じっぽいので、両方試してみます。
487 :
482 :2008/09/24(水) 15:56:25
private List<ISchedule> zTasks = new List<ISchedule>(); これを同じことを NET 1.1でやりたいんですが どうすればいいんですか?
ArrayList
>>489 すいません><
具体的なコードを教えてくれると助かります^^;
C#スレ行けよ
tchar.hをインクルードしてあるのですが、コンパイルすると、_tstofが未定義の関数なるのは何故でしょうか?
>>492 ちゃんと確かめて無いので間違ってるかもだけど、
_tstofは内部でatofや_wtofを使ってるので、それらを使う
ために必要な<stdlib.h><math.h><wchar.h>をincludeする必要があったかも?
>>493 その三つをインクルードしてみましたけど駄目でした。
環境の問題でこういう事ってありますかね?
スペルはちゃんと合ってる?
BCC Developer使ってるんですけど、そのデバッガのTurbo Debugger がダウンロードできません どなたか入手方法教えてください
自己解決しました すいませんでした
turbodebugger.exe
>>492 includeする順番を変えてみたらどうだろう?
tcharではなかったかもしれないけど、以前にそんな感じの現象になったことがある。
そのときは、なにかのバージョン番号とかが順番によっては未定義になって
起きた現象だった。tchar.hの中をみて、どのように定義されているか確認すると
いいかもね。
VC++2008は.NETの関数を使えるんですか?
自己解決しました C++/CLI言語で出来ることがわかりました
503 :
デフォルトの名無しさん :2008/09/26(金) 19:45:12
動的な配列を作るにあたって、 引数付きコンストラクタを呼び出したいんですが、何か方法はありますか? Const なメンバ変数のために初期化リストを使いたいんですが・・・。 CHoge *hoge; hoge = new CHoge[2] //ここでHoge( X )のように引数を指定したい
ない
0xかCLIでなら・・・・・・
プロパティページの中にスライダーコントロールをつけたいのですが setRangeをする場所がわかりません。 コンストラクタの中でやるとエラーで落ちてしまいます。 OnInitDialogでやっても何もダメでした。 何かよい方法は無いでしょうか? IMPLEMENT_DYNAMIC(CPropOption, CPropertyPage) CPropOption::CPropOption() : CPropertyPage(CPropOption::IDD) , m_xvEditPenthick(_T("")) , m_xvSliderPenthick(0) { // m_xcSliderPenthick.SetRange(0,10); //なぜかこれをつけると壊れる } VC 2003です
DLLをlibにするテクありませんか?
509 :
デフォルトの名無しさん :2008/09/27(土) 07:55:01
すみません。質問なんですけど、charとwchar_tを比べたとき、charでは表せない文字やファイル名はありますか? VC++2008ではchar型は、SJISかEUCであってUNICODEは表せませんか?
char型に入るのは英数字とあといくらかなのでsjisとかeucだとか言う時点でなんかおかしい
511 :
デフォルトの名無しさん :2008/09/27(土) 08:03:10
char配列でおねがいします
>>509 charは只の8bitの数値。それをどの文字コードで解釈するかってこと。
文字コード表を比較してください
514 :
デフォルトの名無しさん :2008/09/27(土) 13:43:04
dクス
クラスが保持するstaticメンバ関数から 同一クラスのprivateメンバ変数へアクセスできない 書き方が悪いのか、それともそういうもんなの?
実体を渡せよ 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;
}
こんな感じか
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> >)で管理するのが普通ですか。
>>518 listやset、mapはpush_back(insert)しても新たにコピーされることは無い
ただまぁvectorと同じようには使えないので、boost::ptr_vectorあたりがお手軽か?
>>518 そのとおり、shared_ptrが無難
クラスAのメンバの配列を動的確保できるようにnewとdelete用の関数を作りました。 そうするとクラスAに全く関係のないクラスBのメンバの値がおかしくなりました。 調べていくと、 クラスBのコンストラクタで初期化完了 ↓ クラスAのコンストラクタでnewを使う ↓ クラスBのメンバの値がおかしくなる という流れでした。 これは何が原因なのでしょうか? ちなみにクラスAのnew用関数ではクラスBは全く使用していません。
クラスBのデストラクタにブレークポインタ打ってみそ
>>522 プログラム終了時のみにしか呼ばれてませんでした
new用関数て? operator new のオーバーロードをしてるわけじゃないよな
クラスBのインスタンスをウォッチしながらステップ実行してみそ
>>524 多次元配列なのでまとめてるんです
void New()
{
int i;;
for(i = 0; i < MAX; i++)
p[i] = new int [SIZE];
}
こんなのです
全く関係ないところでスタックやヒープを壊してる悪寒
>>525 ググって見たんですけどやり方が今一分かりませんでした。
クラスA・Bどちらのインスタンスもグローバル変数でクラスBのほうが先に作られます。
>>529 pは int *p[SIZEX]; と宣言してます。
>>528 VisualStudioだったら、ウオッチにCLASS Bのインスタンスを表示させてステップ実行すると、値が変わったところで赤くなる。
>>531 クラスAのコンストラクタでnew用の関数が終わったときに値が変わりました。
原因がつかめないのでnewする前にクラスBの値を保存しておいて終わったらそれを代入することにしました。
皆さんありがとうございました。
領域が重なってるんだヤバイ状態だ。 解決してから進まないと、あとで手が着けられない状態になるよ
>>532 MAX > SIZEX
になってない?
>>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"などのアドレスを返す代替手段があればそちらでもかまわないです。 他の部分はほとんどなんとかなったんですがこれだけどうしようもないです。 よろしくお願いします。
>>508 インポートライブラリを作るってこと?できるよ。
環境によって違うけど。
fstreamでパスに日本語を含むファイルを開けないんですが、 std::localeとかimbue()つかってもダメで探してもlocaleのことしか見つかりません。 環境はVC2008使ってるけどやはりVCのバグ?fopenとか_openとか使えってことですかね?
ワイド文字版のコンストラクタを使えばいいよ
ストリーム関連のライブラリは設計段階でダメダメなので使わないほうがいい。 何しろ、一文字は7bitであるという前提が頭からこびりついて離れない西側諸国の連中が作ったんだから。
541 :
538 :2008/09/29(月) 12:24:00
wfstreamでもダメだったんでやはりCライブラリですか
>>541 wfstreamはファイルの「中身」をワイド文字で読み書きしたいときに使うんだ
ファイル名の問題とは関係ない
つうか
>>539 嫁
VC8以降は、fstreamにワイド文字版コンストラクタがあるんだよ
543 :
541 :2008/09/29(月) 12:34:34
つまりfstreamのインスタンス作成のときにアドレスをワイド文字で渡せばおkということですか
544 :
543 :2008/09/29(月) 12:54:55
できましたー
>>542 ご指摘ありです。
>>539 理解できてなくてすません。
ところでVC8以降ってことはVC依存のコンストラクタ?他のビルダーとかだとマルチバイトで指定してもおk?
>>544 少なくとも非標準
他の環境でも利用したいのならboost使え
546 :
544 :2008/09/29(月) 13:14:55
なるほど了解しました。
C++…というかC言語自体が初心者です。 C++の開発環境で、PCに『Visual Studio 2005』が入っていたのでそれを使おうとしたのですが、いまいち上手く使えません。 Visual Studio 2005 について解説しているサイトを見ながら設定し、それにのっているプログラムを丸写ししてみたのですが、ビルドが上手くいかなかったり、実行してもエラーが出たり出なかったりでよくわからない状態です。 これ以外で無料で使えて、それでいて使いやすい開発環境はありますか?
あきらめた方がいいよ
開発環境のせいじゃないだろ。 一歩ずつ進めてみては
>>547 VS2005は簡単な部類だからあきらめないでね。
なんか昔アカデミックのおまけについてたような本だなw
コンパイルができないってのは、独学者がぶつかる最初の壁だろ。 周囲に訊く人間がいなかったら、バカっぽくても画面写真が載りまくりのような本を見るしかない。
その辺は、まともな本ほど載ってないような話題だしな
556 :
536 :2008/09/30(火) 00:40:35
自己レスです。 enum XlReferenceStyle { xlA1 = 1, xlR1C1 = -4150 }; でした。全て解決しました。
557 :
デフォルトの名無しさん :2008/09/30(火) 03:31:12
クラス名をつけたらコンストラクタ出来ますが、クラス名無しで変数だけ定義したら コンストラクタは出来ませんか?
日本語でおk
559 :
デフォルトの名無しさん :2008/09/30(火) 03:47:13
class cls{ int a; public: cls(){・・・} }; というクラスを class { int a; public: } hensuu; と書いた場合に、初期化が出来るか教えてください
それを構造体にしない理由は?
561 :
デフォルトの名無しさん :2008/09/30(火) 07:25:39
>>560 後者にコンストラクタは定義できませんか? 構造体にしないのは初期化したいからですよ。
563 :
デフォルトの名無しさん :2008/09/30(火) 07:29:54
初期化は、代入だけとは限らないですが出来ますか? 普通のプログラムも掛けますか
POD(Plain Old Data)の定義からも、 PODの初期化のルールからもはずれるから初期化されないと思う。 第一privateなint a;はどこからもさわれない、そこで警告なりなりラーなりになるような。
565 :
デフォルトの名無しさん :2008/09/30(火) 07:47:18
クラス名を付ければ、初期化出来ますけど、クラス名無しだと初期化は無理って事ですか?
クラス名のあるなしは関係ない。 グローバル変数としてhensuuがあったら初期化ずみ。 ローカル変数としてhensuuがあったら未初期化。 このへんは普通の変数と同じ考え方でいい。 あとはPODでググる。PODならnewを使った場合にコンストラクタなしでも初期化される。 それから新規の質問以外はsageる。
struct { int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; が出来るのだから デフォルトの公開性が違うだけのclassでも class { public: int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; と出来るだろ。 やったことないけど。
>>567 そこまで書いたらやってみればいいよwww
それでいいはず。 なんでint a; が何でprivateなのだろ。 publicならPODだから、newやhoge xx = {} で初期化可能になる。
570 :
デフォルトの名無しさん :2008/09/30(火) 08:18:42
初期化っていうのはコンストラクタを起動出来るかという質問です。 class cls{ int a; public: cls(){a=10;} }; っていうのは出来ますけど、クラス名無しだと標準のコンストラクタ名が使えないですけど なんとか出来ますか?っていう質問です。
無名ではコンストラクタは指定できない。メンバーをpublicにする。以上。
>>570 無名クラスではコンストラクタは作れないです
もし名前空間を汚染したくないだけであれば無名名前空間を使うのも手です
トンクス
すみません質問良いでしょうか。 関数chk()の戻り値がFALSEになるまで待つにはどうしたらいいですか?
なるべくCPUを使わず、即座に進める方法おねがいします。
自己解決しました。 関数の戻り値を監視するには、定期的に関数を呼び出すしかないようですね。
>>577 戻りが変わった可能性があることをイベントを使って検出してから見にいくといい。
OSのAPIにはそういうイベント関係の関数が多数ある。
>>570 PODをクリアするテンプレートクラスを作って、それをクラスに所有させる。するとデフォルトコンストラクタで初期化できるようになる。
template<class T)
class tclear
{
T a;
public:
tclear()
:a(0)
{
}
};
class X
{
tclear<int> a;
};
ICL10.1(win)でXP32bit用アプリ?をゴニョゴニョしてるんだけど、 SSEのインラインアセンブラとか組み込み関数を使うと、/archとか/Qxとかに関わり無くなぜか勝手に拡張命令を使うみたいなんで困ってます>< インラインアセンブラはともかく組み込み関数は汎用命令で何とかしてくれると思ってたのに・・・ 汎用命令以外吐かないようにする方法を教えてください、よろしくお願いします。
もうSSEの無い環境なんて切り捨ててもいい時期に来てるってことだろ。
そうだな C3 だとハングアップするソフトも結構あるしな ><
いや、SSE2未満なら切捨てでいいと思うけど オレが使いたいのはSSSE3(_mm_hadd_epi16)までなんでチョットまずいかなと・・ 俺自身SSSE3が動かないPCも使ってるし困るんです>< てかQaxがマトモに機能してれば困らない事に気付いたよ!! ICLがコピーと論理演算位しかベクトル化してくれないのが全部悪いんだ!!! 型が複数あると出来ないとか、無理矢理全部intでやったら複雑すぎとかふざけてるとしか思えない てことで普通の自動ベクトル化があるコンパイラ教えてください、お願いします。
空の書き込み可能なテンポラリディレクトリを確保する命令ありますか? WindowsXPです。
GetTempFileName()のフォルダ版ないですか? 存在していない空のフォルダを作りたいのですが
同じ名前のファイルとフォルダは同時に存在できない。
GetTempFileNameで取った名前使ってディレクトリ作れば?
>>587 それは無理。
GetTempFileNameの作ったファイルを消してディレクトリを作らないといけないから、
その間に他のプロセスに割り込まれる可能性がある。
これで出来ました。 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;} }
まちがえました 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;
GetTempdir が使われてないのと
>>588 の意見を全つっぱした理由が気になるな
GetTempFileNameはファイル作らないよ?
>>592 作ったり作らなかったりする。
MSDN嫁あほ
C++なんですけど、(Cも同じでしょうか) グローバル変数でstatic付けるのと付けないのと、どんな違いがあるのでしょうか。
>>594 その名前がコンパイル単位の外から見えるかどうかが変わる。
C++ では無名の namespace に入れるのが推奨されてる。
>>594 つけると静的になり、ファイルスコープになる。
つまり、外部に公開しないで済む。
template< class T > class Base を継承したクラス Derived を作りたいのですが クラス定義はどのように記述すればいいんでしょうか?
template<class T> class Deriv : public Base<T> こうだろうか?
#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(); }
おふっ。 できました。ありがとうございます。
例外を扱うとき場合 実行中どういう例外を吐いたかログを取るような仕組みを組みこんだりするのでしょうか? その場合、どういう方法でログ取りの仕組みを実装するのがよいでしょうか?
SYSLOGでも利用すれば
イベントログも使えば
604 :
594 :2008/10/02(木) 18:21:18
>>595-596 ありがとうございます。
staticはローカル変数でしか使ったことがなく、ちゃんと理解してませんでした
まあ、まず使わん仕様だがな。
質問があります。私は今WindowsGUIプログラムで、WinMainのスレッドでGUIの処理、別に作ったスレッドで ファイルへの書き込みを行っています。一定時間間隔で複数のデータをサンプリングしてファイルへ書き込んで いるのですが、メインスレッド終了時に、同時刻上のデータがすべて書き込み終わっている様にしたいのです。 ファイル書き込みスレッドを終了させた場合、どこまで処理を終えているのか確定できませんが、どのようにコントロール するのが一般的なのでしょうか。よろしくお願いします。
>>606 fflush 相当のことをすればいいんじゃないかと
>>606 書き込みスレッドにイベントを送って、書き込みスレッドがファイルをクローズしその後スレッド終了するようにすればいい。それを待ってwinmainのスレッドを終了させる。
イベントについて調べたところ、これで大丈夫そうです。ありがとうございました。
クラスをリスト化してるのですが クラスの一番最初のメンバ変数をsortを使って 昇順や降順に変更したいと思っています 何かいいやり方はないでしょうか?
reverseのが早いんじゃない? 使えるリストなのかは知らないけど
>>609 豆知識
スレッドの実行が終わると、スレッドのハンドルがシグナル状態になる。結構便利
豆知識ていうか必須知識だろ
>>606 文章の酷さが気になった
もう少し読み書きしようぜ
616 :
デフォルトの名無しさん :2008/10/03(金) 02:04:13
int hoge(int a) { return a++ * ++a; } という関数があるときに hoge(5) とすると、Return値は5×6で30になると思ったんだけど、g++とVC++の両方で 答えが36になりました。これってどうしてでしょうか? どうかお願いします。
>>616 それは未定義動作なのでそういうコードは書いちゃいけないけど、
あえてコンパイラの気持ちを大便するなら、
1. a++を発見。「評価後にaの値を+1する」と覚えておく
2. ++aを発見。「評価前にaの値を+1する」と覚えておく
3. コード生成開始
4. 評価前なのでaの値を+1するコードを生成
5. a*a のコードを生成して、その結果が返り値となるようにする
6. aの値を+1するコードを生成する。意味がないから最適化で削除されるかも。
水に流せってことですか
変な物を放り込むと詰まるという意味も
template < class T > class Hoge; で const の T を受け取った時に、 クラス内部で非 const な T 型を使いたい場合には どうすればいいんでしょう? 例えば Hoge< const string > というように呼ばれたとき、 内部で(非 const な) string 型を扱いたいのです。
すまん、remove_constだね
サンクスです。boostが必要ということは もともと const 修飾された型から 非 const の型を特定するのは 難しいプログラム技術が必要だってことなわけですね・・・。 自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・
>>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が外れる
>>617 未定義動作じゃなくて不定動作だろ。
a++と++aの評価順が決まってない。
>>617 副作用完了点について理解しとかないと泣きを見るよ。
またそうやって「何かをわかってるフリ」したデタラメを書くw
ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」 に改められたね。
>>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 からコンストはずし
のようなコードを書いたわけですが、これが正常なのかどうか…。
コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので
もしかしたらメモリリークでもしてるのでは、と。
スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど プロセスとスレッドの違いが良くわかりませぬ。 スレッドってなんだ?
ここのこと それはスレッド
プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々 スレッド・・・全部のスレッドでひとつのメモリ空間を共有 メモリ空間を共有するので複数のスレッドからひとつの変数を 同時に書き換えたりとかわけわからんことにならぬよう注意せよ セマフォとかは普通にプロセス間でも使えるんじゃ?
>>634 ありがとう
確かに共有メモリがどうの聞いた!
「業務」で未知状態でマルチスレッドか…… ご愁傷様って奴だな
共有メモリとメモリ空間共有とは違うw
えらんツッコミのせいでせっかくの感動が台無しだ
地獄への第一歩で感動とかされても
Windows3.xやWin32sのプロセスはスレッドだったのか
地獄とかやめて 確かに既に炎上してるらしいが
既に炎上してるところに知識のない奴が投入されるのか・・・ ご愁傷様という他ないな
passive hell and death
デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。 だって、どうせ出来上がらないんだから!
const char *hoge[5]={"test","test2","test3","test4","test5"}; というのを宣言します。 char *hoge2; hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・ 教えてください
>>645 そういうのを通さないためのconstです。
明示なcastをしてください。
>コンパイルが通りません エラーになった原因とかコードとかでてるだろ? それを調べてみればここで聞くまでもなく答えはすぐわかるよ。
代入される変数がconstついてなければできるのだと思ってました hoge2 =(char)hoge[3];ですか?
hoge2にconst
char * だろ。 constのポインタをconstでないポインタに代入しようとしてるから。
程よいレベルだとやっぱ群がるなぁ
char hoge2[5] でstrcpy
C++ならSTLのstd::string使うとか
文字列定数を書き換えてはいけない 必ずstrcpyでコピーしる
そもそもなんとなく この宣言を使ってるんですが char *hoge[5]={"test","test2","test3","test4","test5"}; イメージ的にはどんな感じですか hoge[0] 文字列testへのポインタ hoge[1] 文字列test2へのポインタって感じですか?
そんな感じ
a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、 B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++) a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
>>660 class B の定義より前に class A の宣言だけしてみるとか
class A;
662 :
661 :2008/10/03(金) 19:16:28
質問です。 他クラスのメンバ変数にアクセスするにあたって 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;
一応 速度は直接アクセス 安全性はゲッター だろう一般的に 最適化で速度差無い事もあるけど 普通はゲッター使いなさいと教わるはず
>>660 それだけだとうまくいくはずなのでもうエスパーさんしか
アドバイスできないんじゃないかと
エラーの出る最小のコードをどうぞ
666 :
デフォルトの名無しさん :2008/10/03(金) 19:32:06
VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。 私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
ほかのプログラムが満遍なくCPUを使っていただけだろ。
>>669 #include "ca.cpp"
#include "cb.cpp"
これは。。
ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
ボーランドのリンカ使い方知らないけど、 それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
>>670 つまり、main.cppでa.hとb.hをインクルードして、
a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
674 :
663 :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);
のようにした方がオーバーヘッドは減りますよね?
メンバ関数はインライン関数にできてだな
最適化を前提にするなら余計なことはしないほうがよいだろう。 get/setは*.hにインラインで記述するのが基本。 気になるならアセンブリリストを出力したり、実際に測定するといいよ。
>>674 intなら参照使わない方が早いんじゃね?
どういう用途か知らないけど
なんにせよ実測するのが一番だな
>>674 値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、
一通り操作が終わったら、メンバに書き戻す方が良いかも。
メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定
される点もメリット。
679 :
673 :2008/10/03(金) 21:50:44
解決しました。 どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で 形式上でもインクルードしておけ、って事ですね(多分)。 アドバイスくれた方々、ありがとうございました。
>>679 > a.cppとb.cppではインクルードガードをかける
ヘッダ内でガードする。
多重インクルードされた結果、重複定義が発生する。
> ヘッダはインクルードガード付け
となっているから理解したのかもしれないけれど。
すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の
ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。
リファクタリングって言葉も調べてみてください。
よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
エスパーに失敗した。もうちょっと情報頼む。
>>681 そういう作りはWin16時代の遺物なので今となっては意味がない
Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を
InitApplication()に記述して、
WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。
同一フォルダ内のすべてのファイルのサイズを取得するにはどうすればいいですか?
FindFirstFile、FindNextFile、FindClose
687 :
デフォルトの名無しさん :2008/10/05(日) 05:04:11
liboctave で逆フーリエ変換したいのだが、うまくいかない。 どこがだめなんだろうか? int OCTAVE_iFFT( double *OCT_POW, int DATASIZE, double *OCT_BUF) { ComplexMatrix originalData( DATASIZE/2, 1, 0.0 ) ; for( int ii=0; ii<DATASIZE/2; ii++ ){ originalData( ii, 0 ).real() = OCT_POW[ii] ; } ComplexMatrix ifourierData = originalData.ifourier() ; for( int ii=0; ii<DATASIZE; ii++ ) OCT_BUF[ii] = ifourierData( ii, 0 ).real() ; return 0 ; }
C++の継承って、 どのくらいの規模のソースから必用になってきますか? なんだか個人レベルでは必用がないように思えるのですが 此処の人たちが、継承を使い始めたソースの行数とかを、 個人的偏見でいいので教えてもらえると、嬉しいです
行数よりは、どんなことをするか、に依るでしょ。 特に多態は、規模がどんなに小さくても、それを使うことで綺麗に実現できる事をするなら 使われるのでは。
>>690 根底から仕様変えたくなった時に不便では無いですか?
>>691 根底から仕様変える必要に迫られるようでは基本設計の段階で間違っている
としか言いようがない
>>691 継承とか多態に対して
「根底から仕様変えたくなった時に不便ではないか」
という疑問を抱くなら、そもそも
>>689 で前提にしている
「個人レベルではない規模なら、継承を使うこともあるというのはわかる」
っていう認識はあり得なくない?
「大規模なプロジェクトで継承を使うと、根底から仕様を変えたくなったときに不便ではないですか?」
という疑問は持たないの?
山じゃないんだから、そこに継承があるから使うなんて考えるな。
根底から変えるなら、根底のクラスを継承すればいいだけ。
単なる機能の拡張や変更に継承を使ってそうだな。
>>692 一人で作るのは、ほぼ趣味みたいなものだから、根底から書き直す事は
自分はかなり多いので。(むしろ毎回?
>>693 >「大規模なプロジェクトで継承を使うと、根底から仕様を変えたくなったときに不便ではないですか?」
大規模なプロジェクトっていうのは、
仕組みの部分の作り方は既に枯れてると思って、
根底から書き換える事はほとんど無いと予想したんですが。
本職じゃないからこの辺りの事情はわからないっす。
>>697 だったらOOPなんか使うな。
お前には向いてない。
「エディタ作ろうと思ったけど、3D格闘ゲーに変えるわ」 くらい根底から変わるなら、確かに設計をいくらしっかりやってもしょうがないが・・・。
継承するとコールのとき楽
>>699 それに近いかもしれないww
作ろうと思うものがバラバラで困った
同じものを何度も何度も作るなら継承なのかなぁ
初めて作るものはどうやってもまともに設計なんてできやしない
>>698 じゃぁC++初心者はどこからOOP入れば・・・
本物の初心者ならPythonやRubyあたりからやったら? 一見遠回りのようでも
クラスの設計は何度も作り直して覚えていけばよい。
>>703 Qtお勧め
モノ作るためだけにもいいツールだけど、
C++(OOP)を理解する教材としても結構いいと思うよ
英語ダメ、とか泣き言言わない人なら
英語ダメ、とか壁作ってちゃ結局無駄 特定のジャンルの英文なんて、 出てくる単語なんて少ないし、 万国共通の言語(プログラミング言語)が添えてある 足を踏み入れてみたら、 なんだ、ただの食わず嫌いだったんだなということがわかる
別に英語の達人にまでなる必要は無いものな。
そもそも、「英語」じゃなくて、「プログラミング言語」だからな。 そこんところ間違えちゃだめだ。 まあ、変数名つけるときに辞書引いたりはするけど。
711 :
デフォルトの名無しさん :2008/10/06(月) 15:54:54
便乗で質問します( ・ω・)∩ 自分はDirectXのコードばかりなんでMFCや.NETとかは勉強せずに Win32APIでしかWindowsアプリ作ったことないんですが、 QtはMFCやWin32APIで書くよりも楽しい&効率的でしょうか? wxWindowsとか他にもあるみたいですが、 それらと比べるとどうなのでしょうか。使った方の感想でいいので よかったら教えてください。
>>710 いや、皆がしてるのは、英語で書かれたコメントやマニュアルを読む話では。
>>711 QtはMFCより遥かに楽で美しい
ただ組み立ててるだけのサンプルコードなのに
FireFoxもどきのブラウザまで作れてしまう
ただWindowsしか使わないなら他に選択肢はある
無料版はDirectXサポート外だし、
ソース公開の義務が発生するしな
連投スマン ちなみにGtkはC言語ベースだけあって オブジェクト指向になれてしまった人には苦痛に感じる汚さだと思う C++ラッパーはあるけどね あと、2byte文字が苦手だったのかな? どこかでマルチプラットフォームという面ではまだあと一歩だった気がする wxWindowはできが良さそうに見えて まだまだ発展途上って感じで今後に期待、のまま月日が流れてる・・・ Qtはこの3つの中で最も後発だから、 設計面でもマルチプラットフォームの達成度も一番できがいいけど やっぱソース公開の義務が足を引っ張ってる感じだな マニュアルやサンプルはかなり充実してるのに 突っ込み、ご指摘ヨロ
商用版買えよ
個人の遊びで使うには高すぎるだろ 中古車が買えちゃうぐらいだぞ?w
717 :
711 :2008/10/06(月) 17:17:44
>>714 ありがとうございます。かなり興味湧いてきました。
他のプラットフォームでも同じコードでそのまま動くというのもすごいですね。
自分が使うツール組む分には非常によさげですね。
>>715 値段見てちびりそうになりました(´・ω・`)
718 :
デフォルトの名無しさん :2008/10/06(月) 23:25:27
ちょっと教えてくれ extern "C" void hogehoge() { } こういう風に定義部分にextern "C"を付けて C++でコンパイルしたらマングリングされなかったが、 ググっても定義部分に付けてるとこ見た事ない。 これってコンパイラ依存な実装? というか、マングリングってちょっとエロいな
万具リングって言葉自体はじめて聞いた。
ちゃんと定義されてるけど、わざわざ個別の関数につけることはしないような気がする
なんかそんなことしてるってのは知ってたがマングリングって名前だったのか・・・初めて知った。 たしかコンパイラ依存じゃないっけ? VCとBCBでもマングリング後?の実際の関数名は違ってるはずだし。 だがうろ覚えなので間違ってても責任は持たん。
>>718 関数の宣言なしに定義を書いたら、それは宣言も兼ねるというやつだ。
staticな関数も、宣言なしにいきなり定義を書けるだろ?
723 :
デフォルトの名無しさん :2008/10/07(火) 01:23:33
>>722 んじゃ、
extern "C" void hogehoge();
void hogehoge()
{
}
ってやってもマングリングされないの?
今試せる環境ないからわかんないけど
つまり、俺はextern "C"ってマングリングされてない関数を
呼び出す時の為にあると思ってたけど、
マングリングさせないという意味もあるということだな?
extern "C"は、その関数をCリンケージにしろという指令だよ。
725 :
デフォルトの名無しさん :2008/10/07(火) 01:33:36
>>724 なるほど。そういう解釈なんだね.
じゃあ、723で書いたコードは多分マングリングされちゃうね。
ありがとう^^
>>723 ,725
一旦 extern "C" で宣言されていれば、同じ名前の定義もリンケージ指定を引き継ぐよ。
723 の hogehoge() は C で使える。
DLLを調べて関数名とその引数を取得する方法ありませんか?
728 :
727 :2008/10/07(火) 13:50:42
DLLのlibファイルはたいていVC++用なので、bccやminGWでも使えるように ヘッダファイルを生成して、その中のクラスのコンストラクタで動的にDLLを 呼び出しておきたいのですが。 DLLを渡したら自動でヘッダファイルを生成したいんです。 やり方教えてください。
>>727 ヘッダファイルは共用できるように書けます
共用したほうがいいです
引数のトータルバイト数くらいなら頑張れば分かりますが
DLLから引数の個数を自動で調べる方法はありません
いつも、元々付いているヘッダファイルは使わず、 ライブラリの説明書見ながら、動的呼び出しのC++用のヘッダを作っているのですが。 DLLに、いつも静的リンクと動的リンクの二つヘッダを入れてほしいです。
>>730 implib.exe とか dlltool.exe とかでライブラリを作ることは可能
付属ヘッダから、実行時に動的リンクするヘッダを生成する部分を作ることにしました。
いつもこの様なヘッダを手動で作ってます。 このヘッダを読むだけでDLLの関数がどのコンパイラでも使えます。 friend関数の中身は省略してます。 class SevenZipDLL { HINSTANCE hd; typedef int (WINAPI *FN0)(const HWND, LPCSTR, LPSTR, const DWORD); typedef BOOL (WINAPI *FN1)(LPCSTR, const int ); FN0 SevenZip_; FN1 SevenZipCheckArchive_; public: friend int SevenZip(string s, string &t); friend BOOL SevenZipCheckArchive(string); SevenZipDLL(){ hd = LoadLibrary("7-zip32.dll"); SevenZip_ = (FN0) GetProcAddress(hd,"SevenZip"); SevenZipCheckArchive_ = (FN1) GetProcAddress(hd,"SevenZipCheckArchive"); } } SevenZipDLL_;
winsock2.hなんか両用にできているよね。 それと、静的リンク前提のヘッダでも、0xならもう少し活用できると思う。 g++ -std=c++0xでこんなコードが書ける。 #include <windows.h> int main() { typedef decltype(MessageBoxA)* PFNMsgBoxA; if (HMODULE hmodUser = LoadLibrary(TEXT("user32"))) { if (PFNMsgBoxA pMsgBox = reinterpret_cast<PFNMsgBoxA>(GetProcAddress(hmodUser, "MessageBoxA"))) { pMsgBox(0, "Hello world", "", 0); } FreeLibrary(hmodUser); } }
virtualは遅い?
virtualなしに比べて、ということなら。
int hoge = 0; if(++hoge == HogeFunc()); このif文はキチンと保証されてましたっけ?
何を保証して欲しいんだ?
>>739 C99やC++じゃなければ、そのhogeの定義がブロックの先頭である必要がある。
HogeFunc()は整数型か、それに暗黙的に変換できる型である必要がある。
>>739 hogeがHogeFunc()の中で変更されてなければ保証されている。
STLのキューにデータが入るまで、待つにはにはどのようにしたらいいですか?
whileでサイズを監視していたら、CPU負荷が掛かってしまいます。
745 :
743 :2008/10/08(水) 10:57:35
自己解決したと思います。 キューにデータ入れたら、シグナル/非シグナルを切り替えれば良さそうです。
決まってねーよ
>>739 のはグローバルでもないのに、どうやって中でいじるんだろう。
マクロ?
C/C++の関数辞典的な本でお勧めってありますか?
Cなら新ANSI C言語辞典持ってりゃいいんでないかな。 C++はわかんね。EffectiveC++とか?辞典的じゃないけど。
C/C++実践プログラミングリファレンス@エーアイ出版 携帯なんでググってくれ 古いけど、最初は結構お世話になった 重複機能(各コンテナのpush_backとか)端折ってない上、 そこそこサンプルコードが載ってるため分厚い 比率はC:C++=6:4ぐらいで<algorithm>まで入ってる まぁこれしか知らないんだがw
CはK&Rに決まってるだろ。 C++は、禿のより、Nicolai Josuttisの本の方が分かりやすかった。 アスキー出版から邦訳もあったはずだけど、絶版だった気もする。 まあ原書読め。
>>755 流れ読めない人だねえ。もうちょっと落ち着いてレスしようぜ。
>>753-755 ありがとう、購入の際の参考にします
しかし近くに大きな本屋がないような田舎だと専門書買うのって苦労するなぁ('A`)
変数の値が変化したことをチェックする方法はありますか? nの値が3を超えるまで待機したりとか。同期オブジェクトしかないですか
いいメモリアロケータ教えてください。空きメモリが少なくなったら、 メモリマップドファイルに切り替えて、不安定にならないようにしたり出来ると良いです。
OSを信じろ!
作り方だけでも教えてもらえませんか アロケータです
当然64bit以上のアドレス長を想定しているんだろうな?
764 :
デフォルトの名無しさん :2008/10/09(木) 05:09:09
STLをマルチスレッドな環境で使いたいときにはどうすればよいですか? 基本的な解決策って何でしょうか? よろしくお願いします。
質問です。 ファイルにかかれた abc:defという文字列ををabcとdefに切り分けるプログラムを考えています。 while((c = fgetc(f)) != EOF){ if(c == ':'){ ungetc(c,f); fseek(f,1,SEEK_CUR); } printf("%c\n",c); } とやったのですが、abc:defと表示されてしまいます。 fseekには成功した場合ungetcで戻したデータはなかったことになると manに書いてありました。 abc:まで読む :戻す fseek成功。:なかったことになる。 dから読み始める っていうのを想像していたのですが、:が入ってしまいます。 このような場合どのようにするのが定石なのでしょうか?
トークン 分割 C言語 などでググる
メモリ管理はこの中だとどれか良いんでしょうか? dlmalloc ptmalloc STLport jemalloc Google malloc
標準って何の標準?
コンパイラ付属のmallocです。 ptmallocとjemallocは、UNIX用に作られていてコンパイルできそうにありませんでした。 Google mallocとdlmallocは、変更無しにコンパイルは出来ました。 使い方はわかりません。
Windows対応で、試す価値がありそうなのは Google mallocとSTL portとboost poolくらいですね。 使い方わかったらレポします。 あと知っているいたら教えてください。
メモリ確保は重要と思いました。 new と poolを比較したとき9倍ほど速度差がありました。 #include <iostream> #include <boost/timer.hpp> #include <boost/pool/pool.hpp> using namespace std; #define N 1024*1024 int main() { int n, **a=new int *[N]; double cl,cr; boost::timer timer; timer.restart(); for(n = 0; n < N ; n++)a[n]=new int; cr=timer.elapsed(); for(n = 0; n < N ; n++)delete a[n]; timer.restart(); boost::pool<> pool(sizeof(int)); for(n = 0; n < N; n++) pool.malloc(); cl=timer.elapsed(); cout <<"boolの確保速度 "<<cl<<"秒 newの確保速度 "<<cr<<"秒 速度比 "<<cr/cl<< "\n"; }
訂正 #include <iostream> #include <boost/timer.hpp> #include <boost/pool/pool.hpp> using namespace std; #define N 10*1024*1024 int main() { int n, **a=new int *[N]; double cl,cr; boost::timer timer; timer.restart(); for(n = 0; n < N ; n++)a[n]=new int; cr=timer.elapsed(); for(n = 0; n < N ; n++)delete a[n]; timer.restart(); boost::pool<> pool(sizeof(int)); for(n = 0; n < N; n++) a[n] = (int *)pool.malloc(); cl=timer.elapsed(); cout <<"boolの確保速度 "<<cl<<"秒 newの確保速度 "<<cr<<"秒 速度比 "<<cr/cl<< "\n"; }
bcc2008にGoogle mallocとSTL port入れたいのですがやり方わかりません
中身全部00だろそれ
>>779 ちゃんと読み書きできますよ。だから全部が0とは限りません。 途中や末尾にデータ入れられます。
圧縮してるわけじゃなくて使ってないとことばしてるだけだな。
データを入れるとその部分は実際に容量を食う 結局5GB分のデータが入る予定なら変わらないんじゃないか 大部分0のままにしておくことに意味があるのならいいかもしれないけれど 速度は実際に測ってみれよ
クラスの構造について質問です 元のクラスが持ってるデータを変換して次のプロセスを担当するクラスへと引き渡すとき 元クラス-変換クラス-次クラスのように数珠繋ぎに各クラスのポインタを持たせるか 元クラスに変換クラスと次クラスへのポインタを一括して持たせしまうか どちらがよいでしょうか?
データクラス作って それぞれの演算用クラスにぶち込む
スパースファイルは速いみたいです。2つに分けます。 #include <windows.h> #include <iostream> using namespace std; #define filesize 100*1024*1024 int main() { DWORD retsz; int n,m,cl,sum=0; HANDLE fp = CreateFile("SPARSEFILE", GENERIC_WRITE|GENERIC_READ,0, NULL, CREATE_ALWAYS, 0, NULL); DeviceIoControl(fp, FSCTL_SET_SPARSE, NULL,0, NULL, 0, &retsz, NULL); SetFilePointer(fp,filesize, NULL, FILE_BEGIN); SetEndOfFile(fp); HANDLE hd = CreateFileMapping(fp, NULL, PAGE_READWRITE,0,0, "SPARSETEST"); char *p = (char*)MapViewOfFile(hd, FILE_MAP_ALL_ACCESS, 0, 0, 0); HANDLE fq = CreateFile("REALFILE", GENERIC_WRITE|GENERIC_READ,0, NULL, CREATE_ALWAYS, 0, NULL); SetFilePointer(fq,filesize, NULL, FILE_BEGIN); SetEndOfFile(fq); HANDLE he = CreateFileMapping(fq, NULL, PAGE_READWRITE,0,0, "REALTEST"); char *q = (char*)MapViewOfFile(he, FILE_MAP_ALL_ACCESS, 0, 0, 0);
cout<<"疎なデータ書き込み中・・・\n"; for(n=0;n<5000;n++){m=rand()%filesize; p[m]=q[m]='a';} FlushViewOfFile(p,0);FlushViewOfFile(q,0); cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=p[n]; cl=GetTickCount()-cl; cout<<"SPARSEFILEの読み込み速度 = "<<cl<<endl; cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=q[n]; cl=GetTickCount()-cl; cout<<" REALFILEの読み込み速度 = "<<cl<<endl; cout<<"\n密なデータ書き込み中・・・\n"; for(n=0;n<filesize/2;n+=2){ p[2*n]=q[2*n]='a'; p[2*n+1]=q[2*n+1]='\n'; } FlushViewOfFile(p,0);FlushViewOfFile(q,0); cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=p[n]; cl=GetTickCount()-cl; cout<<"SPARSEFILEの読み込み速度 = "<<cl<<endl; cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=q[n]; cl=GetTickCount()-cl; cout<<" REALFILEの読み込み速度 = "<<cl<<endl; cout<<"\n終了処理中・・・\n"; FlushViewOfFile(p,0);UnmapViewOfFile(p); CloseHandle(hd); CloseHandle(fp); FlushViewOfFile(q,0);UnmapViewOfFile(q); CloseHandle(he); CloseHandle(fq); cout<<"最適化対策のための計 sum = "<<sum<<endl; return 0;}
>>783 データ用クラスを作ってそれをそれぞれに共有させるという事ですか?
Google mallocの使い方わかりませんか
>>787 多態性を、と思ったが、
アマ意見だからこの意見の評価はオレも聞きたい(´・ω・`)
頼りない意見でスマン
↓エロい人
Google mallocのtcmalloc.hには、 こういった関数が書いてありますが、 bcc2009の標準にするにはどういった設定をおこなえばいいでしょうか? extern "C" void cfree extern "C" int posix_memalign extern "C" void* memalign extern "C" void* valloc extern "C" void* pvalloc
>>791 標準にしたいってなんだろ。
そういった関数が書かれているならそういった関数を使えばいいじゃない
newやvectorで呼び出すメモリ確保関数にしたいんです
ここはお前に日記帳じゃねーんだ。 チラシの裏でやれ。
>>793 だったらnew演算子をオーバーロードしたりカスタムアロケーターを作ればいいだろうが。
796 :
765 :2008/10/09(木) 20:52:32
>>766 >>767 >>768 ありがとうございます。
このような関数があるとは知りませんでした。
勉強になりました。
じつは、自分はパーサーを作りたいのでungetcを使えた方が良いのです。
abc:defの場合、
abc:でungetcして、'¥0'を入れてreturnするみたいな...
ungetcを使う場合はどのような方法があるでしょうか?
たとえば:の出てきたところを記録していて、
fseekで記録+1の所から、読み始めるとか...
>>796 printf を else{ .. } で囲むといいと思うよ
ちなみにstrtokは仕様上のバグとされている 正しく使えばトラブル起きないけど、 危険な関数って意味で
799 :
デフォルトの名無しさん :2008/10/10(金) 00:15:04
浮動小数点出力フォーマットの質問です。 #include <iomanip> #include <iostream> #include <cmath> int main() { std::cout << std::scientific << std::setprecision(8) << M_PI << std::endl; return 0; } このプログラムを実行すると、 3.14159265e+00 と出力されるんですが、フォートランみたいに、 0.31415926e+01 というように、0の位を0で出力する方法はあるでしょうか?
>>790 784に賛成
元クラスと次クラスとの依存関係を作らなくてすむから。
関数ポインタってありますが、変数名やクラス名をポインタで定義できますか? たとえば、このようなクラス、変数名があったとき、これをポインタで定義できますか? class ABCD { } ABCD_;
char ch[]="ABCD"; class ch { } ch_; こんなのは出来ないしやり方ありますか
それをどう使うつもりなんだ? 具体的な使用例があれば何かアドバイスできるかもしれない
クラス名は typeid 変数名はプリプロセッサの # かな
ごめん、意味間違えてた
すみません あきらめます
new演算子の引数でstd::nothrowを指定した場合、std::bad_alloc以外の、コンストラクタでの例外も一切投げられないのですか?
テンプレートでは、関数ポインタを引数のように扱えますか?
>>807 いいえ
operator new の呼び出しとコンストラクタの呼び出しは別個です
>>807 コンストラクタからの例外は余裕で飛んでくるよ。
>>808 「引数のように扱う」の意味がわからん。
何かができるかどうかって話なら、まず試せばいいんじゃないの?
>>808 こうですか?わかりません
template <void(*func)()> class foo {};
void bar(){}
foo<bar> baz;
これはどうすれば動きますか? #include <iostream> #include <windows.h> using namespace std; typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD); typedef BOOL (WINAPI *FN1)(const BOOL); char dn[3][20]={"aaa.dll","bbb.dll","ccc.dll"}; char en[3][2][20]={"aaa1","aaa2","bbb1","bbb2","ccc1","ccc2"}; void fnc(int n){ // hd = LoadLibrary(dn[n]); // z1 = (FN0) GetProcAddress(hd,en[n][0]); // z2 = (FN1) GetProcAddress(hd,en[n][1]); } class aaa { HINSTANCE hd; public: FN0 z1; FN1 z2; aaa(){ fnc(0); } } aaa_; class bbb { HINSTANCE hd; public: FN0 z1; FN1 z2; bbb(){ fnc(1); } } bbb_; class ccc { HINSTANCE hd; public: FN0 z1; FN1 z2; ccc(){ fnc(2); } } ccc_; main(){}
自己解決しました
自己解決が多いなw
いいことだ
自己解決しました
これでコンパイルは通ったのですが、グローバルのen[][][]を無くして fnc("aaa"); (もしくはクラスを特定できるポインタを与える) ことでfnc側で、 HINSTANCE hd, FN0 z0, FN1 z1を特定させることは出来ないですか? #include <windows.h> typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD); typedef BOOL (WINAPI *FN1)(const BOOL); char en[3][3][20]={ {"aaa.dll","aaa1","aaa2"}, {"bbb.dll","bbb1","bbb2"}, {"ccc.dll","ccc1","ccc2"} }; void fnc(HINSTANCE &hd, FN0 &z0, FN1 &z1,int n){ hd = LoadLibrary(en[n][0]); z0 = (FN0) GetProcAddress(hd,en[n][1]); z1 = (FN1) GetProcAddress(hd,en[n][2]); } class aaa { HINSTANCE hd; public: FN0 z0; FN1 z1; aaa(){ fnc(hd,z0,z1,0); } } aaa_; class bbb { HINSTANCE hd; public: FN0 z0; FN1 z1; bbb(){ fnc(hd,z0,z1,1); } } bbb_; class ccc { HINSTANCE hd; public: FN0 z0; FN1 z1; ccc(){ fnc(hd,z0,z1,2); } } ccc_; main(){}
自己解決しました
本人か知らんが自己解決時には解決策を書いてけ
自己解決できない人はレスしないでください。
あたらしい遊びですね ちなみに次の質問は自己解決してます。
コンパイルするとwinnt.hでエラーが出るようになりました。 他の正常だったプロジェクトこコンパイルしてもエラーが出ます。 どうもwinnt.hの内容を変えてしまったようなのですが、どこがいけないのかわかりません。 再インストール以外でいい方法はありませんか?システムプログラムはロックはかかってないんでしょうか?
826 :
825 :2008/10/10(金) 15:47:18
あ、自己解決しました
まじむかつくなにこおスレ
FNC(char *input, char *output)という関数が有り、引数はそれぞれファイル名を指定するものとします。 この際、outputだけメモリを指定したいのですが、メモリをファイルのように見せかけるテクはありませんか? 関数FNCの変更は出来ません
2Mメモリを確保したら、一時的にドライブ番号Wを割り当てるとか出来ると良いのですが ドライバとか不要の方法は無いですか
830 :
デフォルトの名無しさん :2008/10/10(金) 17:19:17
#include<stdio.h> void sum(int dim[],int num) { int i,sum=0; for(i=0;i<num;i++) sum+=dim[i];} int main(void) { int i,dim[]={5,1,2,3,4}; int num=5,max,total; max=dim[0]; for(i=1;i<num;i++) if(max<dim[i]) max=dim[i]; total=sum(dim,num); printf("%d\n",max); printf("%d\n",total); return(0); } voidからintに変換できません、と出ます どなたか
int sum(int dim[],int num) { int i,sum=0; for(i=0;i<num;i++) sum+=dim[i]; return sum; }
>>830 sum()が何も返さないのにtotal=sum()としているから
833 :
828 :2008/10/10(金) 17:26:01
winXPです
834 :
830 :2008/10/10(金) 17:39:31
関数はvoid型として宣言されていますが、値を返しました といわれました・・・・ どういうことなの・・・
835 :
デフォルトの名無しさん :2008/10/10(金) 17:40:36
836 :
820 :2008/10/10(金) 17:41:29
>>822 この様にしました。 なるべく重複する部分を無くしたいという目的なのでこれでOKです。
#include <windows.h>
#include <string>
using namespace std;
typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD);
typedef BOOL (WINAPI *FN1)(const BOOL);
class DLLdata { public: string tag; HINSTANCE hd; FN0 z0; FN1 z1; };
void fnc(DLLdata &x){
string y;
y=x.tag+".DLL"; x.hd = LoadLibrary(y.c_str());
y=x.tag+"0"; x.z0 = (FN0) GetProcAddress(x.hd,y.c_str());
y=x.tag+"1"; x.z1 = (FN1) GetProcAddress(x.hd,y.c_str()); }
class A_ {
DLLdata x;
public: A_(){x.tag="A"; fnc(x);}} A;
class B_ {
DLLdata x;
public: B_(){x.tag="B"; fnc(x);}} B;
class C_ {
DLLdata x;
public: C_(){x.tag="C"; fnc(x);}} C;
main(){}
837 :
デフォルトの名無しさん :2008/10/10(金) 17:46:51
>>835 return sum; で返したつもりなのですが・・・
void sum -> int sum
839 :
830 :2008/10/10(金) 17:53:02
ありがとうございます皆様
VBやPascalの古い書式に、関数名と同じ名前の変数に値を 代入することで関数の戻り値になるというのがあって それと混同してる予感。
VBがそんなことできたな確か
メモリをファイルのように見せかけるテクはありませんか? メモリマップドファイルの逆です。WindowsXPです。 RAMディスクを前準備無しに動的に生成出来る方法でもいいです。
C++でいいの?
「C++でいいの?」なんてわざわざ聞いているから、 メモリに対して読み書きするストリームクラスというオチだと予想。
早急におねがいします!
847 :
846 :2008/10/10(金) 19:42:21
自己解決しました 役立たねぇな
していません レスおねがいします
名前付きパイプとかで出来ないかな?
850 :
846 :2008/10/10(金) 19:57:26
やっぱ、自己解決しました 名前付きパイプとかで出来ました
851 :
846 :2008/10/10(金) 20:06:07
さらに自己解決しました パイプカットとかも役に立ちました。
してませんだれかおねがししあmsssぐが
今度は解決したものを長引かせる詐欺ですか
やめてください だれかおねがいします
855 :
854 :2008/10/10(金) 21:01:18
やっぱり解決しました
解決してしまったのか 了解した
ズバットですが、怪傑しました。
解決させません
壊血しました。もう長くないかもしれません。
ライムでも喰っとけ
どうすればいいかわかりません。 どなたか自己解決してください。
カオスだな・・・w 単語一つでググったら、あっさり同じ質問と回答が出てきた
可変引数ってこれくらいしかやり方無いですか? ***1と***2のところが機種、コンパイラ依存みたいなんですが #include <stdarg.h> #include <stdio.h> #define print(...) print_(__VA_ARGS__,NULL) // ***1 void print_(char *p, ...){ va_list L; va_start(L, p); L = (char *)L - sizeof(char*); // ***2 char *ch; while((ch=va_arg(L, char*))!=0)puts(ch); va_end(L);} int main(void){ print("alpha", "beta", "gamma","saigo"); }
boost::formatみたいな可変引数もどきとか
865 :
デフォルトの名無しさん :
2008/10/11(土) 08:31:20 スマートポインタをメンバに持つクラスで、コピーコンストラクタを自作する必要はありますか?