1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
372 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:29:59 ] あとは、ディレクトリ消そうとしてるとかぐらいかな。 ファイルを開いて中の文を出力させたりしてると言うから多分違うだろうが...。
373 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:30:13 ] OS やコンパイラの情報でも出さないとこれ以上どうしようもないだろ。エスパーでもなけりゃ。
374 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:42:31 ] リブートしてみるとか
375 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:53:40 ] エクスプローラなんかでやったときとプログラムでやったときとで権限が違うとか。 Vistaだったらありそうだ。
376 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:54:17 ] おれの経験から予想するとtest.textになってると予想 それで何時間も悩んだことがあるw
377 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:23:03 ] >>318 _T("なんたら") を L"なんたら" で良ければ、 #define _T(x) L ## x でいいんじゃないか?
378 名前:デフォルトの名無しさん [2008/02/11(月) 04:10:31 ] 明日までに1000×1000くらいの行列の逆行列とかを計算することが必要な宿題が 出ました。他の人はmatlabでやるのですが、自分はc++でやろうと思ってます。 逆行列の計算は自分で実装しなくてよいので、ライブラリとかを使おうと思ってます。 今調べたところでは、有名なc++用の行列計算ルーチンは、blitz++, MTL, blas, TNTなどがあることが分かりました。将来性(一度覚えたら長く使える)と性能(一番重視) を考えると、どれを選ぶべきでしょうか? よろしくお願いします。
379 名前:デフォルトの名無しさん [2008/02/11(月) 04:20:20 ] すいません、 > 明日まで じゃなくて、来週までです。
380 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:20:26 ] 俺は LAPACK 使ってるけど、 他の選択肢を吟味した訳じゃないからなあ。
381 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:37:58 ] >>378 将来性はどれを覚えても同じかと。 C++を長く使うのであれば他人のライブラリを実装することも多くなると思う。 性能というのが速度重視であれば自分で実測した方が早いかな? 他には、関連ページの多さ、組み込み易さ、ソースが公開されているか?あたりを重視して決めればいいかと ぶっちゃけmatlab使えるならそっちを使った方がいいようにも思うが・・
382 名前:デフォルトの名無しさん [2008/02/11(月) 05:10:35 ] >>380 >>381 ありがとうございます。自分が一応一番C++ができる(ことになっている)ので、matlabとの 性能比較のために、自分がc++版を実装することを期待されてます。簡単な偏微分を解く課題なのですが、 絶対matlabに勝ちたいので、自分の環境で性能比較してみます。とりあえず、選択範囲としては、 lapack, tnt, blas, mtl, blitz++, ublas(blasのboost版), mkl(intelのマスカーネルライブラリ) くらいでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 05:32:00 ] >>382 無駄な努力だと思うけど。どうしてもってことならコンパイラもiccにすることお勧め。 どうせなら、cublasかClearSpeedでも使ってぶっち切りを狙うのもいいかもねw
384 名前:デフォルトの名無しさん [2008/02/11(月) 09:15:11 ] >>383 どちらも専用ハードが必要じゃないですか。 でもこんなのもあるんですね。知らなかった。 コンパイラはiccとgccを比較します。
385 名前:デフォルトの名無しさん [2008/02/11(月) 09:51:09 ] CloseHandleの前後で、ハンドルが閉じられていることを確認するにはどうしたらいいですか
386 名前:デフォルトの名無しさん [2008/02/11(月) 10:00:18 ] ハンドルが使用中かどうかを知りたいんです
387 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:00:48 ] なぜそんなことをする必要があるのですか
388 名前:デフォルトの名無しさん [2008/02/11(月) 10:06:36 ] たとえばサブディレクトリのファイルリストをひとつひとつ取得したいとき、 同一ディレクトリにまだファイルが残っていれば次のファイルを呼んで、 無ければハンドルを解放して、子ティレクトリへ進めたいんです
389 名前:デフォルトの名無しさん [2008/02/11(月) 10:07:45 ] フラグを別に持っていれば確認できますが、なるべく変数を減らしたいと思います
390 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:05 ] かならずNULLで初期化してCloseしたらNULL代入すればいい。
391 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:56 ] ファイルハンドルは NULL じゃなくて INVALID_HANDLE_VALUE だ!
392 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:16:38 ] NULLで比較しちゃってるコード多いけどな それで動いちゃってるし 型安全なtypedefでもないかぎり防ぐのは無理ぽ
393 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:17:59 ] ごめん間違えた INVALID_HANDLE_VALUEは-1だった
394 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:19:16 ] >>392 クラス作ればいいじゃん。
395 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:29:42 ] >>388 なんか設計がおかしいように気がするけど... 擬似コードでいいから晒してみてよ。
396 名前:デフォルトの名無しさん [2008/02/11(月) 10:42:25 ] main(){ dirserch dir("c:\\windows"); cout << dir.next(); cout << dir.next(); cout << dir.next(); }
397 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:44:52 ] C だと不完全型を利用して隠蔽する。
398 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:53:10 ] Cでshared_ptrみたいなのはないの?
399 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:55:22 ] テンプレートが無いのが辛い所だな。 マクロで何とかできなくはないが。
400 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:56:52 ] それ以前にデストラクタが無いんだから仕方が無い
401 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:00:54 ] AddRef/Release を自前でやるなら問題ない。 面倒だけど。
402 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:02:11 ] COMを勉強中で、インターフェースを実装したクラスの情報を隠したいのですが 取得したものをみると、CFileの内容がくっついて来てしまいます // idl [uuid(...), version(1.0), hidden, object] interface IFile : IUnknown { HRESULT method(); } [uuid(...), version(1.0), hidden] coclass CFile { interface IFileBase; }; // 簡単なインターフェース取得 IFile * __stdcall create() { IUnknown *iface = new CFile; IFile *base = NULL; iface->QueryInterface(IID_IFile, reinterpret_cast<void**>(&base)); return base; } 属性にhidden指定するだけではだめなんでしょうか? WinXPsp2/.net2003/C++/ATL使用せず
403 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:08:24 ] なんで CoCreateInstance 使ってないの?
404 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:21:28 ] CoCreateInstanceはレジストリに登録しないと使えないと、どこかで見た記憶があり 更にDirectXのレジストリ登録を見る限り、musicしかなかったので この方法でいけるんじゃないかと思っていました CoCreateInstanceの方で調べて試してみます 指摘ありがとうございました
405 名前:388 できました [2008/02/11(月) 11:27:38 ] #include <iostream> #include <vector> #include <string> #include <windows.h> using namespace std; class dirserch{ vector <string> dirname; vector <int > dir[300]; string path[300]; int n; WIN32_FIND_DATA fd; HANDLE hd; public: dirserch(char *ch); int next(string &str); }; main(){ dirserch dr("c:\\windows"); string str; while(dr.next(str))cout<<str<<endl;} dirserch::dirserch(char *ch){ n=0; path[0]=""; dir[0].push_back(0); dirname.push_back(ch); hd=NULL;} int dirserch::next(string &str){ for(;;){ if(hd==NULL){ int k=dir[n].size()-1; if(k<0){ if(n==0)return NULL; n--; continue; } path[n+1] = path[n] + dirname[dir[n][k]] + "\\"; dir[n].resize(k); n++; hd = FindFirstFile((path[n]+"*").c_str(), &fd);} for(;;){ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ if(fd.cFileName[0]!='.' || ( fd.cFileName[1]!='.' && fd.cFileName[1]!='\0' )){ int k=dirname.size(); dir[n].push_back(k); dirname.push_back(fd.cFileName);}} else { str=path[n]+fd.cFileName; if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;} return 1;} if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;break;}}}}
406 名前:388 できました [2008/02/11(月) 11:30:24 ] 全ファイル名を順番に出力する機能って基礎的だと思うのですが、標準にないので作ろうと思いましたよ
407 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:39:33 ] 再帰使わないの?
408 名前:388 できました [2008/02/11(月) 11:41:51 ] 再帰はつかいません パソコンにメモリ管理を任せると、鈍くなったり不安定になるからです
409 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:45:04 ] それだとWindowsやLinuxといったOS自体使えない理屈だが・・・
410 名前:388 できました [2008/02/11(月) 11:46:13 ] メモリというより、データをスタックへ積むコンパイラの仕組みでした
411 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:00:59 ] ファイルの列挙くらいは大丈夫だと思うけど
412 名前:デフォルトの名無しさん [2008/02/11(月) 12:02:05 ] 複数のファイル(1000以上)にランダムに書き込みがある時、 HDDの内蔵キャッシュやwindowsの標準キャッシュの効き目が悪くなるので バッファ付きファイル出力クラスを作ります
413 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:05:26 ] そうか。がんばれ
414 名前:デフォルトの名無しさん [2008/02/11(月) 12:09:05 ] double であることを明示的にするには、数字の最後にLをつければいいですか?
415 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:14:08 ] .0でいいんじゃね?
416 名前:デフォルトの名無しさん [2008/02/11(月) 12:20:12 ] >>415 やっぱりそっちの方がいいかな。 100とか1とか切りのいい数字なんだけど、doubleで計算させたいときに、 せっかく切りがいいのに、100.0とかするのがいやだったんだけど、 100だとintとかにみえてしまう感じ。 やっぱり、.0にしときます。 ありがとうです。
417 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:24:19 ] 整数リテラルにLつけてもlongにしかならんだろ
418 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:18 ] 100.でもおkだった気がする。すごく中途半端だけど
419 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:22 ] 2.0Lもdoubleではなくね
420 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:59 ] bccだと100.0Lにするとdoubleじゃなくてlong double(80bit)になっちまう。
421 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:00 ] あるとすればdだよな。あるとすれば。
422 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:26 ] > 100だとintとかにみえてしまう感じ 見た目の問題じゃなくて、実際にコンパイラにそう解釈されてしまうよ。 暗黙の型変換はおいておくとして。
423 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:29 ] bcc以外でもlong doubleだろう・・・
424 名前:漏れは 100. かな。 mailto:sage [2008/02/11(月) 13:16:38 ] C++なら、double(100)でいいよ。
425 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:19:51 ] てゆーかそれでいいならcでも(double)100でいいだろw キャストだけど
426 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:24:28 ] >>391 ここでは有効かどうか区別できれば十分なんだからNULL使ってもいいと思う。
427 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:40:07 ] >>426 有効なハンドルとしてNULL(=0)返されたらどうすんだ
428 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:49 ] 正常なハンドルとして0を返すライブラリの設計がおかしいと考えるんだ。
429 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:43:49 ] おかしくても使わねばならんこともある。
430 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:45:03 ] 0と-1が無効というハンドルもあるのさ・・・
431 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:07:48 ] >>426-430 て言うか、ハンドルはポインタとは違うんだから NULL と 比較するなんて発想する奴はどうかしてると思う。
432 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:04 ] しかし型の実体がポインタだから困る
433 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:06 ] >>431 ハンドルの正確な定義って何?
434 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:19:45 ] PVOID
435 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:26:24 ] >>433 実体を一意に示す値じゃないの? 正確な表現かどうかわからないけど。 ポインタもハンドルの1つの設計としてありえるし、 整数で0から順に付番する設計も考えられる。
436 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:32:01 ] 実態が何かは関係なく、ハンドルはハンドルとして扱わないと。
437 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:49:17 ] >>436 そういう抽象的なことで逃げるのがWindowsプログラマ
438 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:58:02 ] >>437 まあお前はFILEをいじってドツボにはまってろ。
439 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:59:39 ] >435でも似たようなこと言ってるけど将来的に 実体が変わる可能性もあるからねぇ。
440 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:12:46 ] >>438 MSの下僕乙
441 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:17:16 ] いや待て。Windowsとか関係なく、 ハンドルと、ハンドルの実装は切り離して考えるだろ。 ソフトウェアは抽象化が支えているって習わなかったか?
442 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:43:47 ] 抽象化なんては馬鹿には理解できないと言うだけのことだろ。 かわいそうだから、スルーしてやりなよ。
443 名前:デフォルトの名無しさん [2008/02/11(月) 16:04:00 ] stdio.h読み込むと関数使えますが、 zip.hを自作してこれ読み込むだけでDLLを使用してzipの解凍出来るように出来ますか? ソース内でDLLを読み込まないと無理ですか
444 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:23:19 ] >>443 DLLだって元はソースコードなんだからそれを自分で書けばできるよ。難易度は別にして
445 名前:デフォルトの名無しさん [2008/02/11(月) 16:25:54 ] DLLの関数をヘッダファイルの読み込みだけで使えるようには出来ませんか
446 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:26:49 ] >>445 できるよ
447 名前:デフォルトの名無しさん [2008/02/11(月) 16:28:00 ] やりかた教えて下さい
448 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:28:55 ] ヘッダファイルでロードすりゃいい。コンストラクタとかで。
449 名前:デフォルトの名無しさん [2008/02/11(月) 16:29:49 ] #include "zip.h" main(){ zip_init(); } としてロードする方法しか判りません
450 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:31:23 ] Cなのか?環境くらいはまず書いてくれ。 どうでもいいが、その方法がなぜいけないのだ?
451 名前:デフォルトの名無しさん [2008/02/11(月) 16:33:55 ] printfなど標準関数はロードせずに使えて便利じゃないですか DLLの関数も自動でロードしたら便利になります コンストラクタで自動になるかやってみます
452 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:36:06 ] 思いっきりいろいろ勘違いしている。printfはロードとか関係ない。 zip_init()は初期化のために必要な処理だろ。全然別だ。
453 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:37:45 ] printfとか入ってるlibcは標準でリンクするようになってるからな mathだと-lmいるだろ? ようするになんか勘違いしてないか?
454 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:40:12 ] printfはスタティックリンクなので、ビルド時にlibがリンクされている。 DLLは名前のとおりダイナミックリンクなので、プログラムが自分でリンクしなければならない。
455 名前:443 [2008/02/11(月) 16:47:41 ] できましたよ これでヘッタファイルの読み込みだけで解凍しました class UNZIP{ typedef int (WINAPI *zipfnc)(const HWND , LPCSTR , LPSTR , const DWORD); HINSTANCE hd; zipfnc unzip; public: UNZIP(){ hd=LoadLibrary("UNZIP32.DLL"); unzip = (zipfnc)GetProcAddress(hd,"UnZip");} int & operator ()(char *ch) { char buf[256]; unzip(NULL, ch, buf, sizeof(buf));} } unzip; main(){ unzip("d:\\a.zip"); }
456 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:49:37 ] そのDLLからインポートライブラリ作ってリンクしとけ
457 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:52:42 ] 2つ以上unzipしたときの動作とかも考えとけと
458 名前:デフォルトの名無しさん [2008/02/11(月) 16:53:02 ] この方法では、どういつDLLの関数でもハンドルを個別に用意しなくてはならないですが 便利なので主要なDLLの関数は書き換えようと思います
459 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:56:47 ] DLL見付からなかったらあぼーんだな。その対策入れろよ。
460 名前:デフォルトの名無しさん [2008/02/11(月) 17:50:44 ] 自由落下で物体がどのくらい落ちるか計算させたいんですが、めちゃめちゃな計算結果になります。 どこが間違ってますか? float h; DWORD before = timeGetTime(); DWORD after = timeGetTime(); h -= ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
461 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:51:53 ] >>460 hの初期化してる?
462 名前:460 mailto:sage [2008/02/11(月) 18:05:10 ] >>461 hには元の高さの3.0fが入っています。
463 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:05:49 ] afterとbeforeが同一だったら0除算発生しないか? めちゃくちゃなのはその処理だと思うぞ・
464 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:07:34 ] >>460 先ずはtimeGetTime()を使わずに、自分で時間軸を制御してみたら?
465 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:38:08 ] >>460 h=(1/2)gt^2 だったら -= していくのはおかしいだろ。
466 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:41:18 ] 計算結果を普通に代入すれ
467 名前:460 mailto:sage [2008/02/11(月) 18:46:30 ] beforeはウィンドウが作られたときに数値を入れて、afterは重力計算直前に数値を入れています。 (after-before)の部分を手動で数字の1や2に書き換えたら正常に動作しました。 DWORDとfloatの単位とかの問題ですか? >>465 すみません、落下距離じゃなくて必要なのは現在の高さでした。
468 名前:デフォルトの名無しさん [2008/02/11(月) 18:56:48 ] UNZIP32.DLLの解凍時の進行状況を抑止するにはどうすればいいですか
469 名前:468 [2008/02/11(月) 19:02:03 ] 自己解決しました
470 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:20:58 ] >>467 たぶん>>463 だろうな。 数百メガから数ギガHzで動くCPUからしてみたら、 ミリ秒なんて気の遠くなるほど長い時間。
471 名前:465 mailto:sage [2008/02/11(月) 20:56:12 ] >>467 そうじゃなくて。 h = 3.0 - ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 ); だろ?
472 名前:デフォルトの名無しさん [2008/02/11(月) 21:00:10 ] 先に質問したものです。 iccについての質問なのですが、-Wall付きでコンパイルすると沢山警告がでます。 これらの警告は対応すべきなのでしょうか? $ icc test.cpp -Wall test.cpp(5): remark #1418: external function definition with no prior declaration double g(double s) { ^test.cpp(6): remark #383: value copied to temporary, reference to temporary used return std::max(s - 100.0, 0.0); test.cpp(6): remark #981: operands are evaluated in unspecified order return std::max(s - 100.0, 0.0); ここで使っているソースはこれです。 #include <iostream> using namespace std; double g(double s) { return std::max(s - 100.0, 0.0); } int main() { double x = 150.0; cout << g(x) << endl; return 0; }