1 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:09:22 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.44【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1194016813/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
684 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:52 ] >>683 sizeof(class_array)/sizeof(class)じゃ無理?
685 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:13:35 ] >>684 レスありがとうございます。 できないです…。結果は0になりました。 sizeof( class_array ) が 4 sizeof( CLASS ) が 16 になっていました。 普通の配列にsizeofすると配列のサイズが返ってくるのに、 クラス配列にsizeofした時、配列は16*10=160のサイズを持っている はずなのに、4しか返ってこないということは、、、 どういう事なんですか??
686 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:13:56 ] >>683 class_array はただのポインタだろ。そうじゃなきゃ new [] の結果は受け取れないはず。
687 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:16:27 ] ああ、new
688 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:20:27 ] >>686 なるほど、sizeof( class_array ) では、ただのポインタのサイズを返しているわけですね。 sizeof(またはそれ以外)を使用してクラス配列全体のサイズを調べるにはどのようにすればよいでしょうか。
689 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:23:34 ] >>688 sizeof にこだわらなければ 10 に決まってんだろ。 即値を繰り返すのが嫌なら定数なり変数なりに入れとけ。 配列と別の変数でサイズを持ってるのが嫌なら std::vector にしとけ。
690 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:23:59 ] new[]したもので、要素数を後から知る方法はない。 std::vectorでも使っておけ。
691 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:29:13 ] 恐らくだけど、newに拘る必要はないんじゃないか? newを知らずに使っているように見受けられる
692 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:30:42 ] vectorを調べてきました。 こんな便利なものがあったなんて、、 std::vectorを使います! 答えてくださった方々ありがとうございました!
693 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:34:17 ] >>691 クラス配列の要素を動的に増やしたり、減らしたりしたかったのです。 mallocはコンストラクタが動かないと聞いたんで、newを使っていました。 その結果sizeofで要素数を求めようと頑張っていたのですが、 vectorでなんとかなりそうな気がします。 ありがとうございました。
694 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:37:49 ] CやC++でGUIなユーティリティを作る場合何を使うのがベターなんでしょうか? 先日本職さんの知り合いに聞いたところMFCだと言っていました それと同時にCやC++で作るならゲームかなぁみたいなことも言っていました やはりCやC++でGUIというのはあんまりベターじゃないんでしょうか? API直接だとかデザイナついたやつだとか、もしくははなからCは使わないだとか
695 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:41:20 ] 趣味でやるのか、仕事でやるのか 自分だけで使うのか、人に売るのか これからも続けていきたいのか、今回作ったら終わりなのか もろもろの事情による
696 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:43:00 ] >>695 一応趣味で、これからも使っていく予定です 人に売る気はないですが、良さそうなものが出来たら公開してみたりしたいなぁくらいには考えています
697 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:45:58 ] C++Builderかね。
698 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:46:29 ] MFC WTL ATL ボーランドC++
699 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:50:00 ] 趣味ならCやC++だけと言わずC#にも手を伸ばしてみるのはどうだろうか
700 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:52:30 ] 売るつもりが無いならC#は楽でいいな
701 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:02:48 ] C#は一応手を出したことがあるんですが、デザイナがあるだけでどうもそれに頼り切ってしまって そのせいかどうも感覚を掴めない まだWinAPIで試行錯誤していた時の方が気が楽でしたorz とりあえず今Turbo++Explorerとやらをダウンロード中です。 最終的にはVC++を買うことになりそうだなぁ
702 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:09:11 ] プログラミング勉強中なのですが質問させて下さい。 あるファイルから内容を読み取ってデータを抽出して別のファイルに書き出すプログラムを作りたいのですが #include "fstream" using namespace std; void main(int argc, char *argv[]){ ifstream f1; f1.open(argv[1],ios::in); 中略 f1.close(); ofstream f2; f2.open("data.txt",ios::out); 中略 f2.close(); } このようなプログラムを実行するとD&Dしてプログラムを実行した時ofstream f2;以降の書き込み動作が出来ていないようなのです。 何がいけないかいろいろ試してみたのですが、ファイルを読み込む部分をソースから消して書き込む場所だけにしてみても D&Dして実行すると駄目で、D&Dしないで実行すると普通に書き込めるみたいなのですが これはどういう理由からなんでしょうか。
703 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:35:07 ] >>702 >D&Dして実行する って、何をどうやって実行してるの? その場合って、argvに対象のファイル名がちゃんと渡ってくるものなの?
704 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:39:35 ] >>703 上記のプログラムをコンパイルしてできたexeに読み込ませたいtxtをD&Dで実行ということです。 途中にcout << argv[1]を入れてみたところD&Dしたtxtはフルパスで格納されていました。 ですが ofstream f2("data.txt",ios::out);のdata.txtへの書き込みが出来ない状態です。 追記ですがコンパイルはVC++2005です。
705 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:47:27 ] いや、きっとdata.txtは出力されている。 PCの中を検索すればどこかにあるはずだ。 argv[1]が絶対パスだったら、f2で書き込むファイルも argv[1]のファイルと同じフォルダになるよう絶対パスで指定するという風にすればいい。
706 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:10:01 ] printfで\の半角は表示できませんか?
707 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:10:51 ] >>705 argv[1]で絶対パス渡すと後のファイルオープンのパスに影響与えてしまうってことですかね? 確かに絶対パスを渡したら指定のフォルダにきちんと出力されました。 ありがとうございます。
708 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:19:16 ] >>706 printf("\\");で出力されるのが、半角円記号だというのなら、 それはそういう風にフォントが出来ているから。 日本では、歴史的経緯で半角バックスラッシュが用いられるべきところに半角円記号が使われる。 今更、円記号とバックスラッシュに分離しようとしてもおそらく極めて困難。
709 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:39:52 ] >>706 フォントに依存するんじゃないかと
710 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:03:42 ] turboC++Explorer落としに行ったけどあれでよかったのだろうか
711 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:31:41 ] >>707 もう解決したようだけど、 D&Dでは作業フォルダに注意ね
712 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:18:03 ] std::vector<unsigned char> buffer( 100, 0 ) buffer[100][0]という意味ですか?
713 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:19:14 ] 100個確保して0が入っているという意味 buffer[100]=0
714 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:25:09 ] std::vectorでは二次配列は確保できないのですか?
715 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:25:43 ] あ、、こうやればいいいのか std::vector<unsigned char> buffer[a][b];
716 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:28:45 ] >>715 vectorをa×b個作るの? vector<vector<unsigned char> >では?
717 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:29:55 ] >>714 std::vector<std::vector<unsigned char> > vec(100, std::vector<unsigned char>(10));
718 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:31:39 ] thx!
719 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:36:02 ] >>713 1行目と2行目が違うのだが・・・
720 名前:デフォルトの名無しさん [2007/12/22(土) 21:11:53 ] Cのdouble型で表せる最大の数と最小の数はなんですか?
721 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:12:57 ] 環境による 64ビットが普通だけど
722 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:14:05 ] >>721 計算した値がdouble型の精度を超えてたらエラーとするにはどうしたらいいですか?
723 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:00 ] 代入前に比較
724 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:30 ] 具体的にどうやるんですか?
725 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:48 ] 代入前に比較
726 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:20:26 ] 演算できる上限はどうなってるんだろうな、代入時に分割して代入するとか意味はあるんだろうか
727 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:22:16 ] BCBだとlong doubleは10バイトなのに、なんでVC++だとdoubleと変わらない8バイトなんですか
728 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:24:18 ] >>727 俺の自作コンパイラでは9バイトだぜ
729 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:26:01 ] unsigned long long int=unsigned long long int*unsigned long long int これで溢れる時 unsigned long long int=(unsigned long long int*unsigned long long int)/2 実際の何割とか決めてって話か
730 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:32:25 ] double型の演算が大きすぎてコンパイラが停止するのを制御できますか?
731 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:44:53 ] >>727 MSのも16bit用のコンパイラは10バイトだった。最終はVC++1.5だったか。 10 byte realがIntel x87の内部形式で他と互換が無いこと、 Intel自身も将来的に実数のSMIDを予定してたので10 byte realを データ型として扱うのは非推奨だったことから廃止した。
732 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:47:21 ] これはどこが駄目ですか? 実行中にエラーになります for(n=0;n<1000;n++){ try {x=x*x;} catch (...) {break;} }
733 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:47:50 ] int n; double x=3;が入ります
734 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:53:59 ] >>732 まずエラーメッセージ嫁。意味が分からなければコピペして見せろ。 ソース貼るならコンパイルできるようにしてくれ。 n や x の宣言が無いのでなんともいえない。
735 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:55:52 ] xが凄まじい勢いで増えるから
736 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:55:54 ] >>732 double でも確実にオーバーフローするだろ。何がしたいんだ?
737 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:01:26 ] オーバーフローを起こしたらbreakするにはどうしたらいいんですか
738 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:09:38 ] >>737 演算前に比較。
739 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:10:34 ] それはどうやるんですか
740 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:12:48 ] 演算する前に、演算後にオーバフローするかを比較する。
741 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:13:19 ] それはどうやるんですか
742 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:16:45 ] オーバーフローしないように式変形する。
743 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:17:22 ] オーバーフローの例外は察知できませんか
744 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:19:36 ] 例外なんて起こらない。
745 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:37:39 ] POD型(intとかcharとか)の演算で例外は投げられない。 このようなプリミティブな型の演算が例外を投げるようにすると 実行速度及びCとの互換性に影響がある、と、びよよーん先生はお考えになった。 いや、知らんけど。
746 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:49:51 ] では最大値をしるにはどうしたらいいんですか? #define とかは使わない方法ありますか
747 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:50:52 ] float.h に定義されている
748 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:52:36 ] #define で定義されている値を使わずに求める方法はありますか
749 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:52:58 ] C++ なら std::numeric_limits<double> でどうぞ。
750 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:53:54 ] std::numeric_limit<double>::max()
751 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:54:26 ] ごめん。numeric_limits が正しい。
752 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:05:55 ] たとえばunsigned int型なら足す続けると0に戻って最大値が判明するけど そういうのはできないですか
753 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:07:25 ] >>752 >足す続けると 日本語を母国語としない方ですか? それはさておき、double値はそういうわけにはいきません。
754 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:08:00 ] >>752 符号無し整数型以外は、演算で値が範囲外になると未定義動作。
755 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:08:57 ] なんでそんな事をやりたいのかが分からんが、 double でそういう事をやる場合は、かなり難しい。 小数のフォーマット(環境依存)に依存するし、 非正規化数というのがまた状況をややこしく・・・。
756 名前:754 mailto:sage [2007/12/22(土) 23:09:01 ] ん?符号付き整数は未定義動作だけど、不動小数点数型は実装依存で 可能かもしれないな。
757 名前:754 mailto:sage [2007/12/22(土) 23:09:48 ] ごめん。 s/不動/浮動/
758 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:09:49 ] でも限度を超えたら増え続けないから n < n+1が成り立たなくなるよね
759 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:11:11 ] >>756 環境依存でいいのなら方法はそりゃあるけども。
760 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:12:23 ] >>758 だから何?
761 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:13:16 ] 何に対して「でも」なんだろう?
762 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:22:03 ] ここは一問一答スレですか?
763 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:35:54 ] >>727 BCBの場合はDelphiのExtended型との互換性のほうが大きいかも
764 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:55:55 ] void MsgBox( int a ) { char s[20]; sprintf(s, "%d", a); MessageBox(NULL, s , NULL , MB_OK ); }; 直接数字を表示したいのだが、一回文字列に変換しないといけないのかな?
765 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:03:39 ] 直接数字を表示できるMessageBoxを作ったらいいじゃないか
766 名前:デフォルトの名無しさん [2007/12/23(日) 01:12:22 ] 標準ライブラリとかで見かける名前空間の名前がついてない 「::operator new」 とか「::operator delete」ってなぜ 「std::operator new」とか「std::operator delete」じゃないんですか?
767 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:20:26 ] クラスのデータメンバに配列があって、この配列にコンストラクタ時に初期値入れたいのですがどうすればいいんですかね・・・? class DATA { private: int t; public: DATA(int x=5) { t=x; } }; であればコンパイルは通るのですが、 class DATA { private: int t[2]; public: DATA(int x[]=5)←??? { for(int i=0;i<2;i++)t[i]=x[i]; } }; だとできないんです・・・
768 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:29:27 ] DATA() { t[0]=t[1]=5; } でいいだろ なぜ()内にいれるのか不明
769 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:35:00 ] まず、配列のそものは引数にとれない ポインタで渡す。 参照は。。どうだっけ?
770 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:41:33 ] >>764 WindowsのMessageBoxのことだと思うけど、文字列に直さないとダメ。 MessageBox(NULL, (boost::lexical_cast<std::string>(a)).c_str(),NULL , MB_OK); とか >>766 ::newはstd::のnewじゃないから。 実体はどうだか知らんけど。
771 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:55:39 ] >>767 配列はポインタ渡しがいいと思う。 やりたいことは、コンストラクタのオーバーロードで出来ると思う。 DATA(int* x) { for (int i = 0; i < 2; i++) { t[i] = x[i]; // xの要素数が2以上ないと未定義 } } DATA( ) { for (int i = 0; i < 2; i++) { t[i] = 5; } } 要素数をマジックナンバにするのはよくないので、 適当にコンスタント宣言しときましょう。 const int T_ARRAY_MAX = 2; とか、センスないな。
772 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:07:22 ] >>768 >>769 >>771 お蔭様で問題解決できました! どうもありがとうございました。。
773 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:17:27 ] >>766 Koenig自動照合ができないからジャマイカ? operator new(size_t)では引数の型からstdを見に行くと いう判断ができない気がする。
774 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 03:33:13 ] あるブログで見かけた記事。 C++では共用体の代わりにreinterpret_castを用いるらしい。 1: int main( void ) 2: { 3: int x = 0x01234567; 4: char *c = new char[4]; 5: 6: c = reinterpret_cast<char*>( &x ); 7: 8: return 0; 9: } だからC++は安全で便利なんだね!!
775 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:20:54 ] ・・・どこからつっこめばいいんだ
776 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:24:47 ] アナル
777 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 08:57:29 ] anonymous 共用体が導入されたりと、 C++ では共用体はより強化されてるんだがな。 #include <iostream> int main() { union { int x; char c[sizeof(int)]; }; x = 0x01234567; for(int i = 0; i < sizeof(int); ++i) { std::cout << static_cast<int>(c[i]) << std::endl; } }
778 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 09:42:24 ] >>766 名前探索の都合上。 クラス型をnewするとき、クラス自身、基底クラス、大域名前空間という 自然な順にoperator newを探せるようになっている
779 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:37:22 ] 名前検索の順序だけど、Koenig照合は考えないとして、 Effective C++第三版の166ページのとおりだと以下になるけど クラス自身と基底クラスが異なる名前空間にある場合は 4.は間違いですよね? 1.ローカルスコープ 2.クラス自身 3.基底クラス 4.基底クラスを含む名前空間(間違いと思う) 5.大域名前空間 VC++ 2008で試したところ、 1.クラス自身 2.基底クラス 3.クラス自身を含む名前空間 4.クラス自身を含む名前空間を含む名前空間 (外側の名前空間へ向かって繰り返し) 5.大域名前空間 でした。
780 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:38:14 ] ローカルスコープが抜けていました。訂正します。 VC++ 2008で試したところ、 1.ローカルスコープ 2.クラス自身 3.基底クラス 4.クラス自身を含む名前空間 5.クラス自身を含む名前空間を含む名前空間 (外側の名前空間へ向かって繰り返し) 6.大域名前空間 でした。
781 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:45:06 ] すいません。 非常に悩んだのですが、多分ここが一番知っている方がいらっしゃると思って質問させて頂きます。 cc `Wand-config --cflags --cppflags` wand.c `Wand-config --ldflags --libs` というコンパイルオプションをmakefileにしたいんですが、 どうやればこれ、makeの文法に直せるんでしょうか? Wand-configというのはアプリケーションの名前で、/opt/local/binにインストールしてあります。
782 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:03:27 ] >>781 Wand-config … の出力を CFLAGS に入れときゃいいんじゃないの? ImageMagick か。
783 名前:デフォルトの名無しさん [2007/12/23(日) 14:44:43 ] 質問です。 C++からCの関数を呼び出すためにヘッダをincludeしたのですが ヘッダにC++の予約語(new)が構造体のメンバ変数として定義されていて コンパイルが通りません。 ヘッダファイルを変更せずに対応する方法はありますか? 環境はRedHatでGCC(G++)でコンパイルしようとしています。 最悪、個別にextern "C"で再定義すればよいのかなと思いますが それはやりたくないので。。。
784 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:46:27 ] >>783 > 最悪、個別にextern "C"で再定義すればよいのかなと思いますが それは多分通らないと思う。extern "C" はそういうのじゃないから。 多分ヘッダファイルを変更するしかないと思うんだよなぁ