【初心者歓迎】C/C++室 Ver.59【環境依存OK】
at TECH
1:デフォルトの名無しさん
08/09/06 22:45:12
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2:デフォルトの名無しさん
08/09/06 22:47:35
丘
3:デフォルトの名無しさん
08/09/06 22:57:39
お勧めのC/C++開発環境ってありますか
VC++ Express 2008は、C言語サポートがしょぼくて・・・。
リファクタリングとか、関数のテンプレートとか作れたり出来るとうれしいんですが
4:デフォルトの名無しさん
08/09/06 22:59:04
???
5:デフォルトの名無しさん
08/09/06 23:01:39
メモリリークのチェックのために
#define new ::new(_T(__FILE__), __LINE__)
ってやってるんだが、
placement newを使いたいときはどうしたらいい?
6:デフォルトの名無しさん
08/09/06 23:03:35
コメントをつけるとき↓どれがいいですか?
// ウィンドウクラスを登録
// ウィンドウクラスを登録する
// ウィンドウクラスを登録する。
// ウィンドウ・クラスを登録
// ウィンドウ・クラスを登録する
// ウィンドウ・クラスを登録する。
// ウィンドウのクラスを登録
// ウィンドウのクラスを登録する
// ウィンドウのクラスを登録する。
7:デフォルトの名無しさん
08/09/06 23:06:36
// ウィンドウクラスの登録
8:デフォルトの名無しさん
08/09/06 23:07:44
Regist window class.
9:デフォルトの名無しさん
08/09/06 23:08:13
>>6
/* ウィンドウクラスを登録
BOOL RegisterWindowClass()
{
〜〜〜
}
*/
10:デフォルトの名無しさん
08/09/06 23:09:40
>Regist window class.
生半可な知識もここまで来ると笑えるな。
11:デフォルトの名無しさん
08/09/06 23:10:39
みじかいのがいい
12:デフォルトの名無しさん
08/09/06 23:13:26
>>6
関数名で処理が自明なものにコメントは不要だよ。What じゃなくて、
Why を書くようにしたほうがいいね。
13:5
08/09/06 23:18:18
事故解決?した。
URLリンク(ml.tietew.jp)
これでやってみる
14:デフォルトの名無しさん
08/09/06 23:18:45
// 窓級登録
15:デフォルトの名無しさん
08/09/06 23:24:03
コメントとかいらねーだろ
16:デフォルトの名無しさん
08/09/06 23:26:23
関数のコメントってみんなどんなのつけてるんだろう・・・
17:デフォルトの名無しさん
08/09/06 23:27:26
フリーのリソースエディタでお勧めのものはありますか。
18:デフォルトの名無しさん
08/09/06 23:29:26
/// <summary>
/// ほげほげな関数
/// </summary>
19:デフォルトの名無しさん
08/09/06 23:34:35
>>18
C++だとあんまり役に立たないだろ。
20:デフォルトの名無しさん
08/09/06 23:35:37
Doxygenとかに食わせたりしないの?
21:デフォルトの名無しさん
08/09/06 23:41:31
>>8
Regist という英単語はない
22:5
08/09/06 23:44:19
>>13だと
new A()->f();
ってやったときにまずいことになることが発覚
だれかいい方法おせえて
23:デフォルトの名無しさん
08/09/06 23:46:29
>>5,22
そんなマクロは捨てて auto_ptr なり scoped_ptr, shared_ptr なりのスマートポインタを使う。
24:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/07 00:04:33
*で受け取るなら*で返す
&で受け取るなら&で返す
のがわかりやすいのではないか
26:デフォルトの名無しさん
08/09/07 04:52:27
SHA-1 のコリジョンの起こるサンプルデータを探しています.
ググってみると MD5 の方はすぐに見つかったのですが,SHA-1 の方は衝突記事はたくさん引っ掛るのですが,
肝心のデータが見つかりません.どこにあるか知っていたら教えていただけないでしょうか?
27:デフォルトの名無しさん
08/09/07 10:54:48
何故このスレで?
28:26
08/09/07 12:08:32
ごめん,ぶっちゃけ どのスレで聞いたら良いか分からなかったんだ.
あと RFC についてた MD5 と SHA-1 アルゴリズムのサンプルが C で書かれていたから,
このスレが比較的適当かと思ったんだ….
あの後調べてたんだけど SHA-1 で見つかったコリジョンは計算回数を減らした奴で,完全版のほうは
コリジョンハッシュを生成する比較的現実的な計算量のアルゴリズムが見つかっただけなのかな?
それともアルゴリズムが改良されてもう見つかっている?ここらへんがよくわからんとです….
29:デフォルトの名無しさん
08/09/07 12:11:21
CRCで十分
30:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/07 12:22:28
計算時間は実測する
32:デフォルトの名無しさん
08/09/07 12:26:50
>>30
int 以下の大きさの整数の演算は int に変換してから行う、と規格で決められている。
だから計算コストは同じ。読み取りと書き込みのコストは違うかもしれないけどね。
double, float についてはこういう規則は決められてないんで、同じことは言えない。
特定の環境に限って実験結果があれば別だけど。
別件については「共有」の意味がわからんので、なんとも。
33:デフォルトの名無しさん
08/09/07 12:27:18
>>30
後者は共用体で。
34:デフォルトの名無しさん
08/09/07 12:36:36
>>32
サンクス
共有は共有体(union)のことです
intのビットサイズがOSによって変わるなら
intが32bitの場合はfloatと、
intが64bitの場合はdoubleと共有体を組むべきだと思ったんですが
そのセオリーな方法はないのかと思いまして
35:デフォルトの名無しさん
08/09/07 12:40:50
>>34
<stdint.h>あるいは<boost/cstdint.hpp>のint32_t/int64_t
36:デフォルトの名無しさん
08/09/07 12:43:14
>>34
×共有体
○共用体
37:デフォルトの名無しさん
08/09/07 12:49:33
>>34
typedef 一段かませばいいんじゃない?
どうやって int のビット数を判別するかは、環境依存のマクロがあればそれでもいいし、
C++ でテンプレートメタプログラミングしてもいい。
38:デフォルトの名無しさん
08/09/07 12:50:33
>>35
32bitOSでも64bitに固定しろってことなんですかね?
せめてコンパイル環境によって
判定してくれるようなマクロを期待していたんですが
>>36
そうでした、お恥ずかしい
39:デフォルトの名無しさん
08/09/07 12:58:27
判定したいならこれでどう
#include <limits.h>
#if INT_MAX == 2147483647
40:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/07 13:21:49
>>39
にゃるほど
>>37,40
テンプレートはクラスにしか使ったことなかったんですが
本来そういう使用方法だったんですね
メタプログラミングについて勉強してきます
ありがとうございました
42:デフォルトの名無しさん
08/09/07 13:50:40
>>41
いや、メタプログラミングは本来の使い方じゃないからね。
ライブラリ実装内で使うならともかく、他人に使わせるようなところで使うのは控えたほうがいいよ。
43:デフォルトの名無しさん
08/09/07 14:55:03
それでもマクロのifとか使うよりはTMPの方が余程健全に思えるわ
44:デフォルトの名無しさん
08/09/07 15:04:32
C++の事で質問です
::func()という表記はグローバルスコープで宣言されたfuncを明示的に呼び出す場合に使用するものだったと思いますが
::new Hogeという風にnew演算子に対して::を付けている場合はどういう動きになるのでしょうか?
45:デフォルトの名無しさん
08/09/07 15:20:36
グローバルなnew演算子を呼び出す。
46:デフォルトの名無しさん
08/09/07 15:20:48
>28
■暗号技術【ROUNDsurea】■
スレリンク(tech板)
47:デフォルトの名無しさん
08/09/07 19:19:25
>17
フリーのリソースエディタ
ResEdit
URLリンク(www.forest.impress.co.jp)
48:デフォルトの名無しさん
08/09/07 22:03:00
皆さんの現場では、ウォーターフォール形式で開発しているところが多いのですか?
これ以外のプロトタイプ形式とか経験ないのですが、なんか能率悪いと思う
49:デフォルトの名無しさん
08/09/07 22:22:00
マ板に池
50:デフォルトの名無しさん
08/09/08 17:41:04
アドバイス頂きたいのですが、プログラム終了時まで値を保存する、なんかのデータ型のオブジェクトの配列を確保したいと思ったのですが、プログラム実行時まで配列の要素数が分からない性質のプログラムだとします。
その場合、C++だと char* ch[] とか int* dt[] だけでは
storage size of `ch' isn't known (MinGW)のようにエラーになってしまうので、事前に配列を宣言しておくことができません。
なので、今回のように必要な数がプログラム実行時まで不明な同型のオブジェクトを動的に確保して、それらを一まとめにしておくには、配列ではなく次の要素へのポインタを格納したオブジェクトのリストを使うしかないでしょうか?
51:デフォルトの名無しさん
08/09/08 17:48:12
>>50
mallocで必要なサイズの領域を確保すればいいんでない
52:デフォルトの名無しさん
08/09/08 17:50:46
std::vector
53:デフォルトの名無しさん
08/09/08 18:00:42
malloc (new) 以外に何か必要なの?
54:デフォルトの名無しさん
08/09/08 18:05:10
>>53
いいえ、std::vectorを使いましょう。
55:50
08/09/08 18:06:43
ありがごうございます。
>>51
プログラム開始から終了の間に、順々に必要な要素数が増えていく感じなので、最初に一気にmalloc とか new int [10] とかではダメだったのです。
>>52
そーか、要素がpriority_queueのポインタでして、ポインタってvectorに格納できないと勝手に思いこんでたんですが、調べてたらポインタでも大丈夫なんですね。
vecotrでなんとかなりそうです。ありがとうございましたm(_ _)m
56:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/08 19:13:59
>>56
&d → %d
58:56
08/09/08 19:17:55
>>57
ありがとうございます。
59:デフォルトの名無しさん
08/09/08 20:07:57
次からは、「どんな結果になった(どんなエラーが出た)のか」
「それは自分の望みとどう違うのか」くらいは書いてくれよ。
>>56のケースは、たまたまコトの次第がすぐ特定できる内容だからスムーズに行ったけども。
60:デフォルトの名無しさん
08/09/08 20:21:54
>>59
すみません、今後気を付けます。
61:デフォルトの名無しさん
08/09/09 19:31:39
hStdOutputの出力を、char型配列にするにはどうしたらいいですか?
62:デフォルトの名無しさん
08/09/09 19:45:58
すなわちメモリのハンドルが取得したいんです
63:デフォルトの名無しさん
08/09/09 19:53:38
そういうことは出来ません。
64:デフォルトの名無しさん
08/09/09 19:53:38
GlobalAllocでできることがわかりました。
ところでVirtualAllocなど種類がありますがどんな違いがありますか?
65:デフォルトの名無しさん
08/09/09 20:01:07
マニュアルやAPIをちゃんと読みましょう。
66:デフォルトの名無しさん
08/09/09 20:09:20
みつけたよ
URLリンク(konuma.txt-nifty.com)
・ HeapAlloc
異なるメモリブロックを多数作成するときに利用します。パフォーマンスを最大にしたい場合、
同じブロック長のみで構成したヒープハンドルを複数作成する必要があります。
・ VirtualAlloc
多量のデータを格納する空間を用意する必要があるが、一部は利用しないかもしれない場合に
重宝します(ハッシュテーブル等)。部分的に領域の確保を遅らせることが出来ます。
多量のメモリを確保する場合は基本的にこの関数に頼るべきです。
・ LocalAlloc/GlobalAlloc
どちらもWin16時代の名残です。Win32APIが要求しない限り、新規にこれを採用する理由はありません。
・ malloc (new)
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりします。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いですが、その分最も遅いです。一般的には最後にHeapAllocを呼び出す結果になります。
67:デフォルトの名無しさん
08/09/10 08:46:26
個人のブログをソースにするのはどうかと、MSDN読めよ。
68:デフォルトの名無しさん
08/09/10 12:38:43
出力が変になります。 「あ」の前にゴミがつきます。どこがだめかわかりますか
char *sh=new char[1024];
lstrcat(sh, "あいうえおかき");
printf("%s\n", sh);
delete sh;
69:デフォルトの名無しさん
08/09/10 12:47:08
自己解決しました
char *p=new char[1024];
strcpy(p,"あいうえ");
printf("%s\n", p);
delete p;
70:デフォルトの名無しさん
08/09/10 12:48:06
>>68
lstrcatは文字列を末尾に結合する関数。
newで確保した領域の中身は不定。
だからlstrcatはsh内の最初の'\0'を探してその位置に"あいうえおかき"を挿入する。
予めsh[0]に'\0'を入れておけば意図どおりの動作はする。
71:デフォルトの名無しさん
08/09/10 12:50:53
>>70
サンクス
72:デフォルトの名無しさん
08/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
08/09/10 14:01:24
メモリ300Mの確保では、newが最速という結果が出ました。なぜかコピーが速いです。
74:デフォルトの名無しさん
08/09/10 14:07:37
それぐらいこだわりを入れるなら、ポインタを使ったほうがいいよ。
75:デフォルトの名無しさん
08/09/10 14:25:45
いやいや、ポインタは一回はまると難しすぎるから初心者には無理無理w
76:72
08/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:デフォルトの名無しさん
08/09/10 14:28:12
っGetLastError
78:デフォルトの名無しさん
08/09/10 14:32:24
当たり前だ
10回行かないだろ
言語のまえにバソポンについて勉強汁
79:72
08/09/10 14:33:12
自己解決しました。
VirtualFree(q, memsize, MEM_DECOMMIT);を
VirtualFree(q, 0, MEM_RELEASE);にしたら成功しました。
でも、コミット解除と、領域解放の違いがわかりません。
80:72
08/09/10 14:40:54
領域確保をHDD増設すると、コミットはFormatみたいなものですか?
コミット解除は、NTFSをOSが管理できないFormatと見なすようなものですか?
81:デフォルトの名無しさん
08/09/10 14:46:47
>>79
説明すると長くなるからMSDNのメモリ管理に関する項目読んで。
82:72
08/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:デフォルトの名無しさん
08/09/10 15:09:41
メモリ確保関数のうち、巨大な確保が一番成功しやすいのは、VirtualAllocExでしょうか?
あと、CreateFileMapping(INVALID_HANDLE_VALUE,・・・)はVirtualAllocExと同じですか?
メインメモリ。仮想記憶のどこかに確保されて性能に違いはありませんか?
84:デフォルトの名無しさん
08/09/10 15:11:53
ぜんぶMSDNにかいてあるから探せ
85:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/10 15:42:26
インデントを整えてくれ
醜い
87:デフォルトの名無しさん
08/09/10 16:49:38
メモリが512Mしか乗っていなくて、確保できた最大サイズ1.6Gの読み書きテストをすると
動作がおそくなります。 物理メモリの確保サイズはせいぜい300Mという所とおもいます。
300M以上の場合、メモリや仮想メモリを使わずに、ファイルにマッピングしたいと思います。
アロケータというのを聞きますが、newやSTLを自前で管理するにはどうしたらいいですか?
88:デフォルトの名無しさん
08/09/10 16:59:53
newはoperator new
アロケータは3番目のテンプレート引数に指定できる
89:デフォルトの名無しさん
08/09/10 17:19:32
自前のアロケータを使用してSTLを実用で使うまでにはどのような手順をとればいいかりません。
どうしたらいいですか
90:デフォルトの名無しさん
08/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
08/09/10 17:25:57
unionのなかのstructに名前をつけたらコンパイルはとおりますが、
つけないで通す方法と、なぜ通らないかが理解したい箇所です。
92:デフォルトの名無しさん
08/09/10 17:27:50
>>89
どういうキーワードでググッた?
93:デフォルトの名無しさん
08/09/10 17:42:57
>>87
そんなことしたって速くならないよ。
それで速くなるならアプリはみんなそうするし、メモリを何Gも積む奴もいない。
94:デフォルトの名無しさん
08/09/10 17:59:03
>>92
アロケータ、STLなどです。
>>93
他のOSなどのメモリを食い尽くさないためです。
実メモリが無くなれば他のソフトにまで影響が出ます。
95:デフォルトの名無しさん
08/09/10 18:30:22
>>90
2008 SP1では通ったぞ
規格的に適合してるかは知らん
96:デフォルトの名無しさん
08/09/10 18:46:28
一瞬で10Gの空ファイルを作るにはどうすればいいんですか?
97:デフォルトの名無しさん
08/09/10 18:47:06
環境による
98:デフォルトの名無しさん
08/09/10 18:49:02
魔法使いに頼む
99:デフォルトの名無しさん
08/09/10 18:58:45
空ファイルってサイズあるの?
100:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/10 19:23:31
>>96
何の目的かわからないけどWinならスパースファイルを作ればいい。
見せ掛けだけだからディスク容量は減らないが。
102:デフォルトの名無しさん
08/09/10 19:25:34
1Gのファイルを作って見たけど、体感で60秒ぐらいかかった。結構時間かかるんだね。
gcc
103:デフォルトの名無しさん
08/09/10 20:09:44
>>94
それで検索して一番目に作り方と使い方の説明ページが出てくるけど。
そのページでさっぱり分からないとなると、
ここで聞いても無駄だと思う。
レスで書ける文字数的に。
具体的にどこが分からないか書けばアドバイスしてくれる人も居るかもしれないけどね。
104:デフォルトの名無しさん
08/09/10 21:39:44
>>96
Winの場合、適当にファイル作ってファイルポインタを1GBの位置に移動、
ファイル終端をそこに設定すればいける
105:デフォルトの名無しさん
08/09/10 21:40:58
1GBじゃなくて10GBだった。まあサイズはなんだっていいけど。
106:デフォルトの名無しさん
08/09/10 21:46:35
超初心者です。
クラスを3つほど作り
数を入力して、もともと設定されている数と計算をし、
他のクラスの数から引いて、表示する
ってのを作るにはどうしたらいいですか?
107:デフォルトの名無しさん
08/09/10 21:49:34
>>106
宿題スレでもいくといいよ
108:デフォルトの名無しさん
08/09/10 21:53:35
>>107
宿題じゃなくて、宿題を片付けるための試しのプログラムだから・・・OTL
109:デフォルトの名無しさん
08/09/10 22:13:28
>>108
宿題スレでもいくといいよ
110:デフォルトの名無しさん
08/09/10 22:15:13
そもそも意味がわからん
111:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/10 23:40:49
char**
113:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/10 23:47:35
typedef
115:デフォルトの名無しさん
08/09/10 23:48:53
void A(int card[4][13], char *mark[4], char *number[13])
A(card, mark, number);
116:デフォルトの名無しさん
08/09/10 23:51:06
作ってみたんですけど
エラー E2176 ted.cpp 14: 宣言に型が多すぎる
エラー E2193 ted.cpp 50: 呼び出し時のパラメータが足りない:M::Attacked(Kougeki)(関数 main() )
となって上手くいきません
指摘お願いします。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
117:111
08/09/10 23:55:16
111です。
ありがとうございました!
できました!!
118:デフォルトの名無しさん
08/09/11 00:01:51
>>116
class Kougeki
{
(中略)
}; ←ここにセミコロン
m.Attacked(); ←Kougeki型の変数を渡さないといけない
119:デフォルトの名無しさん
08/09/11 00:06:45
k.damage == com * pow;
^^;
120:デフォルトの名無しさん
08/09/11 00:08:41
s.Attack();
m.Attacked();
↓
m.Attacked(s.Attack());
かなあ?どうしたいのかよくわからないので何ともいえないけど。
121:116
08/09/11 00:09:26
解決しますたー
ありがとうございました!
122:デフォルトの名無しさん
08/09/11 00:22:00
結局どうやったかを書いてくれないのがちょっと残念なとこだがいつものことだな
123:デフォルトの名無しさん
08/09/11 06:25:22
自分をお客さんだと思ってるんだろうな。
getばかりでsetの概念が飛んでる。
124:90
08/09/11 07:07:34
その後・・・VC++2008 ExpressEdition だと問題なくコンパイル〜実行できました。
VC++2005 ExpressEdition + SP1 ではコンパイルエラーが出るようです。
コンパイラが対応していない記述方法が原因という理解をしました。
ありがとうございました。
125:デフォルトの名無しさん
08/09/11 07:09:52
>>124
あの糞なBCC(5.9.3)でもまともに走るぞ。
バグじゃね?
126:デフォルトの名無しさん
08/09/11 07:28:44
.
127:デフォルトの名無しさん
08/09/11 09:29:38
名前をつけてあげるといいと思うよ
128:デフォルトの名無しさん
08/09/11 09:41:55
ゴッドファーザーですな
129:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/11 18:08:02
void CopyPtr(int* in, int*& out)
{
out = in;
}
131:デフォルトの名無しさん
08/09/11 18:08:21
>>129
void CopyPtr(int* in, int** out)
{
*out = in;
}
.....
CopyPtr(in, &out);
.....
132:デフォルトの名無しさん
08/09/11 18:24:34
>>130-131
できたぁ〜ありがとん!
133:デフォルトの名無しさん
08/09/11 18:35:56
ダイアログのOK、キャンセルを押してもダイアログが閉じません。
あとBCCFormで.rcと.hは作りました。
どうすればいいか教えてください。
あとフリーのリソースエディタで皆さんがいいと思うものを教えてください。
URLリンク(www2.uploda.org)
134:デフォルトの名無しさん
08/09/11 18:43:21
>>133
ボタンのコントロールIDを IDOK や IDCANCEL にすればよい
135:デフォルトの名無しさん
08/09/11 18:51:17
>>134
できました!
ありがとうございます。
あとBCCFormでリソースファイルを作成すると、include <windows.h>が作成されないんですけどほかのソフトのほうがいいでしょうか?
ちょっと使いにくいかなと思って。
136:デフォルトの名無しさん
08/09/11 20:07:39
>>135
それはBCCがリソースコンパイルにwindows.hを必要としないが故の仕様
137:デフォルトの名無しさん
08/09/11 22:59:31
質問です。なるべく省メモリにしたいのですが。
DLLとEXEが提供されているプログラムがあり、
メモリ (DLLのみ) かファイルを渡して処理(or出力ファイル)を返すのですが
ファイルを渡した方が省メモリになりますよね?
この場合、ファイルが1Gあったとしてはじめの100Mだけ渡したい場合はどうすればいいですか?
138:デフォルトの名無しさん
08/09/11 23:02:44
100M分だけ切り抜いて渡すしかありませんか?
メモリに格納すれば、書き込むコストが無くせますが、100M分余計にメモリを食います。
相手のプログラムがその100Mを作業領域に使ってくれればかまわないのですがその保証はありません。
139:デフォルトの名無しさん
08/09/11 23:04:16
ニホンゴでOKでーす
140:デフォルトの名無しさん
08/09/11 23:04:46
「ファイルを渡す」ってのは具体的にはどういう処理なの?
141:デフォルトの名無しさん
08/09/11 23:06:32
testprg.exe testfile
という風にです。 標準ではプロンプトに出力が出ますが -o outputfileなども書けます。
142:デフォルトの名無しさん
08/09/11 23:08:33
でかいファイルを、小さく見せかける方法がわかれば、コピーする必要がないのですが。
たとうばchar[]でいうと\0を途中にいれるような方法です。
143:デフォルトの名無しさん
08/09/11 23:09:58
中国か韓国の人に聞いたらどうですか?
144:デフォルトの名無しさん
08/09/11 23:11:28
1Gの後半900Mをロックしておいて、前半の100Mで一つのファイルと見せかけて
処理が終わったら、また1Gに戻すような方法はありますか?
145:デフォルトの名無しさん
08/09/11 23:12:48
>>141
じゃ、メモリを渡すってのは?
146:デフォルトの名無しさん
08/09/11 23:14:44
100M切り取ってコピーして終わったら書き戻せよ
147:デフォルトの名無しさん
08/09/11 23:14:51
メモリで渡すと、余分に100M使い込んでしまうんです・・・なんとかなりませんか?
148:デフォルトの名無しさん
08/09/11 23:17:04
>>146
コピーすれば、処理後は削除するだけで良いとは思いますけど・・・
でもコピーのコストが掛かるのが嫌なんです。
149:デフォルトの名無しさん
08/09/11 23:20:49
ファイル内容をロックしたまま、サイズだけを縮小出来れば、
HDD、メモリの物理的な動作は必要なく、一瞬で済むはずです。
戻すのも一瞬です。 教えてください。
150:137
08/09/11 23:26:23
自己解決しました。
151:デフォルトの名無しさん
08/09/11 23:26:50
してません
152:デフォルトの名無しさん
08/09/11 23:30:09
もうCは難しすぎるからやめた!
153:デフォルトの名無しさん
08/09/11 23:30:10
150は本物です。 その方法は、メモリマップドファイルでサイズ指定してDLLに渡すんです。
でもこれだと、exeしか提供されていない場合は出来ません。
exeでも出来る方法はありませんか
154:デフォルトの名無しさん
08/09/11 23:36:51
DLLだって、DLLしか提供されてなかったら、渡すほうから勝手に渡し方を決められないだろ。
155:デフォルトの名無しさん
08/09/11 23:39:38
ついに中国共産党の幹部が動き出したぞ!
156:デフォルトの名無しさん
08/09/11 23:39:51
DLLの場合は、ポインタchar *で渡すので同時にサイズを指定できるんです。
exeはファイルしか入力できないので、そのままだと1G全部処理してしまいます。
なんとかなりますか?
157:デフォルトの名無しさん
08/09/11 23:43:23
通信しろよ
158:デフォルトの名無しさん
08/09/11 23:48:10
まずこれがわかりません。
1Gのファイルを先頭100Mだけ残して縮めるのはどうしたらいいですか?
あと、100Mと900Mのファイルをコピー無しに連結するのはどうしたらいいですか?
どちらも書き込み不可にしておけば目的を達成できます。
159:デフォルトの名無しさん
08/09/11 23:49:44
うぜぇな。
しらねぇよ。
NTFSとMFTでもググって勝手にやれ。
160:デフォルトの名無しさん
08/09/12 00:01:29
>>156
154無視かよ、俺じゃないけど。
それはEXEだから、DLLだから、という問題ではない。
EXEでもファイル名と、そのうち何バイト目から何バイト目だけを処理するって
オプションを指定できるようになっているものだってあるし、
DLLでも\0終端文字列を受け取るので、バイト数を直接的に指定できないってものもある。
161:デフォルトの名無しさん
08/09/12 00:10:02
バイナリデータならサイズ指定出来るのは普通ですよ。あとEXEにファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では?
縮小、結合方法を教えてもらいたいです。
162:デフォルトの名無しさん
08/09/12 00:40:41
constの付いたポインタは、const_cast使えばconstをはずせますが、
constの付いたポインタでない普通の変数(intとかdoubleとか)のconstを
一時的にはずす方法ってありますか?
163:デフォルトの名無しさん
08/09/12 01:09:47
*(type-name *)&variable = rvalue
const int i = 10;
*(int *)&i = 20;
i = 30; 見なかったことにしてくれ
164:デフォルトの名無しさん
08/09/12 01:18:35
int& j = *const_cast<int*>(&i);
165:デフォルトの名無しさん
08/09/12 01:24:12
>>164
int& j = const_cast<int&>(i);でおk
166:デフォルトの名無しさん
08/09/12 01:30:27
>>161
関数にファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では?
って言ってるのと同じに見える
で、知りたいのは
・1つのファイルを、メモリに読み込むことなく分割する方法
・2つのファイルを、メモリに読み込むことなく結合する方法
ってこと?それならたぶん無理だと思う
そもそも、ファイルの内容をメモリに読み込まないと、ファイルの操作ができないから
>>138を見ると、どこで100M分余計にメモリを食うのかわからない。
dll なり exe なりに渡すとコピーが発生するって事? >>142からそんな風に感じたんだけど。
でも>>149見ると、その dll や exe が受け取ったデータのコピーを取るとは思えない。
ファイルの中身をメモリに読み込むのが『余計』だと考えてるなら、これは余計じゃないんで効率化は無理
10Mずつ読み込むとか、そういう解決方法しかないと思うよ
結論:何をしてるのか、何がしたいのか、が分からない。今やってることをそのまま書いた方が分かりやすいかもよ
167:162
08/09/12 01:52:35
>>164
>>165 (同じ人?)
ありがとうございます。
168:デフォルトの名無しさん
08/09/12 02:16:59
inodeでぐぐる?
169:162
08/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:デフォルトの名無しさん
08/09/12 02:28:23
typeid(Type).name()はoperator=とoperator!=で比較するしか
意味がない。
返される文字列は処理系依存。だが異なる型は異なる文字列
になる事は保証されている。
171:169
08/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:デフォルトの名無しさん
08/09/12 03:11:10
ダメダメだね。name()はそんなことに使えない。
それこそ"type0", "type1"みたいな連番でも構わないわけだし。
素直に特殊化で頑張ってください。
173:169
08/09/12 03:47:41
>>172
ありがとうございます。
便利なの見付けたと思ったのですが、
>それこそ"type0", "type1"みたいな連番でも構わない
その通りですね。
出直してきます。m(_ _)m
174:デフォルトの名無しさん
08/09/12 06:03:33
PERL RUBY Pythonをcから使いたいとき、どれが最も必要なファイルが少なく済みますか?
合計のファイルサイズが小さい順に押してください。
175:デフォルトの名無しさん
08/09/12 06:38:55
IronPythonにきめました。C++(API)もC$(NET)も利用できてコンパイルして実行ファイルが作れるらしいです。
176:デフォルトの名無しさん
08/09/12 06:40:46
よかったですねkがんばってください
177:90
08/09/12 07:46:35
>>127
名前をつけるという方法で解決はできるのですが、
何かライブラリとかで提供されてきたstructとかだったら、勝手に型名をつけられないなぁと。
それか、型名無しだから名前を勝手につけても問題はない・・・ということになるのでしょうか。
その後いろいろやってたらunionを入れなくても、
struct中に2つ以上の型名のないstructをいれても2つめからのstructで>>90と同じエラーになります。
エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。
178:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/12 10:09:54
実測したわけじゃないが、Cライブラリのfread fwriteを使った方が速いらしい。
181:デフォルトの名無しさん
08/09/12 10:13:36
WindowsAPIが最速なことは間違いない。
Cはコスト掛けた上で最後にAPIを呼ぶ。
182:デフォルトの名無しさん
08/09/12 10:15:28
ありがとうございます。
今度試して見ます。
fread,fwriteで思い出しましたが、c++のread, write関数との速度の違いはいかがでしょうか?
自分としては、freadやfwriteは、使い勝手の面で、境界越えしそうで怖いのですが。
183:デフォルトの名無しさん
08/09/12 10:40:48
Vistaのイベントログに重大のクラスのイベントを書き込みたいです。
ReportEventで何を渡せばいいのでしょうか?
調べたのですが重大だけが見つかりませんでした。。。
184:デフォルトの名無しさん
08/09/12 10:49:23
fread/fwriteは移植用で実際はネイティブのAPIを呼ぶ。
ネイティブAPIを避けるため、普通ならfwriteを呼ぶのがいい。
185:デフォルトの名無しさん
08/09/12 10:53:38
Windowsでスクロール付きのテキスト表示エリアを簡単に作れるライブラリはありませんか?
186:デフォルトの名無しさん
08/09/12 10:55:06
ありがとうございます。
fwriteでがんばります。
187:デフォルトの名無しさん
08/09/12 12:16:10
>>185
エディットコントロール
188:デフォルトの名無しさん
08/09/12 12:26:10
トンクス
189:デフォルトの名無しさん
08/09/12 17:10:52
>>186
fread、fwriteは2Gまでの制限があるから注意な
190:デフォルトの名無しさん
08/09/13 00:50:04
>>178
CreateFileするときにSECURITY_ATTRIBUTESで継承を許可(bInheritHandle = TRUE)にしておけば、
CuplicateHandleは要らないはず。
191:デフォルトの名無しさん
08/09/13 04:30:38
>>185
C++Builder使え
192:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/13 17:01:25
シングルコアでやったらまず間違いなく遅くなる
194:デフォルトの名無しさん
08/09/13 17:35:11
>>192
寧ろ4で割った余りが0,1,2,3でスレッドを分けた方が早いかもよ。
特にIntelの2コアや4コアの場合。
195:デフォルトの名無しさん
08/09/13 19:59:55
>>192
Pen4,Core2Duo,AMD系ではおそらく逆に遅くなる
Core2Quadなら上手くやれば早くなる
環境依存だけどプロセスの優先度上げて、
コンテキストスイッチ減らした方が良いんじゃない?
196:デフォルトの名無しさん
08/09/13 20:47:34
>>192
スレッド数が物理コア数以下なら速くなるはずだけど
その処理内容だとメモリアクセスがボトルネックになりそう。
SIMDなんかがある環境ならそれ使うようにオプション指定するなり
インラインアセンブラ使うのもいいんじゃないか。
197:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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;}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4232日前に更新/177 KB
担当:undef