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)
とすれば出来たのですが、やっぱり何か違う気がします。
何かいい表現方法は無いでしょうか?
360:デフォルトの名無しさん
08/09/19 10:23:41
std::for_each(v.begin(), v.end(), std::bind1st(std::mem_fun(&sum::operator ()), &s));
なんで代入したくないのか知らんが、↓のように書いたほうがシンプルでいいと思うけど。
sum s = for_each(v.begin(), v.end(), sum());
361:デフォルトの名無しさん
08/09/19 11:01:51
なんでsumを使うか知らないが、↓のように書いたほうがスンプルでいいと思うけど。
int sum = std::accumulate(v.begin(), v.end(), 0, std::plus<int>());
362:デフォルトの名無しさん
08/09/19 11:28:36
>for_each を使って、int型の配列 v の集計をしなさいという問題なので、
363:デフォルトの名無しさん
08/09/19 11:30:31
>>361
for_each を使って、集計をしなさい
364:デフォルトの名無しさん
08/09/19 11:37:37
そうですかごめんなさい早漏にて候
365:デフォルトの名無しさん
08/09/19 11:51:24
>>359
TR1を使えば以下のようにできる。
std::for_each(v.begin(), v.end(), std::tr1::ref(s) ) ;
ただし、sumを次のように変更する必要がある。
class sum
{
public :
typedef void result_type ;//ネストされたresult_typeという型で、関数オブジェクトの戻り値の型を表す
//省略
} ;
あるいは、unary_functionを継承すること。
366:デフォルトの名無しさん
08/09/19 12:02:09
VC2008でマリオもどきを作ろうとしてるんですが、↓のソース(関係無さそうなメソッドとかは省略してます)をコンパイルすると
>v:\projects\mario\player.cpp(8) : error C2511: 'Player::Player(int,int,pleyer_type)' : オーバーロードされたメンバ関数が 'Player' にありません。
> v:\projects\mario\player.h(8) : 'Player' の宣言を確認してください。
となります。どこがおかしいのでしょうか?(見づらい質問でごめんなさい)
//Player.h
#include "Characters.h"
class Player : public Characters{
private:
enum player_type ptype;
public:
Player(void);
Player(int x,int y,enum player_type type);
};
//Player.cpp
#include "Player.h"
Player::Player(void){
this->x = 1;
this->y = 1;
this->ptype = PTYPE_NOM;
}
Player::Player(int x,int y,enum pleyer_type type){
this->x = x;
this->y = y;
this->ptype = type;
}
//Characters.h
class Characters{
enum char_type ctype;
public:
Characters(void);
Characters(int x,int y,enum char_type cp);
};
367:デフォルトの名無しさん
08/09/19 12:12:44
>>366
× pleyer_type
○ player_type
ってことだと思うよ
368:デフォルトの名無しさん
08/09/19 12:15:56
……死にたいorz
宣言と定義が違うって事だったんですか、回答有り難うございました
369:デフォルトの名無しさん
08/09/19 12:33:35
>>359
int s = for_each(v.begin(),v.end(),sum()).get();
370:359
08/09/19 12:41:58
みなさん、ありがとうございました。
>>365が
いいと思い、(自分の処理系ではTR1が使えないので)boost::refでやってみたら、
> error C2064: 1 引数を取り込む関数には評価されません。
と出て、ダメでした。
TR1とboostはほとんど一緒と聞いていたのに残念でした。
371:デフォルトの名無しさん
08/09/19 13:01:28
>>370
TR1は、確かにBoostを念頭においているとはいえ、より考えられている。
というのも、Boostは単にreference_wrapperで包んでいるに過ぎないので、
このままでは関数オブジェクトとして、operator ()を適用できない。
そこで、TR1では、メタプログラミングを駆使して、単項か二項として呼べるようになっている。
372:デフォルトの名無しさん
08/09/19 13:22:41
この出力は0になります。STLの新規のresizeは常に初期化されますか?
vector<int> r;
r.push_back(1);
r.push_back(2);
r.resize(1);
r.resize(2);
cout<<r[1];
373:デフォルトの名無しさん
08/09/19 13:29:32
されます
374:デフォルトの名無しさん
08/09/19 13:47:28
㌧クスです
375:デフォルトの名無しさん
08/09/19 15:54:53
これでどんな環境でも、メモリは解放されますか?
クラス側で解放処理をしなくても、STLを使っている範囲(newは使わない)では自動開放されますか?
class A{ public:vector<char> x; A(){x.resize(10000000);}};
main(){
map<string,string> w;
w["hage"].resize(10000000);
cout<<"enterを押すとstringのメモリを解放します。 ";
getchar(); w.erase("hage");
cout<<"メモリは解放されましたか。 "; getchar();
map<string,A> z;
z["piza"].x[0];
cout<<"enterを押すとクラスのメモリを解放します。 ";
getchar(); z.erase("piza");
cout<<"メモリは解放されましたか。 "; getchar(); }
376:デフォルトの名無しさん
08/09/19 16:01:47
STLのメモリ解放は変な点がありますから心配です。
というのも、vectorでclear();使っても全く解放できないからです。swapしかないので。
377:デフォルトの名無しさん
08/09/19 16:10:25
ブロックでくくれば抜けたとき解放されるだろ
378:デフォルトの名無しさん
08/09/19 16:11:03
何も変な点なんてねぇよ。
clearやresizeでメモリを解放する必要などない。
379:デフォルトの名無しさん
08/09/19 16:13:50
MinGW3.4.5を使っているのですが、
list<vector<int> > l;
vector<int> v(10,0);
l.push_back(v);
とすると、
stl_list.h:435: warning: '__p' might be used uninitialized in this function
という警告が出ます。
l.insert(l.end(),v);
とすれば警告は出ないのですが、何が問題となっているのでしょうか?
380:デフォルトの名無しさん
08/09/19 17:51:32
>>376
効率を上げるために、開放されないよ。
clearするってことは、次に直ぐ追加される可能性があるかもしれないってことで、バッファっは保持されるんだ。
381:デフォルトの名無しさん
08/09/19 18:39:19
AUX
CON
NUL
PRN
をファイル名に使うとバグりますか?
382:デフォルトの名無しさん
08/09/19 18:43:25
バグるかもしれないし、バグら無いかもしれない
383:デフォルトの名無しさん
08/09/19 18:45:05
DOSの予約デバイス名が入っていたときに処理がおかしくなる代表例を教えてください。
WindowsXP以上でAPIを使ったときバグりますか?
384:デフォルトの名無しさん
08/09/19 18:47:45
うちのパソコンだと、AUXを名前に含めても、エラーが出ずに
エクスプローラーで書き換えられます。 問題出ますか?
385:デフォルトの名無しさん
08/09/19 19:04:12
一意的な絶対パスに変換する方法教えてください。
下のpはパスとして正常なんですけど・・・
これを変換する関数は無いですか?
char p[]="C:\\hoge_hoge\\..\\windows\\Notepad.exe";
system(p); //パスが有効か?
char q[300];
GetLongPathName(p, q, 300);
wcout<<p<<"\n->\n";
wcout<<q<<endl;
386:デフォルトの名無しさん
08/09/19 19:20:50
自己解決しました
char p[]="C:\\////\\hoge_hoge\\..\\windows\\Notepad.exe";
char q[300];
GetFullPathName(p, 300, q, NULL);
printf("%s\n", q);
387:デフォルトの名無しさん
08/09/19 20:34:56
すみません。 wchar_t型配列に、世界各国語と英字の大文字・小文字が入っているとき
大文字を小文字に変換するにはどうしたら良いでしょうか?
388:デフォルトの名無しさん
08/09/19 20:47:41
towlower
389:デフォルトの名無しさん
08/09/19 21:00:05
すみません。このようにしたいんです。
中国語・・・ABCDF・・・中国語
→中国語・・・abcde・・・中国語
ロシア語・・・FUNCTION・・・ロシア語
→ロシア語・・・function・・・ロシア語
390:デフォルトの名無しさん
08/09/19 21:02:36
何語でも出来ますか??
towlower() の動作は、現在のロケールの LC_CTYPE カテゴリに依存する。
この関数を Unicode 文字に対して使うのはあまり適切でない。なぜなら、
Unicode には大文字(upper case)・小文字(lower case)・タイトル文字(title
case) という 3 つの "case" が含まれているからである。
URLリンク(manpages.ubuntu.com)
391:デフォルトの名無しさん
08/09/19 21:36:50
こんな感じ?
wchar_t
us_tolower(wchar_t c)
{
if(c<='A' && c>='Z')
{
c=c-'A'+'a';
}
return c;
}
392:デフォルトの名無しさん
08/09/19 21:45:26
unicodeて、どのOS、コンパイラでもアルファベットはASCIIと同じですか?
393:デフォルトの名無しさん
08/09/19 21:47:34
何?
394:デフォルトの名無しさん
08/09/19 21:48:44
>>391
なんか怪しいけど、せめてLを・・・
395:デフォルトの名無しさん
08/09/19 21:50:59
たまにはEBCDICも思い出してね
396:デフォルトの名無しさん
08/09/19 21:52:47
コンパイルした環境に依存しないで、たとえば日本のVC++でコンパイルして、
ロシアや中国でも小文字になりますか?
397:デフォルトの名無しさん
08/09/19 21:55:51
BCCでコンパイル中に任意のメッセージ書き出せるマクロみたいのってないよね?
398:デフォルトの名無しさん
08/09/19 21:59:15
GetUserDefaultLCID
と
LCMapString
でやってみます。
399:デフォルトの名無しさん
08/09/20 02:19:19
intel c++はisostream入っていませんか?
400:デフォルトの名無しさん
08/09/20 02:38:34
日本語体験版だと入ってないのかな?
なんかヘッダが足らないみたいです
インストールの失敗?
英語体験版をいれて日本語で上書きしたらいいかな?
401:デフォルトの名無しさん
08/09/20 02:50:42
わかりました。VC++2008との統合が失敗してたのですがそれが原因みたいです。
wikiより。
実行に必要なライブラリやリンカなどは付属していないため、他のコンパイラの環境に寄生した形で実行される。
WindowsではMicrosoft Visual Studioが、LinuxではGCCが必要である。
402:デフォルトの名無しさん
08/09/20 02:52:46
isostream?
403:デフォルトの名無しさん
08/09/20 17:52:54
あるところからC++のソースコードをダウンロードして、
そのフォルダの中のsample.vcprojというのを実行すると、
VisualStadioが起動しました。
サンプルコードのはずなので、F5を押して実行すると、
「シンボル情報がありません:firefox.exeのデバッグ情報が見つからないか、
または一致しません。シンボルが読み込まれていません」
というウィンドウが表示されました。どうすればよいでしょうか?
404:デフォルトの名無しさん
08/09/20 17:57:33
あるところって、どこ?
405:403
08/09/20 18:10:55
404さん
URLリンク(www.cs.umd.edu)
からann_1.1.1.zipをダウンロードして、
MS_Win32→sample→sample.vcprojを実行しました。
406:デフォルトの名無しさん
08/09/20 18:29:16
プロジェクトの構成がReleaseになってるだけじゃないの?
Ctrl+F5とかで実行したら?
407:403
08/09/20 18:36:34
406さん
プロジェクトの構成はDebugでした。
Ctrl+F5とすると、Firefoxが新しく起動しました。
プロジェクトの構成をReleaseにしてみて、
F5を押すと「デバッグセッションの実行可能ファイル」というウィンドウが出てきて、
「実行可能ファイル名」を選ばされました。
よく分からず、既定のWebブラウザを選んで実行しました。
それを過去にもやったため、Firefoxが動いているんだと思います。
「デバッグセッションの実行可能ファイル名」を何にすればよかったのでしょうか?
408:デフォルトの名無しさん
08/09/20 19:08:56
1回かたの消しちまって、めんどくさくなった。
>>407
落としたけど、スタートアッププロジェクトがdllになってない?
samleをスタートアッププロジェクトに設定しないと、VSからは起動できない。
あと、sampleをビルドして出来るのは、コマンドラインアプリだったので、
F5実行だと、DOS窓が一瞬出てすぐ消えた。
デバッグセッションの実行可能ファイル名で解決したいなら、
「展開したフォルダ\ann_1.1.1\MS_Win32\bin\ann_sample.exe」
じゃないかね
409:403
08/09/20 19:54:14
408さん
F5実行で、DOS窓が一瞬出てすぐ消えた、ところまではできました。
「引数無しで実行」したときはエラーになるようなので、
コマンド引数に「-df data.pts -qf query.pts」と設定して
実行してみました。すると「cannot open data file」と表示されました。
すこし前進したようです。
あとはどうやってファイルを開くのか試行錯誤しているところです。
query.ptsというのは点のデータだと思います。
Test dataフォルダには「data_pts」がありますがちょっと違う。
これを読めばいいのか、または別のところにデータがあるのか。。。
410:デフォルトの名無しさん
08/09/20 20:12:01
test1-data.pts,test1-query.pts,test2-data.pts,test2-query.pts
ってのがあるみたいだけど
411:デフォルトの名無しさん
08/09/20 20:13:07
俺が落としたヤツだと「ann_1.1.1\test\」の下に
test1-data.ptsとtest1-query.ptsってのが転がってたんで、
それを「ann_1.1.1\MS_Win32\bin\」の下にコピってからDOS窓で
ann_sample.exe -df test1-data.pts -qf test1-query.pts
って打ったら動いたけど。
VCからだとカレントフォルダ分かりづらいから
別にDOS窓起動した方が良いんじゃない?
引数の設定にフルパスで書いても良いと思うけど。
まぁそろそろ飽きたんで引っ込む。
412:403
08/09/20 20:16:28
411さん
長いことありがとうございました。
後は自分で進んでみます。
413:デフォルトの名無しさん
08/09/20 20:41:25
逆アセンブラしてCのソースに貼り付けたら、動かせますか?
コマンドラインの引数を、関数の引数に変換できますか
414:デフォルトの名無しさん
08/09/20 20:44:13
>逆アセンブラしてCのソースに貼り付けたら、動かせますか?
そのまま貼り付けてコンパイルしたら動かないね
いやそも逆アセンブラするってなんだよって話だが
>コマンドラインの引数を、関数の引数に変換できますか
main関数の引数になります
415:デフォルトの名無しさん
08/09/20 20:50:17
DOSプロンプトで動くツールで、ソースが無いものをパクリたいのですが・・
できないですか?
test.exe ファイル名 > 出力名
というツールを
char * test(char *ch){ アセンブラ }
という関数に出来ませんか
416:デフォルトの名無しさん
08/09/20 20:57:14
無理?
417:デフォルトの名無しさん
08/09/20 20:59:24
普通に通信して連携すれば?
418:デフォルトの名無しさん
08/09/20 21:00:36
速度はひとつにした方が速いと思うんですが
419:デフォルトの名無しさん
08/09/20 22:12:24
>>415
関数が export されていて、インターフェイスが公開されているなら簡単にできるが、それ以外だと面倒
グローバル変数を使ってたりしたら「自作のほうが楽じゃね?」ってなるかもw
420:デフォルトの名無しさん
08/09/21 02:22:25
すみません
こういうツールの作り方教えてください
圧縮ファイルをすべてのアプリに対してフォルダと認識させる方法です
wINDOWSエクスプローラのみなら昔からできたのですが
Zipファイルをマウントする?「Pismo File Mount Audit Package」
URLリンク(www.moongift.jp)
421:デフォルトの名無しさん
08/09/21 03:16:01
#include <stdio.h>
#include<math.h>
double simpson(double, double, double, double);
double func(double);
int main(void){
/* 必要な変数の定義をする */
double h,xkisu,xguu,s0,s1,s2,ans,x1,x2,n,x0,i;
scanf("%lf", &x1);
scanf("%lf", &x2);
printf("x1 = %f\n",x1);
printf("x2 = %f\n",x2);
/* 偶数の分割数を入力するまで繰り返す */
do{
scanf("%lf", &n);
printf("n = %f\n",n);
if ((n%2) != 0){
printf("!! Bunkatsu su ha gu-su- desu !!\n");
} else break;
} while (n%2!=0);
422:421
08/09/21 03:17:12
すみません、みすって投稿してしましました。
上のは途中までのプログラムなのですが
コンパイルすると
22: 浮動小数点の不正な使用(関数 main )
25: 浮動小数点の不正な使用(関数 main ) とでます。
なぜでしょうか?
423:デフォルトの名無しさん
08/09/21 03:33:07
小数を整数で割った余りって何なんだよ。
nはintとかにしとけ。
424:デフォルトの名無しさん
08/09/21 04:52:19
Cでのメモリの取られ方についてご教授いただけませんでしょうか。
下記のようなコードを書いた場合、
static const char *teststr[6] = { "00000", "1111111111", "2", "3", "444", "555555" };
それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、
それらを指すポインタがteststrに格納されるのでしょうか?
VCで試したところ、確かにteststrの各配列に指定した文字列が格納されていたのですが、
ポインタのみを確保して、その位置のデータを破壊して、指定文字列を格納しているということはないでしょうか?
組み込み(ARM)での開発に使用しようかと思っています。
よろしくお願いします。
425:デフォルトの名無しさん
08/09/21 05:02:09
そんなもの処理系によるとしか
426:デフォルトの名無しさん
08/09/21 05:12:15
Cで@や$や`記号が使われなかった理由ってあるんですか。
427:デフォルトの名無しさん
08/09/21 05:16:12
これ以上トリグラフ増やすのいやだったんじゃね
428:デフォルトの名無しさん
08/09/21 07:28:28
>>424
破壊はしない。
429:デフォルトの名無しさん
08/09/21 13:51:14
>>424
> それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、
> それらを指すポインタがteststrに格納されるのでしょうか?
そのとおり。
文字列はROM、ポインタはRAMに置かれる。
430:デフォルトの名無しさん
08/09/21 15:26:49
>>429
ポインタが RAM にいっちゃうのは teststr に const が付いてないからだよね?
431:デフォルトの名無しさん
08/09/21 15:27:21
Cから最近C++に移行しました。
関数を
void foo(char* filename);
と宣言して使うときに
foo("data.dat");
とやると deprecated conversion string constant to char みたいな
警告が出ます。これは何が不味いのでしょうか?
432:デフォルトの名無しさん
08/09/21 15:28:02
>>431
const 付けたらいいんじゃね?
433:デフォルトの名無しさん
08/09/21 15:28:17
>>431
文字列リテラルは書き換えできないから char const で受け取らないとあぶない。
434:デフォルトの名無しさん
08/09/21 15:34:55
マクロの中で " をあらわすにはどうしたらいいですか?
エスケープを使うとエラーになり、そのまま使うと文字列リテラルとして解釈されてしまいます。。。
435:デフォルトの名無しさん
08/09/21 15:35:43
つまり
foo(const char* filename);
と宣言すればよいということでしょうか?
436:デフォルトの名無しさん
08/09/21 15:35:48
>>434
状況が見えんな。エラーになるコードとエラーメッセージをどうぞ。
437:デフォルトの名無しさん
08/09/21 15:37:21
現在二次元配列と2重ループを習っている超初心者です
質問なのですが列和と行和を求めるプログラムで、
列和も行和も同じループ内で処理できるのは何故なのでしょうか?
438:デフォルトの名無しさん
08/09/21 15:37:56
>>435
foo の中で filename の指す先を書き換えないんなら、それでいいはず。
っていうか、試せよ。
439:デフォルトの名無しさん
08/09/21 15:39:09
>>437
日本語でどうぞ
440:デフォルトの名無しさん
08/09/21 15:39:55
>>437
それだけ言われてもわかんねーよw
二次元配列を一次元配列にキャストしてるとか?
441:437
08/09/21 15:47:42
すみません・・・どう表現していいかわからず整理しないまま打ってしまいました
考察の一部なんですが、これ以外文章にしようがなくて困っています
プログラムをあげたほうがいいでしょうか?
442:デフォルトの名無しさん
08/09/21 15:49:34
>>441
まだ相談したいならコード晒せ。あの文章じゃ無理だ。
コード晒せば答えが得られる保証はないけどな。
443:デフォルトの名無しさん
08/09/21 16:02:09
簡単なことだ
二重ループは行列の全ての要素にアクセスするための手段でしかないから
その扱いについては制限されない
あとは各行和各列和を格納する配列を定義して要素に応じてそれぞれ適切に加算していくだけ
444:441
08/09/21 16:07:01
初心者丸出しで長ったらしいプログラムなのでろだにあげてみました。
No.7729です。よろしくお願いします。
445:デフォルトの名無しさん
08/09/21 16:38:13
for(j=0;j<4;j++)
for(i=0;i<3;i++)
table[3][j]+=table[i][j];
これ行和しか求めてないよ。ソース中には列和を求める部分は見当たらなかったけど。
446:444
08/09/21 18:52:32
>>445
列和の計算を入れ忘れている事に気付きました。ありがとうございます
この行和と列和を求めるプログラムの考察で、
列和も行和も同じループ内で処理できるのは何故かと言う問いなのですが
理由は>>443でOKもらえますかね・・・?
447:デフォルトの名無しさん
08/09/21 19:11:38
>>446
>>443は日本語がちょっとおかしいのでちゃんとした文章を自分で考えてくれろ
正解かどうかは知らないし
448:デフォルトの名無しさん
08/09/21 19:54:02
すいません質問なのですが、とあるクラスのprotectedメンバはその派生クラスの派生クラスからはアクセスできないんでしょうか??
MinGWで色々やっているのですが、間接継承の関係にあるクラスのprotectedメンバにアクセスしているプロググラムを実行すると、フリーズしてしまいます。
アドバイス頂けると幸いです。
449:デフォルトの名無しさん
08/09/21 20:29:22
>>448
フリーズするならそれはまったく別の問題。
450:デフォルトの名無しさん
08/09/21 20:40:54
>>448
フリーズならどこかで無限ループしてるんじゃ
451:デフォルトの名無しさん
08/09/21 21:27:02
VCの_COM_SMARTPTR_TYPEDEFなんですけど
これで作ったCOMのスマートポインタもAttachで入れないと
カウントがずれるですか?
452:デフォルトの名無しさん
08/09/21 23:02:33
頻繁に使われる関数で常にメモリを100Kほど確保して置きたいのですが
どのようにしたら良いですか? マルチスレッド対応の方法教えてください
こういう警告と同じ箇所で英語のエラーがでます。
マルチスレッド アプリケーションのコンストラクタでローカル静的変数を使うことは危険
453:デフォルトの名無しさん
08/09/21 23:08:57
>>452 クラスにしとけ。
454:デフォルトの名無しさん
08/09/21 23:59:27
100K みたいに大きいバッファは
マルチスレッド関係なく動的に確保しる。
455:デフォルトの名無しさん
08/09/22 00:44:37
頻繁に使うから、再確保はしないでそのままにしておきたいのですが。
2個以上同時に使われるとバッファが壊れますが、どうしたらいいでしょうか?
456:デフォルトの名無しさん
08/09/22 00:49:20
確保してから、アプリケーションが終了する直前までずっと確保したままでいい。
とりあえずマルチスレッドプログラムを組む場合は同期オブジェクトを勉強してください。
457:デフォルトの名無しさん
08/09/22 01:34:08
寝る前だけど質問させてもらいます
C++で横スクロールするアクションゲームっぽいもの
作ってるのですがキャラクターをクラスで扱っていて
場面ごとの関数1つ1つにクラスの変数やメソッドを使うから
インスタンス定義ってのをやらなきゃいけないようで
そうするとそのせいで場面の移り変わりのときに
それまで使っていた変数が初期化されてしまって
URLリンク(www.dotup.org)
このようになってしまいますよね
キャラクターのクラスだけでなく他にも場面やステージを
隔てて初期値に戻ると困るものを保存したり引き継いだり
できればいいのですがどうすればいいのでしょうか・・・
458:デフォルトの名無しさん
08/09/22 01:38:03
>>457
保存したり引き継いだりすればいいよ。
コンストラクタ含めて関数には引数が渡せるだろ。
その画像のプレゼン能力はすばらしい。
459:424
08/09/22 01:43:49
>>428
>>429
回答ありがとうございました。
これから検討してみたいと思います。
460:デフォルトの名無しさん
08/09/22 01:45:46
スコープが広めのリサイクルオブジェクトコンテナ見たいなのを作って、シーン終了時に必要なものを追加
次のシーン初期化時に、シーンのオブジェクトコンテナに移し変える
461:デフォルトの名無しさん
08/09/22 03:08:24
質問です。
ファイルオープンで、ファイルから値を読込んでもう一つのファイルにその値を書込むプログラムで、
読込用はテキストファイル(.txt)、書込用はバイナリファイル(.bin)を用いました。
上記の2つのファイルサイズは少量ですけど違いました。
この違いは何によるものなんでしょうか。
462:デフォルトの名無しさん
08/09/22 03:13:07
改行コードじゃない?
463:デフォルトの名無しさん
08/09/22 03:52:47
読込ファイルの値はスペース区切りでした
テキストファイルから「1 2」という値を読み込みバイナリファイルに書き込んで
ファイルをエディタで開くと「01 00 00 00 02」と表示されますが、
つまりは書き込みがバイナリファイルだとスペースにもコードがあるから
ファイルサイズが大きくなる・・・ということでいいんでしょうか・・・?
464:デフォルトの名無しさん
08/09/22 04:06:47
>>461,463
読み込んで形式変えて書き込んでるんだから、そもそも同じになるわけがないな。
465:デフォルトの名無しさん
08/09/22 04:30:31
質問です。
他のプロセスのメモリを監視するプログラム作ろうとしています。
ReadProcessMemoryで値を取得することはできたのですが、
できればそのメモリアドレスの値が更新された時に取得を実行したいです。
この「メモリアドレスの値が更新された」というイベントを取得することは可能でしょうか?
466:デフォルトの名無しさん
08/09/22 04:54:21
>>451
コンストラクタならfalseー緒に渡せば、AddRefしないよ。
operator=は無理だな。
467:デフォルトの名無しさん
08/09/22 07:22:34
>>465
チートツールはほどほどにしとけよ
468:448
08/09/22 12:19:03
>>449
>>450
おっしゃる通り別の問題でした汗
ありがとうございましたm(_ _)m
469:デフォルトの名無しさん
08/09/22 12:42:19
327です。
>329
ありがとうございます。
u_char *ucharAdr;
ucharAdr = (u_char *)(gulngUpdataAddress & 0x0fffffff) + 0x0c800000;
memcpy( ucharAdr, gushtUpdataArea, gulngUpdataDataCount * sizeof(short));
で、いけました。
470:デフォルトの名無しさん
08/09/22 12:45:08
CImageで(a,b)から(x,y)まで直線を引く方法はありませんか??
MoveTo、LineToを使用せずに描きたいです。
471:デフォルトの名無しさん
08/09/22 12:48:25
なんでMoveTo、LineToを使用したくないの?
472:デフォルトの名無しさん
08/09/22 13:13:47
>>470
おいらのCImageなら、メンバにLine(CPoint from, CPoint to)があるからそれを使えるよ。
でも、あんたの言っているCImageにそれがあるかどうかは知らんけどね。
473:デフォルトの名無しさん
08/09/22 19:04:58
const char str1[] = "str";
const char * str2 = "str";
"str"が配置されるのは、前者の場合、配列に格納するコードのところ
後者では文字列を置いておくところだと思うのですが、どういうときに、どちらを選べばいいのでしょうか
自分で考えたところでは、
・上の場合は、コンパイル時に配列のサイズが決まるのでstrlenなどを使う必要がない
・下の場合は、自動変数の確保がポインタだけですむ(速い?)
というちがいだと思うのですが、ほかにも違いがあるのでしょうか
474:デフォルトの名無しさん
08/09/22 19:18:10
>>473
後者は str2 = "another" のような代入が可能になってしまう。たぶん意図したものじゃないだろう。
static const char str3[] = "str";
↑これなら挙げられた前者と同じメリットを得つつ、後者のメリットを上回る(自動変数の確保はゼロ)。
475:デフォルトの名無しさん
08/09/22 19:46:37
const char * const str2
476:デフォルトの名無しさん
08/09/22 20:16:33
>>474-475
ありがとうございます。
475さんのはstr2が同じものをさし続けるようにするのですね。
474さんのは静的変数の初期化に、コストを預けてるわけですね。
477:デフォルトの名無しさん
08/09/22 20:31:51
>>476
str3 の初期化にコストなんか要らないよ。どのケースでも必要になる文字列リテラルの
実体を直接割り付ければいいだけ。
478:デフォルトの名無しさん
08/09/22 22:16:49
>>473
#define str4 "str"
479:デフォルトの名無しさん
08/09/23 22:01:02
ここの場所でC2614のエラーが起きます。
クラスや構造体の初期化子リストに表示できるのは、メンバか基本クラスだけです。
規定クラスのメンバはどうやって初期化するですか?
class A
{
public:
A(int apple)
protected:
int m_banana;
}
class B : public B
{
B(int apple)
: A(apple), m_banana(8) ←ここ
{
}
}
480:デフォルトの名無しさん
08/09/23 22:04:32
基底クラスのコンストラクタで行う。
class A
{
public:
A(int apple)
protected:
A(int apple, int banana) : m_banana(banana) {}
int m_banana;
};
class B : public A
{
B(int apple)
: A(apple, 8)
{
}
};
481:デフォルトの名無しさん
08/09/23 22:05:16
できました。
ども
482:デフォルトの名無しさん
08/09/24 07:57:18
VC++2005を利用しています
例外を勉強しているのですが、例外を発生させたときに、
catchで例外を処理しても、デバッガに例外があったことが出力されます
catchで例外を処理するときは、
デバッガの出力に例外が発生したことが出力されるのを防ぎたいですが、どのようにすればいいでしょうか
483:デフォルトの名無しさん
08/09/24 12:37:12
>>482
出力って、例外時のデバッガのダイアログ?だったら、デバッグ->例外で設定できる
デバッグ出力の例外のレポートだったら気にするな。レポートが出すぎて困るのだったら例外の使い方が間違っている。
484:482
08/09/24 13:18:40
>>483
れす、ありがとうございます。後者です。
例外のつかいかたについては勉強していくところです。
もし、テストケースとかを今後記述するような場合に、デバッグ出力でOFFにできないのか探しています。
485:デフォルトの名無しさん
08/09/24 14:19:16
>>482
Visual Studio のスレで聞いたほうがいいんじゃないかな?
486:346
08/09/24 14:42:55
>>347-353
超連休で返事が遅くなって申し訳ない。レスありがとう。
グローバルとstaticがいい感じっぽいので、両方試してみます。
487:482
08/09/24 15:56:25
>>485
ありがとうございます。移動します。
488:デフォルトの名無しさん
08/09/24 16:35:28
private List<ISchedule> zTasks = new List<ISchedule>();
これを同じことを NET 1.1でやりたいんですが どうすればいいんですか?
489:デフォルトの名無しさん
08/09/24 16:39:34
ArrayList
490:デフォルトの名無しさん
08/09/24 17:15:17
>>489
すいません><
具体的なコードを教えてくれると助かります^^;
491:デフォルトの名無しさん
08/09/24 17:24:23
C#スレ行けよ
492:デフォルトの名無しさん
08/09/24 19:38:05
tchar.hをインクルードしてあるのですが、コンパイルすると、_tstofが未定義の関数なるのは何故でしょうか?
493:デフォルトの名無しさん
08/09/24 20:14:44
>>492
ちゃんと確かめて無いので間違ってるかもだけど、
_tstofは内部でatofや_wtofを使ってるので、それらを使う
ために必要な<stdlib.h><math.h><wchar.h>をincludeする必要があったかも?
494:デフォルトの名無しさん
08/09/24 23:14:43
>>493
その三つをインクルードしてみましたけど駄目でした。
環境の問題でこういう事ってありますかね?
495:デフォルトの名無しさん
08/09/24 23:56:07
>>493
その理屈はおかしいよ
496:マジレスチュウ ◆MaJi/01g.w
08/09/25 00:43:23 BE:279187542-2BP(50)
スペルはちゃんと合ってる?
497:デフォルトの名無しさん
08/09/25 06:09:59
BCC Developer使ってるんですけど、そのデバッガのTurbo Debugger
がダウンロードできません
どなたか入手方法教えてください