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;}
199:デフォルトの名無しさん
08/09/13 21:02:22
手間の掛かる処理にしてみました。浮動小数点の割り算。2スレッドが早くなりました。
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 10097152
double *a,*b; double s[4];
double f(void){s[0]=0; for(int n=0;n<N;n++)s[0]+=a[n]/b[n];return s[0];}
unsigned WINAPI g0(void*){for(int n=0;n<N/2;n++)s[0]+=a[2*n]/b[2*n];return 0;}
unsigned WINAPI g1(void*){for(int n=0;n<N/2;n++)s[1]+=a[2*n+1]/b[2*n+1];return 0;}
double g(void){ s[0]=s[1]=0; HANDLE hd[2];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, g0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, g1,NULL, 0 ,NULL);
WaitForMultipleObjects(2, hd, TRUE, INFINITE);
CloseHandle(hd[0]);CloseHandle(hd[1]); return s[0]+s[1];}
unsigned WINAPI h0(void*){for(int n=0;n<N/4;n++)s[0]+=a[4*n+0]/b[4*n+0];return 0;}
unsigned WINAPI h1(void*){for(int n=0;n<N/4;n++)s[1]+=a[4*n+1]/b[4*n+1];return 0;}
unsigned WINAPI h2(void*){for(int n=0;n<N/4;n++)s[2]+=a[4*n+2]/b[4*n+2];return 0;}
unsigned WINAPI h3(void*){for(int n=0;n<N/4;n++)s[3]+=a[4*n+3]/b[4*n+3];return 0;}
double h(void){ s[0]=s[1]=s[2]=s[3]=0; HANDLE hd[4];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, h0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, h1,NULL, 0 ,NULL);
hd[2]=(HANDLE)_beginthreadex(NULL, 0, h2,NULL, 0 ,NULL); hd[3]=(HANDLE)_beginthreadex(NULL, 0, h3,NULL, 0 ,NULL);
WaitForMultipleObjects(4, hd, TRUE, INFINITE); return s[0]+s[1]+s[2]+s[3];}
200:デフォルトの名無しさん
08/09/13 21:03:09
main(){ cout<<"初期値設定中・・・\n"; a=new double[N] ; b=new double[N] ;
int n,cl; for(n=0;n<N;n++){int x=rand(); a[n]=1+(double)(x&15); b[n]=1+(double)((x>>4)&15); }
cout<<"計測開始・・・\n";
cl=GetTickCount(); cout<<"1 スレッド 計="<<f()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"2 スレッド 計="<<g()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"4 スレッド 計="<<h()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;}
201:デフォルトの名無しさん
08/09/13 21:06:39
1CPUなのに2スレッドは凄い効果あります。およそ倍速出ます。
何度もメモリ読んでいるうちに、キャッシュが効いたりするのではと思い
一番最後にもう一度1スレッドを計算しても速度ははじめと同じでした。
202:デフォルトの名無しさん
08/09/13 21:13:22
>>201
こっちの方が早くね?
主な変更はローカル変数 x の導入
unsigned WINAPI g0(void*dummy){unsigned int x=0;char *p=&a[0],*q=&b[0];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[0]=x;return 0;}
unsigned WINAPI g1(void*dummy){unsigned int x=0;char *p=&a[N/2],*q=&b[N/2];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[1]=x;return 0;}
203:デフォルトの名無しさん
08/09/13 21:23:58
BCC2009の速度最適化したときの数値は1700 clockくらいなんですが、
VC++2008の速度最適化したときの数値は250 clockくらいです。
BCCの速度が鈍いだけで。VC++2008だと、1スレッドが最も速かったです。
>>202 このようにしてもVC++では大して効果なく1スレッドが最速でした。1コアCPUなんですが。
unsigned WINAPI h0(void*){int m=0; double x=0; for(int n=0;n<N/4;n++){x+=a[m]/b[m];m+=4;} s[0]=x; return 0;}
204:デフォルトの名無しさん
08/09/13 21:44:21
CPUによって違うだろ。Core2使ってるの?
Athlon64だとどちらも1スレッド>2スレッド>4スレッドとなる。
近々X2かPhenom買うのでそちらも試してみたい。
205:デフォルトの名無しさん
08/09/13 22:15:20
初期のセレロンの1コア2GHzですよ
206:デフォルトの名無しさん
08/09/13 22:19:00
NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ
207:デフォルトの名無しさん
08/09/13 23:31:29
すみません、初心者な私に教えて下さい。
#include <list>
using namespace std;
class C
{
public:
int ic;
C (int c) { ic = c; }
};
int main()
{
list<C *> mylist;
mylist.push_back( new C(0) );
mylist.push_back( new C(1) );
mylist.push_back( new C(2) );
}
こんな感じになってるとして、ic == 1 であるようなオブジェクトだけを、
・list から削除し、
・かつ delete する
には、どのように書けばよいのでしょう。
208:デフォルトの名無しさん
08/09/14 00:32:06
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class C {
public:
int ic;
C (int c) { ic = c; }
~C() { cout << "~C" << endl; }
};
struct delete_equal_to: public std::binary_function<C *, int, bool> {
bool operator ()(C * p, int c) const {
return (NULL != auto_ptr<C>(p->ic == c ? p: NULL).get());
}
};
int main() {
list<C *> mylist;
mylist.push_back( new C(0) );
mylist.push_back( new C(1) );
mylist.push_back( new C(2) );
cout << mylist.size() << endl;
mylist.remove_if(bind2nd(delete_equal_to(), 1));
cout << mylist.size() << endl;
}
209:デフォルトの名無しさん
08/09/14 00:41:07
>>208
returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。
そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。
210:デフォルトの名無しさん
08/09/14 00:45:31
「まだ」C++標準ではないのでね。
211:207
08/09/14 00:57:04
ぐっは、難しい…。
もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。
でも一つずつ読解してみます。
ありがとうございました!
212:デフォルトの名無しさん
08/09/14 00:59:34
ついでに言っておくけど
mylist.push_back( new C(0) );
はpush_backに失敗するとnew C(0)したオブジェクトがリークする
213:デフォルトの名無しさん
08/09/14 01:15:33
馬鹿な私に教えて下さい。
宿題板で、作って頂いたc++なのですが習ってない部分も出ていて、
よくわからず、困っています。
習っていない関数を使うのには、特に問題はないのですが
提出の際に説明書っぽいのをつけるのですが作成できず困っています。
例えば、この作業をするには?とか、オプションでこんな事も出来ます
とかです。
スレチかもしれませんが、宜しくお願いします。
ちなみに、宿題板ではボロボロに言われ、ここにきました。
すいません。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
214:207
08/09/14 01:18:29
なるほど…。
ということは、push_back() の引数として直接与えるんじゃなくて、
いったん
C *p = new C(0);
して、とりあえず mylist.push_back( p ); としてみて、
std::bad_alloc が投げられたらあきらめて delete する、
みたいな感じでしょうか。
215:デフォルトの名無しさん
08/09/14 01:22:08
>>213
そんなの一から読めって言うのかよ。
大まかな機能ぐらい説明しろよ。
お前が作らせたんなら分かるだろうが。
というか、宿題スレ池。
C/C++の宿題を片付けます 115代目
スレリンク(tech板)
216:デフォルトの名無しさん
08/09/14 01:29:56
>>215
わかりました。宿題スレに行きます。
すいませんでした。ご迷惑お掛けしました。
ちなみに、内容はエンコドとデコドで
テキストを吐き出し、オプションでプリントするみたいな感じです。
失礼しました。
217:デフォルトの名無しさん
08/09/14 01:33:41
見たけどコメントついてるじゃん
無理せずに単位落としたら?
218:デフォルトの名無しさん
08/09/14 01:36:08
>>214
bad_allocが投げられたらdeleteする必要はないぞ。
219:207
08/09/14 01:42:05
>>218
了解しました。
どうもありがとうございます。
220:デフォルトの名無しさん
08/09/14 02:24:00
>>218
お前は読み間違えてる
221:207
08/09/14 02:29:02
>>220
あ、やっぱ delete(p); は必要ですか。
ていうか私が言葉足らずでした。
222:デフォルトの名無しさん
08/09/14 03:02:24
std::bad_alloc例外が投げられるという事はメモリ確保に
失敗しているのだから、deleteしたらまずいだろう
223:デフォルトの名無しさん
08/09/14 03:37:51
こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。
C *p = new C(0);
try
{
mylist.push_back(p);
}
catch (std::bad_alloc const&)
{
delete p;
throw;
}
auto_ptrでもいける。
std::auto_ptr<C> p(new C(0));
mylist.push_back(p.get());
p.release();
224:デフォルトの名無しさん
08/09/14 03:54:17
>>223
ああそういう意味かごめん
そりゃdeleteは必要だわ
newとpush_backを分離する事を前提とした
話なのね
225:デフォルトの名無しさん
08/09/14 06:23:11
>>207
さらっと、というか自分でループまわす構文はあるよ。
STL的ではないけど。
for(list<C *>::iterator it=mylist.begin(); it != mylist.end();) {
// 1なら
if((*it)->ic == 1) {
delete *it;
it= mylist.erase(it);
}
// 1じゃないなら
else {
++it;
}
}
226:デフォルトの名無しさん
08/09/14 06:53:47
確かboostだとこう書ける
#include <boost/ptr_container/ptr_list.hpp>
typedef boost::ptr_vector<C> list_type; //ポインタ指定しないが、中身はポインタになる
list_type mylist;
mylist.push_back( new C(0) );
~
for(list_type::iterator it = mylist.begin(); it != mylist.end();) {
if(it->ic == 1) {
it = mylist.erase(it); //消去動作で自動でdeleteされる
}
~ //あとは225と一緒
詳細
URLリンク(www.kmonos.net)
227:207
08/09/14 10:05:26
>>223
> こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。
あ、そうです。言葉足らずというのはそれが言いたかったのでした。
>>225
おおお、これです。こんな感じのを期待していました!
> STL的ではないけど。
というのは、イテレーションしていく過程はあくまでイテレータにまかせるべきで、
「it= mylist.erase(it);」のような「つなぎかえ」(?)のようなことを外野がやるのは
スマートじゃない、ということでしょうか。
うーむ、「実行時に動的に new したものを連結させておき、いらなくなったらそこだけ外す」
というのは良くあるケースかと思っていたのですが、もしかしてそもそもデータ構造の
選び方が間違ってますか……? >>224氏も、
> newとpush_backを分離する事を前提とした
> 話なのね
とおっしゃってるし……。
>>226
いろいろな環境で動かしたいのでできれば boost は避けたいのですが、
でも勉強になります。特にリンク先の「etc」のところ。
ありがとうございます。
228:デフォルトの名無しさん
08/09/14 16:03:52
>>227
boostって静的リンク(?)だから大丈夫じゃないの?
229:デフォルトの名無しさん
08/09/14 16:44:57
ファイル分割+テンプレートの特殊化で悩んでいます。
Test.h(Testクラス ヘッダファイル)
Test.cpp(Testクラス コンストラクタ)
show.cpp(Test<T>::show() 関数)
show1.cpp(Test<Test<int>>::show() show()のテンプレート特殊化)
で構成されています。
show.cppにあるTest<T>::show()を
アップしたファイルのように書き換えるとコンパイルエラーが発生してしまい、
これを解決できません。
よろしくお願いします。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
230:デフォルトの名無しさん
08/09/14 17:58:13
Test.hのtemplate <typename T>class Testのメンバ関数として
friend ostream &operator << (ostream &str, T const &val) {
return str << val ;
}
C++はあまり使ったことはないけど、これでも追加するといいかも
エロいひとの解答待つか
231:デフォルトの名無しさん
08/09/14 18:12:39
>>225
list だと、こうじゃなかったっけ?
ごめん。調べないで書いてる。
for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) {
if ((*it)->ic == 1) {
delete *it;
mylist.erase(it++);
} else {
++it;
}
}
232:デフォルトの名無しさん
08/09/14 18:37:02
erase したイテレータを++するのは未定義動作じゃなかったか?
233:デフォルトの名無しさん
08/09/14 18:45:29
>>232
mylist.erase(it++);
はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。
listのeraseでは消したイテレータ以外は無効にならないから。
234:デフォルトの名無しさん
08/09/14 21:04:13
戻り値が次の要素じゃなかったっけ?
it = mylist.erase(it);
235:デフォルトの名無しさん
08/09/14 21:41:25
listなら++でも安全だとしても、別なコンテナに変えられる可能性も
考慮して、戻りを代入するべきでは。
236:デフォルトの名無しさん
08/09/14 22:10:33
>>235
set,multissetとかだとeraseの戻り値の型がvoidだったりするから、
it == hoge.eraseが書けないときもある。
vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も
考慮してit++にするべきでは。
237:デフォルトの名無しさん
08/09/14 22:53:20
>>236
vectorならit++は使えない。
238:229
08/09/14 22:53:23
>>230
ありがとうございます。
<<のオーバーロードで修正がベスト何ですかね。
239:デフォルトの名無しさん
08/09/14 23:26:15
vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end)
とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?
240:デフォルトの名無しさん
08/09/15 02:15:17
vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。
mapやsetはeraseの戻り値がvoidなので、it++するしかない。
シーケンスコンテナと連想コンテナの取り替えを想定するのは
無理があるって事だな。
241:デフォルトの名無しさん
08/09/15 09:14:33
effective STL に同じような話がある
242:デフォルトの名無しさん
08/09/15 10:28:05
Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど
VC++が入ってないPCでも実行する方法を教えてください。
243:207
08/09/15 10:29:22
>>225 氏の方法でも >>231 氏の方法でもうまくいきました。
ありがとうございます。
「別なコンテナに変える」ということの意味はまだ良くわからないので、
引き続き勉強します。
>>241
> effective STL に同じような話がある
なるほど、早速ポチりました。
244:デフォルトの名無しさん
08/09/15 10:47:02
>>242
エラーが出ないように修正する
245:デフォルトの名無しさん
08/09/15 10:53:17
>>244
VC++がインストールされているPCではエラーがなく実行できます。
246:デフォルトの名無しさん
08/09/15 10:54:07
>>242
まずはエラーの内容を示さないと・・・・
MFC7のdllがないとかか。
247:デフォルトの名無しさん
08/09/15 10:59:51
SideBySide絡みじゃ?
MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも
248:デフォルトの名無しさん
08/09/15 11:49:58
>>246
ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。
249:デフォルトの名無しさん
08/09/15 11:52:21
何で初心者って「エラーが出ます」「うまくいきません」
「動きません」って言って具体的なこと書かないんだろうな。
250:デフォルトの名無しさん
08/09/15 11:53:18
>>248
本当にメッセージそれだけ?
251:デフォルトの名無しさん
08/09/15 11:57:28
>>250
今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。
VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。
252:デフォルトの名無しさん
08/09/15 12:01:39
>>251
1. VC++のバージョンにあうランタイムライブラリをインストールさせる。
URLリンク(www.microsoft.com)
URLリンク(www.microsoft.com)
2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
253:デフォルトの名無しさん
08/09/15 12:22:30
>>251
基本的によく分からないエラーが出たら、
スクリーンショットを撮る事。
そのプログラムのプロジェクトプロパティの
共通言語ランタイムサポートが「使用しない」以外なら
.NET Framework Runtime をインストールする必要がある。
MFCの使用が「共有DLLで~」なら「スタティックライブラリで~」に。
構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
254:242
08/09/15 12:26:45
調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。
ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。
今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。
>>253
今はエラーを確認できないのでスクリーンショットも撮れません。
255:デフォルトの名無しさん
08/09/15 12:30:06
pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか
256:デフォルトの名無しさん
08/09/15 12:31:07
>>254
>それでいいのでしょうか。
お前、>>252-253を読んだ上で言ってるの?
257:デフォルトの名無しさん
08/09/15 12:51:00
STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。
URLリンク(www.stlsoft.org)<)).
ATLSTL (URLリンク(atlstl.org)<)).
.netSTL (URLリンク(dotnetstl.org)<)).
MFCSTL (URLリンク(mfcstl.org)<))
WinSTL (URLリンク(winstl.org)<)
258:デフォルトの名無しさん
08/09/15 12:51:32
>>255
どういうソースで出るんだ?
259:デフォルトの名無しさん
08/09/15 12:53:36
>>252
できればほかのパソコンに何かインストールする方法は避けたいです。
>2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
よくわかりませんでした。もう少し詳しく教えてください。
>>253
共通言語ランタイムサポートを使用しないになっています。
>MFCの使用が「共有DLLで~」なら「スタティックライブラリで~」に。
>
>構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
この設定でコンパイルすると
1>MSVCRT.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Othello\Debug\Othello.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と、なってコンパイルできません。
>>256
調べてる間にレスがきてしまったので失礼しました。
260:デフォルトの名無しさん
08/09/15 12:55:16
>>257
自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い
問題が起きたとき、自力で解決出来んだろう
261:デフォルトの名無しさん
08/09/15 13:02:02
>>259
main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・
WinMain() で始まる windows プログラムなのに、
そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい
262:デフォルトの名無しさん
08/09/15 13:02:51
>>259
「/MDd」を「/MT」にしてないか?
「/MDd」なら「/MTd」だぞ。MD→MTなんだから。
あとプロジェクトプロパティの左上に構成ってあるだろ。
デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。
まぁ、リリース版だけでも良いと思うけど。
263:デフォルトの名無しさん
08/09/15 13:06:10
>>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ
264:デフォルトの名無しさん
08/09/15 14:03:24
2chでスレたてて盛り上げていこうぜ > STLport
日本語の解説サイトも作る
265:デフォルトの名無しさん
08/09/15 14:04:29
STLport > STLsoft ね。
266:デフォルトの名無しさん
08/09/15 14:29:55
>>258
こんな感じだそうです。
pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。
267:266
08/09/15 14:30:56
追記:その状態になってもダイアログを出したくないのです
268:デフォルトの名無しさん
08/09/15 14:54:55
double d;
d = pow(0.0, -2.1);
std::cout << d << std::endl;
d = pow(-2.1, 0.1);
std::cout << d << std::endl;
d = pow(10e10, 100);
std::cout << d << std::endl;
---------------
1.#INF
-1.#IND
1.#INF
再現出来ないな。何が違うんだろう。
269:デフォルトの名無しさん
08/09/15 15:01:17
ウィンドウプロジェクトにするとなります。
270:デフォルトの名無しさん
08/09/15 16:19:19
stlの質問です。
下記のプログラムを実行するとhoge関数が呼ばれて戻ってきた時には、TESTメンバのstrの領域はデストラクタで、
解放されてしまってます。この場合は、main()の最後でlistのstrを解放するしかないのでしょうか?
もっと別のやり方があれば教えて下さい。宜しくお願いします。
#include <string>
#include <list>
struct TEST {
std::string *str;
TEST() : str(NULL) {}
~TEST() { delete[] str; }
};
void hoge(std::list<TEST> &list)
{
TEST test;
test.str = new std::string[10];
list.push_back(test);
}
int main()
{
std::list<TEST> list;
hoge(list);
// list.str不適切なポインタ
return 0;
}
271:デフォルトの名無しさん
08/09/15 17:02:15
C++で数値計算を行なっていて、
計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。
上記とは一切関係ない部分のバグを取って再度実行したら、
ファイルへの出力が途中からされなくなってしまいました。
1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。
出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。
このような症状の場合、どのような原因が考えられるか教えていただけませんか?
272:デフォルトの名無しさん
08/09/15 17:12:59
・ストレージの空き容量が不足している。
273:デフォルトの名無しさん
08/09/15 17:20:56
・ストリームをフラッシュしていない(勿論、クローズしていない)。
274:デフォルトの名無しさん
08/09/15 17:23:12
そんなわけ・・・・マジだ、吊ってきます orz
エラーを出す方法とかありますか?
275:デフォルトの名無しさん
08/09/15 17:23:27
380回のあたりで異常な文字列を吐いてしまって
fstreamがエラー状態になっているとか。
276:デフォルトの名無しさん
08/09/15 17:24:33
>>270
TESTにきちんとコピーコンストラクタとoperator =を設ける。
277:271
08/09/15 17:25:52
>>274は>>272に対してのレスです。
申し訳ない
278:デフォルトの名無しさん
08/09/15 17:34:40
of.exceptions(badbit| failbit)としておけば、例外投げてくれる。
例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。
279:242
08/09/15 17:40:36
ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。
皆様ありがとうございます。
280:デフォルトの名無しさん
08/09/15 18:53:59
>>270
ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。
281:デフォルトの名無しさん
08/09/16 00:20:58
このプログラムで値が変わるのはなぜですか?
main(){
char a[]="マルチバイト文字列 mbs の sz 文字分をワイド文字列に変換します。";
wchar_t b[300];
cout<<strlen(a)<<endl;
MultiByteToWideChar(CP_ACP, 0, a, n, b, 300);
cout<<wcslen(b)<<endl;
}
282:デフォルトの名無しさん
08/09/16 00:28:54
自己解決しました
283:デフォルトの名無しさん
08/09/16 00:46:12
自己解決しませんでした。 値が変わります? なぜですか?
int m,n;
char a[]="マル"; wchar_t b[300];
n=strlen(a); mbstowcs(b,a,n);
m=wcslen(b); wcstombs(a,b,m);
cout<<n<<" "<<m<<" "<<strlen(a)<<endl;
284:デフォルトの名無しさん
08/09/16 00:50:03
自己解決しました
285:デフォルトの名無しさん
08/09/16 01:08:59
chatとw_charの変換はWindows APIのほうが鈍いようです。
#include <windows.h>
#include <time.h>
#include <iostream>
using namespace std;
main(){
int m,n,r,k;
char a[500]="マクロの動作は、有効になっているコンパイラ ディレクティブによって異なる。変換元と変換先の型が同じ場合は変換は行われない。コンパイラ ディレクティブでは、T および OLE を次のように変換する。";
wchar_t b[500];
n=strlen(a); mbstowcs(b,a,n+1);
m=wcslen(b); wcstombs(a,b,m+1);
int cl=clock();
for(k=0;k<1000000;k++){
r=MultiByteToWideChar(CP_ACP, 0, a, n, b, 500); b[r]=0;
r=WideCharToMultiByte(CP_ACP, 0, b, m, a, 500, NULL, NULL ); a[r]=0;}
cl=clock()-cl; cout<<cl<<endl;
for(k=0;k<1000000;k++){
mbstowcs(b,a,n+1); wcstombs(a,b,m+1);}
cl=clock()-cl; cout<<cl<<endl;}
286:デフォルトの名無しさん
08/09/16 01:34:51
MultiByteToWideCharの使い方が間違っているからです
287:デフォルトの名無しさん
08/09/16 01:44:31
正しい使い方はどうすればできますか
288:デフォルトの名無しさん
08/09/16 10:03:56
MSDNをよく読む
289:デフォルトの名無しさん
08/09/16 12:28:05
サイズが決まっていないchar*型の文字列が10個ていどあって
一致する文字が存在するか見つける高速な方法はSTLのmapですか。
一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。
290:デフォルトの名無しさん
08/09/16 12:32:39
Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。
Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による
擬似 Trieといった 他の Trie の実装に比べ高速に動作します.
オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが,
Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています.
URLリンク(chasen.org)
291:デフォルトの名無しさん
08/09/16 15:49:12
hashmapはそれほど速くないです。
#include <windows.h>
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
using namespace std;
map<string,int> stlmap;
hash_map<string,int> hashmap;
vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }
int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}
int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=timeGetTime();for(i = 0; i < N; i++) ;cl=timeGetTime()-cl; cout<<cl<<endl;
// STLmap
cl=timeGetTime(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=timeGetTime(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// Vector
cl=timeGetTime();
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break;
cl=timeGetTime()-cl; cout<<cl<<endl;}
292:十分速いじゃん…
08/09/16 16:25:57
#include <iostream>
#include <map>
#include <stlport/hash_map>
#include <string>
#include <vector>
#include <boost/progress.hpp>
using namespace std;
map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }
int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}
#define BEGIN { boost::progress_timer t;
#define END }
int n=0; string searchword(strgen());
#define N 500000
BEGIN;for(i = 0; i < N; i++) ;END; // 空のループ
BEGIN; for(i = 0; i < N; i++) stlmap.find(searchword); END; // STLmap
BEGIN; for(i = 0; i < N; i++) hashmap.find(searchword); END; // STLport_hashmap
BEGIN; // Vector
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; END;}
g++ hashmap.cxx -I /usr/include/stlport/ -lstlport -O2
% ./a.out |tr "\n" " "
0.00 s
0.66 s
0.17 s
4.95 s
293:デフォルトの名無しさん
08/09/16 16:35:30
訂正: -O2 -> -O0
294:デフォルトの名無しさん
08/09/16 17:15:34
unordred_mapのがいいよ多分
295:デフォルトの名無しさん
08/09/16 17:35:55
unordred_mapきはなかなかですね。
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
#include <unordered_map>
#include <time.h>
using namespace std;
map<string,int> stlmap;
hash_map<string,int> hashmap;
tr1::unordered_map<string,int> unorderedmap;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++){int r=rand(); str+=(char)(97+r&3)+(char)(97+(r>>2)&3);} return str; }
int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 10000; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);unorderedmap.insert(p);}
int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=clock();for(i = 0; i < N; i++) ;cl=clock()-cl; cout<<cl<<endl;
// STLmap
cl=clock(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=clock(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
//unorderedmap
cl=clock(); for(i = 0; i < N; i++) unorderedmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;}
296:デフォルトの名無しさん
08/09/16 18:02:46
GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。
ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。
URLリンク(articles.blog79.fc2.com)
297:デフォルトの名無しさん
08/09/16 18:16:27
なんにもいれずにそのコードを実行しようとしてるようなレベルですか?
298:デフォルトの名無しさん
08/09/16 19:07:44
VC2008のhash_mapはstdext名前空間に入ってるのか
コンパイルできずにしばらく悩んだ
それにしてもDinkumwareは遅い・・・
299:デフォルトの名無しさん
08/09/16 23:05:05
>>298
SP1当てればstd::tr1::unordered_mapも使えるよ。
もちろん性能は変わらないだろうけど。
300:デフォルトの名無しさん
08/09/16 23:59:36
ある変数に連動して、複数のvectorのサイズを変更できますか?
自分で増減させると面倒です。
301:デフォルトの名無しさん
08/09/17 00:02:40
自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。
302:デフォルトの名無しさん
08/09/17 00:13:45
関数って良いよね……
造形が凄くソソるよね……
303:デフォルトの名無しさん
08/09/17 00:19:27
free(normal) functionより
major(static) function objectの方がそそります^q^
304:デフォルトの名無しさん
08/09/17 00:34:32
もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな
305:デフォルトの名無しさん
08/09/18 02:44:47
a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。
このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。
どのように計算するのが速いでしょうか? 100項目程度あるとします。
306:デフォルトの名無しさん
08/09/18 02:47:04
つTaylor展開の低次の項
307:デフォルトの名無しさん
08/09/18 02:59:26
log経由で計算するのが速いと思うのですが・・・
>>306 C++のソース教えてください
308:デフォルトの名無しさん
08/09/18 03:02:51
2つの場合に限定してたとえば (1+a)^x (1+b)^y の(x+y)乗根 をRとおくと
(x+y)logR=xlog(1+a)+ylog(1+b)となり、logの計算量がどの位かかるかってことです。
309:デフォルトの名無しさん
08/09/18 03:23:15
>>307
ソースはめんどくさい
x+y+z+... = Sとおくと、答えはおよそ1+(ax+by+cz+...)/S
a<<1の時の近似式(1+a)^x=1+axを使って、a,b,c,...の1次の項だけ取り出すとこうなる
logとか使うまでもない
310:デフォルトの名無しさん
08/09/18 03:23:31
POWよりLOGのほうが速かったです。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000
main(){
int n, *a=new int[N];
float *x=new float[N];
for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];
double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);
s=0; cl=clock();
for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);
}
311:デフォルトの名無しさん
08/09/18 03:28:26
>>309
トンクス 教えてもらったものを付け加えましたが、値がかなり違っています。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000
main(){
int n, *a=new int[N];
float *x=new float[N];
for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];
double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);
s=0; cl=clock();
for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);
s=0; cl=clock();
for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl;
printf("%g %d\n",s,cl);
}
312:デフォルトの名無しさん
08/09/18 03:29:33
はじめとaとxの関係が違っているところが原因かもしれません 見直してきます
313:デフォルトの名無しさん
08/09/18 03:34:13
誤差は大体、max(a[n])^2*nくらいで抑えられるはず
314:デフォルトの名無しさん
08/09/18 03:42:10
あるていど近づきました。 aとxが逆になっていました。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000
main(){
int n, *a=new int[N];
float *x=new float[N];
for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];
double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+x[n],a[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);
s=0; cl=clock();
for(n=0;n<N;n++)s+=a[n]*log(1+x[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);
s=0; cl=clock();
for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl;
printf("%g %d\n",s,cl);
}
315:デフォルトの名無しさん
08/09/18 03:47:04
しかし、おかしい点があります。 教えてもらった式は、小さい項を無視しているので
値が小さくなるはずですが、計算結果が他より大きいです。
あと、(1+A) (1+B) (1+C) ・・・のS乗根は、なぜ上のような式になりますか?
Aの値は1より大きいかも知れないですが・・・すると高次の項のほうが大きいかもしれません。
(Aはaxなどです。)
316:デフォルトの名無しさん
08/09/18 03:48:25
というか、100項目程度の話じゃなかったのか?
N=200000でやったら、そりゃ誤差でかくなるの当たり前
317:デフォルトの名無しさん
08/09/18 03:51:31
要するに求めるのは(1+a)^(x/S)(1+b)^(y/S)...≒(1+ax/S)(1+by/S)...≒1+ax/S+by/S+...
a,b,...<<1なんだから、ax/S,by/,...S<<1だよな
318:デフォルトの名無しさん
08/09/18 03:54:25
トンクス そういうことですか わかりました
319:デフォルトの名無しさん
08/09/18 13:14:45
質問です。 1バイト文字列とwchar_t文字列 (特にwchar_t型文字で可)はどのように
変換できますか? 自作できますか?
320:デフォルトの名無しさん
08/09/18 13:18:48
>>319
wchar_tの文字コードは処理系依存であって、変換はcharの文字コードとwchar_tの文字コードを明確に示してくれないと答えようがない。
とりあえず使ってるコンパイラから書くってのはどう?
321:デフォルトの名無しさん
08/09/18 13:20:55
VC++2008、BCC2009でおねがいします。
322:デフォルトの名無しさん
08/09/18 13:26:38
すみません。なるべく速く変換したかったのですが、いい方法が自分で判りました。
すべての一語を標準関数で求めておいて、配列にいれておくという方法です。
323:デフォルトの名無しさん
08/09/18 13:29:33
>>320
文字列を記録している文字コードにも依存しますか?
SJIS、EUCなど、それぞれで変換関数は変わりますか?
324:デフォルトの名無しさん
08/09/18 13:31:57
コンパイラのフォルダを検索しましたが、wcstombsのコードはみつかりませんでした。 本体はlibになっているとおもいます。
325:デフォルトの名無しさん
08/09/18 13:38:18
かなり簡単であるとおもいました。
wchar_t → charはこれでいいみたいです。
wctomb(char *s, wchar_t wc)
{
*s = (char)wc;
}
URLリンク(libc.blog47.fc2.com)
326:デフォルトの名無しさん
08/09/18 13:42:17
またまたご冗談を
327:デフォルトの名無しさん
08/09/18 13:58:54
下記のようなプログラムで、どのように記述すれば、正常に動作するのでしょうか?
やりたいことは、gushtUpdataAreaが配列であり、gulngUpdataAddressの示すアドレスに対してオフセットしたアドレスにgushtUpdataAreaの中身をコピーするというものです。
volatile static u_short *pushtWrAdr;
volatile static u_short *pushtRdAdr;
volatile static u_long ulngAdr;
u_long ulngI;
ulngAdr = (gulngUpdataAddress & 0x0fffffff) + 0x0c800000;
pushtRdAdr = gushtUpdataArea;
pushtWrAdr = (u_long *)ulngAdr;
for(ulngI = 0; ulngI < gulngUpdataDataCount; ulngI++ ){
*pushtWrAdr++ = *pushtRdAdr++;
}
pushtWrAdr = (u_long *)ulngAdr;の部分の記述が悪いと思うのですが、どうすればいいでしょうか?
328:デフォルトの名無しさん
08/09/18 14:10:06
>>327
コンパイルできてる?
gulngUpdataAddressの型が気になる。
329:デフォルトの名無しさん
08/09/18 14:13:42
memcpy(reinterpret_cast<char*>(gulngUpdataAddress) + オフセット量, gushtUpdataArea, sizeof(gushtUpdataArea));
330:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/18 14:18:48
mbstowcsという関数のバグと思います。
これはなんの変換もしていないみたいです。
BCC2009です。
332:デフォルトの名無しさん
08/09/18 14:19:29
ロケール設定してないからだろ
333:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/18 16:43:57
while(true) {
for(int i=0; i < 10; i++)
;
}
上のやつってwhileが回っている間int型の変数分のメモリをどんどん食っていく?
開放せん?
335:デフォルトの名無しさん
08/09/18 16:46:52
ローカル変数は有効範囲をすぎると無くなります
336:デフォルトの名無しさん
08/09/18 16:48:58
ファイルを指定すると更新日を表示するプログラム。
VCで動いてたコードをBCCに持ってきたら動かない現象が発生しました。
_fstatで0が返ってくるのに中身がちゃんと入ってないみたいです。
URLリンク(up01.ayame.jp)
あれこれ弄ってみたけどうまくいかないorz
337:デフォルトの名無しさん
08/09/18 17:45:00
>>336
先頭にアンダーラインが付いてる関数は基本的に移植性がない。
BCCではPOSIX準拠の fstat() を代わりに提供している。
URLリンク(www.linux.or.jp)
338:デフォルトの名無しさん
08/09/18 17:50:16
コンパイラ限定の命令は使わないようにしよう
WinならAPIでいいだろう
無理なら、boostとかから探すとか
339:デフォルトの名無しさん
08/09/18 17:55:29
BCC って SEH の __try と __finary を実装しているのだろうか?
まず表面化することないだろうけどね Win32例外
340:デフォルトの名無しさん
08/09/18 18:03:06
>>339
__tryは実装していない。__finallyのみ実装しているが
これは__tryに対応するものではない。
341:デフォルトの名無しさん
08/09/18 18:07:07
>>340
ありがとー
WinAPI だからといって必ずしも全て利用可能ではない ってことか
ま、SEHはかなり特殊だから仕方ない部分ではあるな
342:336
08/09/18 18:22:33
>>337,338
stract _stat → stract stat
_fstat() → fstat()
に変更したらBCCでも問題なく動きました。ありがとうございます。
本業はマイコン/ラダー屋なのもあって、こういった部分はあまり気にする機会がなく勉強になりました。
Boost覗いてみました。
C++はBCBでも殆どC記述で組むような状態でオブジェクト指向が身についてないので
サンプルを見ながら少しずつ導入していこうと思います。
343:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/18 19:16:53
cppにする
345:345
08/09/18 19:32:12
344さん、ありがとうございます。解決しました。
346:デフォルトの名無しさん
08/09/18 20:55:40
親クラス
┣親クラス及び全ての子クラスで使うデバッグ用クラス
┣子クラス
┣子クラス
・
・以下略
・
┗子クラス
┗子クラス
という構成なんですが、子クラスがデバッグクラスにアクセスする、定石のような方法ってどういうのがありますか?
今自分がやっているやり方は、子クラスをnewで作成した後に、デバッグクラスのポインタをchildcls->SetDebugCls( cls )みたいな感じで渡しています。
しかしそれだと、全ての子クラスにセットしなくてはならず、非常に手間がかかっています。
実際はデバッグクラス以外にも、全ての子クラスで使いたいクラスが数個あります。
良い方法があったら教えてください
347:デフォルトの名無しさん
08/09/18 21:13:31
単一のデバッグクラスのインスタンスを子クラスで共有するの?
348:346
08/09/18 21:25:09
>>347
はい。全ての子クラスで1つのデバッグクラスを操作したいのです。
デバッグでそれぞれのクラスのデータを集計し、統計のようなものを出したいデバッグクラスなので、単一の方向でお願いします。
349:デフォルトの名無しさん
08/09/18 21:32:10
基底クラスのインナークラスとしてデバッグクラスを記述して、
基底クラスがそのデバッグクラスを包含するのじゃ駄目なの?
350:デフォルトの名無しさん
08/09/18 22:39:51
デバッグクラスをグローバルにすればいいだけじゃないの?
それかシングルトン
351:デフォルトの名無しさん
08/09/18 22:58:27
俺もグローバルで良いと思うけど。
まぁグローバル変数が嫌なら、
デバッグクラスかそれへのポインタの
staticなメンバ変数でも用意すれば良いんじゃね?
352:デフォルトの名無しさん
08/09/18 23:12:31
流れが分からん
デバッグクラスが派生クラスにかかわらず単一なのは分かった
そのインスタンスは1個だけ?
それとも各インスタンスにつき1個ずつ?
いずれにしてもデバッグクラスを基底クラスの内部クラスとして定義して、
基底クラスの通常のメンバなり、静的メンバなりにそのデバッグクラスのインスタンスを持たせればいいと思うが
353:デフォルトの名無しさん
08/09/18 23:27:15
親クラスにstaticで持たせるのが正解の気がする
まだエスパー歴が浅いから間違ってるかもしれんが
354:デフォルトの名無しさん
08/09/19 00:36:34
文字の上下4ビットを入れ替える関数(RevChr)を作成しなさい。
ただし、RevChr関数の命令は1行で書かなくてはいけません。←ここ重要!
できた人から、提出するように。
って問題だされたんだけど。
355:デフォルトの名無しさん
08/09/19 00:43:55
>>354
強引にやってみた。アホだ、俺。
(char>>4 + char<<4)
356:デフォルトの名無しさん
08/09/19 01:42:15
優先順位・・・
357:デフォルトの名無しさん
08/09/19 02:28:18
319だけど、wcharをcharに変換する速度は、
WideCharToMultiByte 250ms
wcstombs 1720ms
あらかじめ計算しておいた配列を使う 2170ms
となって圧倒的にwinAPIが速かったです。 前にローケル設定しなくてwcstombsが速いとか間違えを書きました。
358:デフォルトの名無しさん
08/09/19 03:58:49
>>309
その後、実際につかう数字で計算してみたところ、3次の項までは必要となりました。
しかし、logで計算するより5倍は速いので助かりました。
359:デフォルトの名無しさん
08/09/19 09:39:44
for_each を使って、int型の配列 v の集計をしなさいという問題なので、
class sum
{
int total;
public:
sum() : total(0) { }
void operator()(int i)
{ total += i; }
int get()
{ return total; }
};
sum s;
s = for_each(v.begin(), v.end(), s);
としたのですが、代入しなければならないことが気に入りません。
for_each<vector<int>::iterator, sum&>
(v.begin(), v.end(), s)
とすれば出来たのですが、やっぱり何か違う気がします。
何かいい表現方法は無いでしょうか?