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
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; }
473 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:12:06 ] 警告なんだから、気にならなきゃ別に対処しなくてもいいんでないかい。 おれは、気にする性質だから可能な限り対処するけど。
474 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:10 ] >>470 0除算は発生しないよ。乗算してるんだから。
475 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:11:40 ] >>472 remarkは警告ですらないよ。
476 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:15:11 ] >>474 orzぼけていた。
477 名前:デフォルトの名無しさん [2008/02/11(月) 22:24:26 ] ものすごく初歩的な質問でごめんなさい・・・ c++で、任意の位置に文字を表示させる方法を教えてください。例えば「1」を上から100ピクセル100ピクセルの位置に表示させるやり方を。 それと、もう一つ。 文字を上書きする方法を教えてください。上記の「1」の文字を消して「2」に書き換える方法です。 色々検索して調べたのですが、わかりませんでした。 お願いします。
478 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:28:22 ] >>4 とりあえず何に表示してるか教えろ winのコマンドプロンプトか?
479 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:25 ] >>477 手始めに、VRAMとかフレームバッファとか呼ばれるものにアクセスする方法を探してみてはどうだろうか。
480 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:56 ] >>477 環境によって違うので、先ずは環境を明らかにしてください。
481 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:30:27 ] >>479 ちょw
482 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:49:04 ] 「質問の仕方が」初歩的だと、手の施しようがないよな・・・。
483 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:40:09 ] すいません、プログラミングとは直接は関係ないのですが、 他に適当なスレが見つからなかったので質問させてください。 Dev-C++を使ってプログラムを打っているのですが、 プログラムを作成してソフトから実行するとコマンドプロンプトが一瞬で消えてしまいます。 ↓のような簡単なプログラムで試してみましたが無理のようでした。 どなたか解決策が分かるかた教えてください。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("test\n"); return 0; }
484 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:40:56 ] getchar();でも入れておけば?
485 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:23:58 ] char型、int型の宣言ひとつで何バイトの領域が確保されますか? 環境によって違うってよく聞くけど例えばXP32bitの場合
486 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:25:40 ] sizeof(char) sizeof(int)
487 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:29:08 ] char型は常に1バイトじゃなかったっけ?
488 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:52:00 ] >>486 ありがとう。そういえばそれで見れたね いつもよくsizeof使ってるのにその発想がでてこなかった >>487 char型はかわらないのか。勉強になりました
489 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:56:23 ] 疑問文の内容をまんま受け入れることで「勉強」しないほうがいいのでは。
490 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 07:18:48 ] char型は常に1バイトだが、1バイトが常に8ビットとは限らないからな。
491 名前:デフォルトの名無しさん [2008/02/12(火) 08:16:21 ] >>490 ?
492 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:18:44 ] 生暖かい目で・・ってのはこういうことを言うんだろうな
493 名前:デフォルトの名無しさん [2008/02/12(火) 08:19:52 ] perlをコンパイルしてC言語から使えるDLLを作成できますか
494 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:21:42 ] 1Byte==sizeof(char)が9bitだったり7bitだったりすることもある
495 名前:デフォルトの名無しさん [2008/02/12(火) 08:22:04 ] アセンブラをソースに埋め込めますが、perlとかフォートランはないですか
496 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:26:22 ] >>494 それは既に論外 charこそ1バイトの基準だとでも思ってるのか? 卵が先か鶏が先かとかいうレベルじゃないぞ?
497 名前:デフォルトの名無しさん [2008/02/12(火) 08:29:26 ] >>493 ですが DLLでなくてもC++から使える方法ならいいです
498 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:53:16 ] >>496 客観的な事実として、 - sizeof(char) は常に1。 - もともと、1文字分のデータ量が「バイト」。 - 1バイトは必ずしも8ビットでない(正確に8ビットを表現したい場合は「オクテット」と言う)。 - 1バイトが6ビットや7ビット、9ビットのアーキテクチャが実在した。 - C99では少なくとも1バイトにつき8ビットあることが保証されている(CHAR_BITは8以上)。
499 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:58:38 ] 疑問を投げかけるだけ投げかけて 496は海の藻屑と消えました。
500 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:00:25 ] 組み合わせの計算させるようとしたんですが、出力が0になってしまいます。 ブレークポイントで止めて確認したところ、Anの値がAnrの値より小さくなって いるみたいなんですが何故でしょうか? もしかして表現できる桁数を越えてるから? そうだとしたらこれ以上大きな値が扱える型ないですか? unsigned long long int Kumiawase(int); int main(){ int n=36; int r=6; unsigned long long int Ar=Kumiawase(r),An=Kumiawase(n),Anr=Kumiawase(n-r); cout<<An/(Ar*Anr)<<endl; } unsigned long long int Kumiawase(int n){ unsigned long long int Ans=1; for(int i=1;i<=n;i++){ Ans*=i; } return Ans; }
501 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:11:10 ] >>500 36! は 371993326789901217467999448150835200000000 であって、 2^64 = 18446744073709551616 を大幅に越えている。 二項係数の値を求めたいのであれば、 パスカルの三角形を使って足し算だけで求めると良い。
502 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:43:24 ] >>501 ありがとうございます。扱える数字をオーバーしちゃってるんですね パスカルの定理調べてみたけどよく分からない… 高校の時の数学の教科書引っ張り出してきます
503 名前:デフォルトの名無しさん [2008/02/12(火) 12:50:57 ] >>497 COMの知識があれば使えるかも。
504 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:16:35 ] perlembed ? 俺には無理そうだが君なら!
505 名前:デフォルトの名無しさん [2008/02/12(火) 16:04:32 ] クラス内でchar *filename;というメンバ変数を持っているのですが、 コンストラクタ内で、 filename = "memo.txt"; とかやると、 warning: deprecated conversion from string constant to 'char*' と言われます。static_cast<char *>("memo.txt")としても同じでした。 このワーニングが出ないような書き方はないでしょうか?
506 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:09:15 ] >>505 char *filename → const char *filename
507 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:14:45 ] >>484 言われた通り実行すると、確かにコマンドプロンプトは表示されたままで止まりました。 原因は分かりませんが、しばらくはこれでやってみたいと思います。 もし、どなたか原因が分かる方がいれば教えてください。
508 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:26:28 ] >>507 原因ったって、そのプログラムが一瞬で終了するからだろう。 "test\n" を出力したあと、すぐに return してるじゃないか。 プログラムが終了したら窓は消える。
509 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:30:51 ] >>508 今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、 急にでなくなって困っています。 getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。 言っていることが聞かれている事とちがったらすいません。
510 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:42:18 ] >今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、 そりゃぁ、IDEから起動してたからだろ。
511 名前:デフォルトの名無しさん [2008/02/12(火) 17:57:15 ] #include <iostream> using namespace std; namespace HW { class test { public: test(); virtual ~test(); }; test::test() { cout << "FFF" << endl; } }; int main() { return 0; } これをコンパイルできません。 どうしてですか? /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x12d): undefined reference to `vtable for HW::test' /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x163): undefined reference to `vtable for HW::test' collect2: ld returned 1 exit status
512 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:15:43 ] >>511 デストラクタの宣言があるのに実体がないから。 ついでに言えば、コンストラクタの後にイリーガルなセミコロンがある。
513 名前:デフォルトの名無しさん [2008/02/12(火) 18:19:13 ] VS2005のC++でDXUT,STL使って開発してるのですが、 class A{ std::string m_name; public: void func(std::string str){ m_name = str; } } このコードがデバッグでは何の問題もなく動くのですが、 リリースにするとfuncを呼び出してm_nameに代入した時にthisポインタが0x000001を指し、 バッファオーバーランで落ちてしまいます。 何かご存知の方が居ればどうかご教授ください。
514 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:22:49 ] コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。 なくてもいいけど。 で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが virtual の場合は別。
515 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:24:58 ] それだけじゃ判らんから、気になったことだけ。 ・なんでstd::stringを値渡ししているの? ・そのAの実体はどこにあるの?
516 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:32:17 ] >>511 namespaceの終わりにセミコロンは不要。 仮想関数には定義が必要。定義が無いと仮想関数テーブル (そのメッセージでいうvtable)のエントリーを作れない。 仮想でなければ呼ばれなければ必ずしも定義は必要ない。