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
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" はそういうのじゃないから。 多分ヘッダファイルを変更するしかないと思うんだよなぁ
785 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:56:07 ] >>783 #define new new_hoge #include "header.h" #undef new とか駄目かね
786 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:58:58 ] >>782 なるほど! 助かりました。 しかしなんでこんなややっこしい方法をImageMagickはとってるんだ。 おまけに全然日本語の情報ないし。 そこそこ歴史あるアプリなのに。
787 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:07:52 ] >>784 そうなんですか。 こまりましたね >>785 newだけだったらよいのですが、なんかあるたびにそれをやるのは ちょっと辛いです 普通に問題になりそうだしなんか回避策ないんですかね ググってもそれっぽいのは出てこないし
788 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:10:03 ] C++固有のキーワードで、変数名に使いそうなものってそれほどなさそうだけどなあ
789 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:15:24 ] >>786 むしろ合理的とも言えると思うけど。つまり、option は変わる可能性 がある(時代、OS, architecture 等によって)わけだから、自身に compile/load option を聞いてやるというだけ。特に大量に画像処理する 可能性を考えると細かいオプションも重要になってくることもありうるし。 俺は Magick++ 使ってるけど、多機能過ぎる程多機能で大変便利。 あと、使い易い。
790 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:18:04 ] >>787 素直にヘッダ書き換えるのが一番じゃないのかな。特によく使うなら。 単にコピーして直したバージョン作ればいいだけでしょ。
791 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:23:56 ] または>>785 の内容のヘッダファイルを作成して、 それをincludeすればいい。
792 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:25:05 ] >>790 いや、触れないヘッダなんですよね ほかのパッケージだから なんでC++からCを呼び出したいってのもあるんだけど なんで知ってる人いたら教えてくださいな
793 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:28:47 ] >>792 そのヘッダで宣言されている関数を呼ぶ、Cのソースを一つはさめばいいだろ。
794 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 16:42:52 ] 型と順番があってれば問題ないはずだから ライブラリ利用側だけヘッダを書き換えて使うとか。
795 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:08:08 ] CP932なマルチバイト文字列をCP932なワイド文字列に変換する簡単な方法ってないですか? Windows上でgcc 3.4.5(Mingw)を使ってます。
796 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:48:04 ] ああ、筋トレ気持ちいい
797 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:48:36 ] ごめん
798 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:49:35 ] >>796 スジトレ?どこのスジだよ。裏スジか?
799 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 21:00:47 ] 柔道部出身がマになっちゃう時代なんだよ・・・
800 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 22:09:56 ] うちにも短髪でえらくがたい良いのいるな
801 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:18:13 ] うちには男子校上がりのいい男がいる のんけでも平気で食っちゃうらしくておそれられてる
802 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:23:47 ] なんだ?クリスマスに備えて職場のイイ男自慢大会か?悪くないな