1 名前:デフォルトの名無しさん [2008/05/14(水) 01:00:02 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.53【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1208989385/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:11:50 ] 前スレ>>996 はstringstreamやstringの代わりに (あるなら)wstringstreamとかwstringを使えって意味ね
3 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:14:32 ] お、995はstringとstringstreamなのか。 wstringとwstringstreamだと思い込んでいた。
4 名前:前スレ995 mailto:sage [2008/05/14(水) 01:22:30 ] STLをwstringstreamとwstringに変えてLPWSTRをLPCWSTRに変えたら出来ました。 本当にありがとうございました。 int i = 123; std::wstringstream ss; ss << i; std::wstring mes = ss.str(); LPCWSTR omes = (LPCWSTR)mes.c_str(); MessageBoxW(0, omes, L"型変換", MB_OK);
5 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 02:21:48 ] その場合キャストは要らないはず、というか キャストでなんとかするってのは、はじめのころは あんまし感心しないコードになることが多い気がする。
6 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 04:09:31 ] ◆6月にマネージャパン、月刊アスキー、週刊アスキーの3誌が賞金総額2000万円の「シストレFXグランプリ」を開催 system-trading.jp/news/index.php?cID=3 5月22日より登録受付開始、6月2日よりグランプリ開始の予定。賞金総額2000万円。 デモトレードの優勝者には賞金三百万円がプレゼントされます。 ▼トレード部門 初期資産500万円で、デモ取引のトレード収益を競っていただきます。 www.fx-gp.com/about/ ▼賞金総額 ■社長特別賞(シストレソフト買取価格) 10,000,000円 ●シストレソフト部門賞 1位300万円 2位100万円 3位50万円 ●トレード部門賞 1位300万円 2位100万円 3位50万円 ●前期MVP賞 50万円 ●後期MVP賞 50万円
7 名前:デフォルトの名無しさん [2008/05/14(水) 15:04:43 ] どこにも情報が無いのでこちらで質問をさせていただきます。 eVC++4.0 にて組み込み開発を行っているのですがどうしても下記のwarningが出てしまいます。 class 'Hogehoge' needs to have dll-interface to be used by clients of class 'Foo' 上記エラーが発生した原因はメンバインスタンス変数を static に変更し、かつ、ポインタ ではなく実体を持つように修正したからだと思われます。 class Foo { public: Hogehoge *hogehoge; }; ↓ class Foo { public: static Hogehoge hogehoge; }; warningの意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。
8 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:07:44 ] strncpy, snprintf, memcpy などの関数でサイズ引数を0にした場合の挙動って定義されてるんでしょうか? やっぱり自分でチェックした方が無難?
9 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 18:20:01 ] >>7 そのメッセージの前に警告番号とか出なかった? あと警告やエラーはそれのみ? >>8 それぞれの関数の仕様を確認すること。 「など」に対しては定義されてないので。 未定義や不定の条件に書いて無ければ、サイズ0もOK。 ただしサイズが負の数みたいな、 有り得ない値は逆に、何も書いてなければNG。
10 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 18:31:03 ] size_tだから負の値はない。 それでももちろんsize_tで表現できる最大値とか明らかにおかしいだろって値は存在するけど。
11 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 18:33:43 ] >>7 Hogeは具体的に何のクラス? デフォルトコンストラクタがないとか値として持てないクラスじゃね?
12 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 18:34:27 ] >>8 ありがとうございます。WG14/N843というのを拾ってきたので読んでみました。 snprintf() についてはサイズ0を指定してもよくて、その場合書き込み先バッファはNULLでもいいみたいです。 strncpy()とmemcpy()ではサイズ0の場合については何も書かれてないので、サイズ0もOKみたいですね。 サイズ0のときにバッファをNULLにしてもいいのかどうかまではちょっとわかりませんでしたが…。 あと、サイズはだいたいsize_tで指定するので負になるという心配はあまりなさそうです。
13 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 20:26:17 ] >>12 サイズ0のときはNULLにして良いよ。 サイズ0なら、指定したバッファのアドレス自体にもアクセスしてはいけないから、 アクセスしたら関数側のバグになる。
14 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 20:55:42 ] 何も書かれてないということは、未定義動作じゃないのかね?
15 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:44:07 ] 派生クラスのコンストラクタから、 初期化リスト?経由で基底クラスのコンストラクタ を呼び、 そこから派生クラスで実装されている純粋仮想関数を呼びたいのですが、不可能でしょうか? これが出来ると基底クラスのコンストラクタを再利用出来るし、違う処理(初期化)が必要な部分は 仮想関数の実装を変えるだけでいいので便利だと思ったのですが。
16 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:52:47 ] >>15 できません 基底クラスのコンストラクタ実行中は派生クラスは未構築だからです
17 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 22:10:34 ] >>16 やはりダメですか・・・ うーん。自分の設計が悪いせいか、基底クラスのコンストラクタ今一役立たずだな・・・
18 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 22:18:57 ] >>7 >warningの意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。 英文のままですね。英文の意味が判らないのなら鼬害でしょう。 まぁ、静的なメンバ変数は明示的に実体化しないといけないので普通の環境でもリンクエラーになるわけですが。
19 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 22:22:21 ] >>17 簡略化した例を示せば賢い人が答えてくれるかも 多分C++ではそういうときにはテンプレートの出番になると思うけど
20 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:36:19 ] >>14 >何も書かれてないということは いや、書かれていることになる 上の例で出ている関数などでバッファポインタとバッファサイズを取るものは、 [buf, buf+size) の範囲内がアクセス可能ということを要件としているので、 size==0のときはbufのアドレスが何であれ要件を満たすことになる >>15 似たようなことをする方法はいくつかある ・仮想関数をvfuncとして、基底クラスにinit()などを用意して、 派生クラスのコンストラクタから呼ぶ ※ 基底ctor -> 派生ctor -> 基底init() -> 派生vfunc() ・基底コンストラクタに関数ポインタ類を渡す ・templateクラスにして継承関係を逆にする ※ template<class T> class base : T {};
21 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:40:30 ] ostringstreamクラスに、 ostringstreamオブジェクトの先頭に任意の文字列を追加できる関数ってありますでしょうか?? 探しても見つからなかったのですが。
22 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:02:36 ] >>21 こんなことならできる int main() { using namespace std; string t("abc"); ostringstream s; s << "xyz"; s.seekp(0); s << t + s.str(); cout << s.str() << endl; return 0; }
23 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:07:18 ] >>21 一応ストリームなんだから、そういう操作は仮に出来ても勧められないな・・・ 前後だけで良いならfront側とback側にstringstreamを持ってstr()時に 結合するラッパーを作るという手はある 超手抜きで書くと struct { ostringstream front; ostringstream back; string str(){return front.str() + back.str();} }; またはstd::list<std::string>で構築して、必要になった際に全結合するなど
24 名前:23 mailto:sage [2008/05/15(木) 00:10:53 ] リロードしてなかった >>22 が手軽で良いかもな それと>>23 のfront云々のところは素でボケてたので無かったことに・・・
25 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:38:37 ] >>19-20 レスありがとうございます。 なるほど、テンプレートや関数ポインタですか。 しかしC++は奥が深そうですね・・・
26 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 07:14:40 ] Yo Yo俺ニート!
27 名前:7 [2008/05/15(木) 12:11:02 ] >>9 質問するのに肝心な部分を書いてませんでした。 warning C4251 がエラー番号に該当すると思います。 >>11 規約としてデフォルトコンストラクタ、デストラクタは定義 しなければならないのでその点は問題ありません。 >>18 >まぁ、静的なメンバ変数は明示的に実体化しないといけないので普通の環境でもリンクエラーになるわけですが cppファイル内で実体化させているのか、という意味ならば実体化させているので その点は問題ないように思います。 試しにstaticをはずしてみたのですが、同様のエラーでした。 NULLチェックやdelete処理などが面倒なので実体を持つようにし、かつ、1つのシステム内で 唯一1つのインスタンスしか使用しないのでstaticで良いじゃないか? staticにするとわざわざどこかのクラスから参照やポインタで辿っていかなくても Foo::hogehoge とアクセスできるから楽じゃないか? と安易に思ったのが失敗だったんでしょう。
28 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:14:39 ] C4251 だけ書いて内容書かないのは、こっちで調べろってこと?
29 名前:7 [2008/05/15(木) 12:30:25 ] >>28 言っている意味がわからないのですが、こちらでどう調査しても warning C4251: 'hogehoge : 'class 'Hogehoge' needs to have dll-interface to be used by clients of class 'Foo' しかわからない 上記warningが発生した原因は特定インスタンスメンバをポインタではなく、static かつ 実体として持つようにした というのは 7 で書いたつもりです。 言葉足らずのところはこちらのミスですので謝りますが。 エラー番号ではなく警告番号でしたが、どう調査してもC4251しかわかりません。
30 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:40:36 ] >>29 Hohehogeの宣言を晒してくれなきゃワカンネ。 エラーが起こる最小のコードをup