トップページ⇒tech
1001コメント330KB

【初心者歓迎】C/C++室 Ver.54【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/14(水) 01:00:02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん2008/05/14(水) 01:11:50
前スレ>>996はstringstreamやstringの代わりに
(あるなら)wstringstreamとかwstringを使えって意味ね
0003デフォルトの名無しさん2008/05/14(水) 01:14:32
お、995はstringとstringstreamなのか。
wstringとwstringstreamだと思い込んでいた。
0004前スレ9952008/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);
0005デフォルトの名無しさん2008/05/14(水) 02:21:48
その場合キャストは要らないはず、というか
キャストでなんとかするってのは、はじめのころは
あんまし感心しないコードになることが多い気がする。
0006デフォルトの名無しさん 2008/05/14(水) 04:09:31

◆6月にマネージャパン、月刊アスキー、週刊アスキーの3誌が賞金総額2000万円の「シストレFXグランプリ」を開催
http://system-trading.jp/news/index.php?cID=3

5月22日より登録受付開始、6月2日よりグランプリ開始の予定。賞金総額2000万円。
  デモトレードの優勝者には賞金三百万円がプレゼントされます。


▼トレード部門
初期資産500万円で、デモ取引のトレード収益を競っていただきます。
http://www.fx-gp.com/about/

▼賞金総額
■社長特別賞(シストレソフト買取価格) 10,000,000円
●シストレソフト部門賞 1位300万円 2位100万円 3位50万円
●トレード部門賞 1位300万円 2位100万円 3位50万円
●前期MVP賞 50万円
●後期MVP賞 50万円
0007デフォルトの名無しさん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の意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。
0008デフォルトの名無しさん2008/05/14(水) 16:07:44
strncpy, snprintf, memcpy などの関数でサイズ引数を0にした場合の挙動って定義されてるんでしょうか?
やっぱり自分でチェックした方が無難?
0009デフォルトの名無しさん2008/05/14(水) 18:20:01
>>7
そのメッセージの前に警告番号とか出なかった?
あと警告やエラーはそれのみ?

>>8
それぞれの関数の仕様を確認すること。
「など」に対しては定義されてないので。
未定義や不定の条件に書いて無ければ、サイズ0もOK。
ただしサイズが負の数みたいな、
有り得ない値は逆に、何も書いてなければNG。
0010デフォルトの名無しさん2008/05/14(水) 18:31:03
size_tだから負の値はない。
それでももちろんsize_tで表現できる最大値とか明らかにおかしいだろって値は存在するけど。
0011デフォルトの名無しさん2008/05/14(水) 18:33:43
>>7
Hogeは具体的に何のクラス?
デフォルトコンストラクタがないとか値として持てないクラスじゃね?
0012デフォルトの名無しさん2008/05/14(水) 18:34:27
>>8
ありがとうございます。WG14/N843というのを拾ってきたので読んでみました。

snprintf() についてはサイズ0を指定してもよくて、その場合書き込み先バッファはNULLでもいいみたいです。
strncpy()とmemcpy()ではサイズ0の場合については何も書かれてないので、サイズ0もOKみたいですね。
サイズ0のときにバッファをNULLにしてもいいのかどうかまではちょっとわかりませんでしたが…。

あと、サイズはだいたいsize_tで指定するので負になるという心配はあまりなさそうです。
0013デフォルトの名無しさん2008/05/14(水) 20:26:17
>>12
サイズ0のときはNULLにして良いよ。
サイズ0なら、指定したバッファのアドレス自体にもアクセスしてはいけないから、
アクセスしたら関数側のバグになる。
0014デフォルトの名無しさん2008/05/14(水) 20:55:42
何も書かれてないということは、未定義動作じゃないのかね?
0015デフォルトの名無しさん2008/05/14(水) 21:44:07
派生クラスのコンストラクタから、 初期化リスト?経由で基底クラスのコンストラクタ を呼び、
そこから派生クラスで実装されている純粋仮想関数を呼びたいのですが、不可能でしょうか?
これが出来ると基底クラスのコンストラクタを再利用出来るし、違う処理(初期化)が必要な部分は
仮想関数の実装を変えるだけでいいので便利だと思ったのですが。
0016デフォルトの名無しさん2008/05/14(水) 21:52:47
>>15
できません
基底クラスのコンストラクタ実行中は派生クラスは未構築だからです
0017デフォルトの名無しさん2008/05/14(水) 22:10:34
>>16
やはりダメですか・・・
うーん。自分の設計が悪いせいか、基底クラスのコンストラクタ今一役立たずだな・・・
0018デフォルトの名無しさん2008/05/14(水) 22:18:57
>>7
>warningの意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。
英文のままですね。英文の意味が判らないのなら鼬害でしょう。
まぁ、静的なメンバ変数は明示的に実体化しないといけないので普通の環境でもリンクエラーになるわけですが。
0019デフォルトの名無しさん2008/05/14(水) 22:22:21
>>17
簡略化した例を示せば賢い人が答えてくれるかも

多分C++ではそういうときにはテンプレートの出番になると思うけど
0020デフォルトの名無しさん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 {};
0021デフォルトの名無しさん2008/05/14(水) 23:40:30
ostringstreamクラスに、
ostringstreamオブジェクトの先頭に任意の文字列を追加できる関数ってありますでしょうか??
探しても見つからなかったのですが。
■ このスレッドは過去ログ倉庫に格納されています