1 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:39:18 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.56【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1215278693/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
175 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:43:05 ] VC++で、ソースコードをUTF-8で保存してコンパイルしたら、"文字列" がUTF-8になってくれればいいんだけどね
176 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:50:50 ] VC++(UCS2)/gcc(UTF-32)での可搬性を考えると、 wchar_t=UCS2と想定するのが良い UTF-16、UTF-32はC++0xが出てくるまで我慢
177 名前:176 mailto:sage [2008/07/20(日) 23:53:11 ] もちろん、ICUなどで提供されている型や関数を使っている人は除く
178 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 02:42:01 ] どーでもいいよそんなの
179 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 08:10:43 ] >>175 C++0xでUTF-8リテラルが追加される。u8"文字列" ※ime.nu通すと#以降が消えるので ttp://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB
180 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:04:39 ] printf("aaa\b\b\b"); とかやってるコードを見かけたのですが、 \b\b\bはどういう意図でやっているのでしょうか? \bはバックスペースのようですが…
181 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 14:20:49 ] 次に書いた文字がaaaを上書きする。
182 名前:180 mailto:sage [2008/07/21(月) 14:40:00 ] >>181 さんありがとうございます。 ファイルコピーの進捗状態をコンソール上の同じ位置で パーセント表示する際などに 使うわけですね。なるほど。
183 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:36:23 ] char *p; char **pp = malloc(sizeof(char*) * 100); という式はcharのポインタのポインタを100確保したという意味でいいのですか? pp[0]はpと同じ意味ですか?
184 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 19:42:56 ] char*を100個格納できるエリアへのポインタを返していて、そのポインタをppに入れている あくまでも指定されたサイズのエリアを確保しているだけで、ポインタを確保している訳ではありません。 上記コード上ではpとpp[0]には何の関連もないけど、 p = pp[0];ができる?という意味なら、できる。
185 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 22:34:01 ] >>184 同じ意味とは型が同じかという意味でした。
186 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:08:32 ] VCで作ってタソーすをgccでコンパイルしようとすると tchar.hがないってエラーになるんだが、 Linuxでは何てヘッダを読み込めば_TCHARとか_T()とか使える? 自分で定義するしかない?
187 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:17:41 ] 当たり前だ
188 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:22:32 ] そのための_TCHARだ。
189 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 04:24:17 ] gcc だと何と定義すりゃいいんだろうな。 wchar_t が UCS4 だったりすることもあるんじゃないのか。
190 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:21:02 ] そもそもAPIにAとWの区別もないのに何の意味があるんだろう。
191 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:28:47 ] >>190 WしかないAPIもある
192 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 14:34:56 ] >>191 そんな話はしていない
193 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 16:50:58 ] >>189 UCS2でも4でも動くように書くしかないかと あるいはライブラリを使うか
194 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 17:33:55 ] wchar_tの中身がUnicode系ではない環境もあるのでよろぴこ。
195 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 20:54:18 ] >>194 その処理系の名前教えて。 いや、煽りとかじゃなくて普通に知りたいので。
196 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 21:25:07 ] >>195 Linux以外のほぼすべてのUNIX。 すくなくとも、Solaris FreeBSD NetBSDはUnicodeではなかったはず。
197 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:00:16 ] そうなのか。dクス
198 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:02:46 ] LinuxをUNIXと言うと基地外が来襲するので ちゃんとUNIXライクOSと言いましょう
199 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:11:08 ] wchar_tマジ使えなさすぎワロタ ml.tietew.jp/cppll/cppll/article/862
200 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:40:13 ] その辺に載ってる話はさすがに古くねえか? gcc 2.xだろ?
201 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:55:17 ] gccのwchar_tは昔からうんこ あまりにも有名すぎる話
202 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 23:37:26 ] >>201 いやその、今のgccはinput-charsetだのexec-charsetだのwide-exec-charsetだの 指定できるだろ?
203 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 01:49:03 ] *i |= 3; はちゃんと *i = *i | 3; に展開されるのでしょうか?
204 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:26:54 ] いいえ、前者と後者では意味が違います。
205 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 02:32:22 ] >>203 「展開される」の意味が分からない Cだと結果は動作は等しくなる C++だとoperatorのオーバーロードがあるのでなんともいえない
206 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:02:00 ] class test { string* p; public: test() { p = new string; } ~test() { delete p;} } main() { test obj1; test obj2 = obj1; } 2度目のdeleteにてセグメンテーション違反で落ちるコードです 教科書ではコピーコンストラクタを上書きして ポインタの指す先までコピーするようにしてるのですが delete時にチェックする方法はあるんでしょうか? 実用性は考えていませんが、興味があります 環境: Linux kernel 2.6-686 GNU C++ compiler 4.1.1
207 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:07:15 ] ローカル変数とは定義された順にスタックに積まれるのですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:42 ] >>206 obj2.pはobj1.pと同じだから落ちて当たり前。 何がしたいのか分からないけど、ポインタにNULLポインタを入れておけば それがdeleteされても問題なく動く。
209 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:50 ] >>206 > delete時にチェックする方法はあるんでしょうか? 参照カウンタをどこかに持つとか。
210 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:18:20 ] あー、参照カウンタにしても、けっきょくコピーコンストラクタをオー バーライドしなきゃいけないか。
211 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:25:16 ] >>208 どこでNULLをセットすればいいですか? >>209 なるべく簡単な方法がいいんですよね catchしちゃえばいいのかな このアドレスは使っちゃ駄目みたいなのは カーネルに聞けば教えてくれるのかなと思ったんですが
212 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:33:33 ] >>206 あくまでチェックしたいってことなら、方法は無い。 ヌルをセットするとかして、とにかく落ちないようにするなら auto_ptr でも使っとくのが簡単。 #include <memory> #include <string> using std::string; using std::auto_ptr; class test { auto_ptr<string> p; public: test() : p(new string) {} }; int main() { test obj1; test obj2 = obj1; }
213 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 11:37:38 ] >>207 規格ではスタックが使われるのかすら決まってなかった気がする
214 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 12:39:32 ] >>211 string*ではなくstringをメンバに持たせる
215 名前:デフォルトの名無しさん [2008/07/23(水) 16:25:27 ] class hoge{ private: int fuga; public: void setfuga(int a){ fuga = a; } int getfuga(){ return fuga; } }; class foo{ private: std::vector<hoge> var; public: void sethoge(hoge hage){ var.push_back(hage); } std::vector<hoge> getvar(){ return var; } }; int main(){ foo foo0; hoge hoge0; hoge0.setfuga(1); foo0.sethoge(hoge0); std::vector<hoge>::iterator itr; itr = foo0.getvar().begin(); std::cout << foo0.getvar().at(0).getfuga() << std::endl; std::cout << (*itr).getfuga(); return 0; } これを実行すると、一つ目のcoutは正常に出力(1)されますが、二つ目はでたらめな値が出ます。 itr = foo0.getvar().begin()はfoo0.getvar().at(0)を指すiteratorだと思うので、同じ結果になると 思っているのですが…。どなたかお教えいただけると助かります。
216 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 16:35:26 ] >itr = foo0.getvar().begin(); getvarの戻り値はfoo0.varそのものではなくfoo0.varの一時的なコピーで、次の文に移る前には破棄される getvarはfoo0.varのコピーを返すのではなくfoo0.varへの参照を返す必要がある
217 名前:デフォルトの名無しさん [2008/07/23(水) 16:38:55 ] >>216 その通りでした。ちょうど思いついたところでした。 すみません、どうもありがとうございます。
218 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:39:07 ] HOGEという構造体がtypedefされているとします。 HOGE *hoge;と宣言します。 void function(HOGE *hoge){ }という関数に function(hoge)と渡すと参照渡しになってますか?
219 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:42:42 ] >>218 それはC++でいうところの参照ではありません
220 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:44:26 ] アドレス私ですか?
221 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:46:44 ] ?
222 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:47:38 ] アドレス渡しですか?の間違いです
223 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:01:10 ] 「自分宛のレスですか?」という意味だと勘違いしたのは、 俺だけじゃないはず。
224 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:33:45 ] foo(HOGE fuga){ } bar(HOGE* pFuga){ } baz(HOGE& fuga){ } func() { HOGE hoge; HOGE *pHoge; // 値渡し foo(hoge); // ポインタ渡し(アドレス渡し) bar(pHoge); // 参照渡し baz(hoge); }
225 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:40:34 ] foo(HOGE fuga) foo(HOGE &fuga) HOGE hoge; foo(hoge); この場合どっちが優先されますか?
226 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:43:00 ] >>225 自分でコンパイルしてみては?
227 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:40 ] 自分で試してください。 俺は試しました。VC++2005EE XXX.cpp(19) : error C2668: 'foo' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) XXX.cpp(11): 'void foo(HOGE &)' の可能性があります。 XXX.cpp(7): または 'void foo(HOGE)' 引数リスト '(HOGE)' を一致させようとしているとき
228 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:44 ] もし環境依存だったら自分で試しただけでは分からないし
229 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:50:02 ] それは試してうまくいった後に質問すべきこと。
230 名前:デフォルトの名無しさん [2008/07/23(水) 22:08:24 ] g++でプリコンパイル済みヘッダが使えないって聞いたんだが、 stdafx.hみたいに一つのヘッダファイルでSTLやboostとかのヘッダ 全部読み込むのはやめたほうがいい?
231 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:44:37 ] いつのg++の話?
232 名前:デフォルトの名無しさん [2008/07/23(水) 23:54:09 ] >>224 225は自分じゃないです。 ポインタ渡しした場合はbar関数の中で値を書き換えても、元には影響ないんですか?
233 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:03:05 ] >>232 ポインタを引数に指定しないとだめか、そうでないかの違いで、影響あることには変わりないよ
234 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:10:51 ] 225は違う人だったのか… ポインタ渡しは影響する 参照渡しも影響する 値渡しだけは影響しない
235 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:21:32 ] クラスは参照型なのでゴニョゴニョ
236 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:23:12 ] >>232 bar(HOGE* pFuga){ *pFuga = ...; //影響する pFuga = ...; //影響しない }
237 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 02:02:44 ] >>230 そういう理由もあるだろうし、依存関係は最小限にしたほうがいいと思うよ。 g++ でもプリコンパイル済みヘッダ自体は使えたような気がする。使い方が 全然違ったはずだけど。
238 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 09:04:36 ] >>235 嘘をつくな
239 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:36:21 ] あれ? クラスもコピーコンストラクタ呼ばれて値渡しされるよね?
240 名前:デフォルトの名無しさん [2008/07/24(木) 13:39:58 ] コピーコンストラクタ呼ばれて値渡しされるし、逆にコピーコンストラクタが定義されていないと コンパイルできないはず
241 名前:240 [2008/07/24(木) 13:42:25 ] 値渡しの話だよね?
242 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:43:59 ] コピーコンストラクタがなければ勝手に丸ごとコピーします。 でないと、struct A a, b; a = b;というC由来のコードがコンパイルできなくなってしまう。
243 名前:240 [2008/07/24(木) 13:44:40 ] あ、そっか、そうだね、失礼
244 名前:240 [2008/07/24(木) 13:47:05 ] あ、よくがんがえたら、クラスのメンバーに、コピーコンストラクタが定義されていないオブジェクトが含まれている時と 勘違いしてた。 自分がよくコンパイルエラー出すもんで。。w
245 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:52:09 ] 実際 中間インスタンス生成+コピーコンストラクタ呼んだ後は 参照でわたしてる? 呼び出し元のインスタンスには影響を与えないけど、スタックに実体を積んでいるわけではない みたいな構造
246 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:53:44 ] それぞれ想定している状況が違っている悪寒。
247 名前:デフォルトの名無しさん [2008/07/24(木) 13:55:27 ] VC2008 VC6 BCC MinGW でboostいれたいんですけど バイナリ配布しているVC2008しか成功しません 1.35のそれぞれのバイナリ置いてある所無いですか?
248 名前:デフォルトの名無しさん [2008/07/24(木) 14:17:41 ] www.boost.org/development/tests/release-1_35_0/developer/summary.html boostてdrwinとvc7以上で主に動くんですね borlandはかなり駄目ですね
249 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 14:39:09 ] darwinってmacのことだぞ
250 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 19:59:10 ] boost::regex で,置換する時に置換フォーマットが $10 だと 10 番目のキャプチャ要素に置換されるんだけれど, これを一番目のキャプチャ要素 $1 + 0 にするにはどうしたらいいの?
251 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:00:54 ] >>250 regex を二回呼べばいいんでは?
252 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:09:39 ] すいません 2 回呼ぶと言うのはどういう意味でしょうか?
253 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:23:33 ] >>250 簡単な例をplz
254 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:29:02 ] ${1}0でいけたような気がしたけど、どうだったかなあ
255 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:31:59 ] 1.35のregexでいまためしてみた。 "\\10"で大丈夫。sed format string syntaxってやつだ。 "${1}0"はだめ。 #include <iostream> #include <string> #include <boost/regex.hpp> int main() { boost::regex re("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.).*"); std::string s ="abcdefghijklmn"; std::cout << boost::regex_replace(s, re, "\\10") << std::endl; return 0; }
256 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:34:49 ] そういう意味か!
257 名前:250 mailto:sage [2008/07/24(木) 20:38:51 ] >>255 ありがとう!それでうまくいきました.
258 名前:デフォルトの名無しさん [2008/07/25(金) 10:23:37 ] boost_serializationを画面やメモリに出力したいのですが教えて下さい test_classは別に定義してあるとします。これだとファイル出力です #include <fstream> #include <string> int main() { std::ofstream fp("XXX.xml"); boost::archive::xml_oarchive oarchive(fp); test_class Z; Z.a = 22; Z.b = 7; oarchive << boost::serialization::make_nvp("Root", Z); }
259 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:34:45 ] >>258 よくわからんが ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?
260 名前:デフォルトの名無しさん [2008/07/25(金) 10:35:02 ] 追記 型 const boost::serialization::nvp<T>の出力方法がわかればいいのですが
261 名前:デフォルトの名無しさん [2008/07/25(金) 10:36:58 ] トンクス これでいけました! xml_oarchive oarchive(fp); → xml_oarchive oarchive(cout);
262 名前:デフォルトの名無しさん [2008/07/25(金) 10:41:06 ] メモリに格納したいのでstringにしたらエラーでました。 メモリに入れる良い方法ありませんか? string s; boost::archive::xml_oarchive oarchive(s); 1番目の引数を 'std::string' から 'std::ostream &' に変換できません。
263 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:46:46 ] >>262 つ[stringstream]
264 名前:デフォルトの名無しさん [2008/07/25(金) 10:50:32 ] トンクス
265 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:06:02 ] 参照を使うべきかポインタを使うべきか悩んでいるのですが、 参照なんて使わない!もしくはできる限り全て参照を使う!って方いますか? どうもポインタと参照の違いが分かりません(使いどころとして)
266 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:46:14 ] >>265 C++では、ポインタを使わないといけないケース以外はポインタを使わない。 使うとしても、大抵はイテレータと言う形で使っている。 必要に迫られれば、ポインタを使うこと自体は吝かではない。
267 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:50:08 ] C++だと関数にヌル終端文字列を渡すときも、const char * とか使わず、 全て const char & とか const std::string & を使うの?
268 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:51:13 ] const char & を渡してどーすんだ
269 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:58:18 ] 俺は、参照を使わざるを得ないときと、値渡しの代わりとしてコピーのコストを抑えるためにしか、参照を使ってないな それ以外はポインタ
270 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:08:14 ] void test(const char& s){ if(&s==NULL){ std::cout << "(NULL)" << std::endl; } else{ std::cout << &s << std::endl; } } int main(){ test(*"aaa"); test(*static_cast<const char*>(NULL)); return 0; } --結果--- aaa (NULL) 扱えないことはない。 でもまぁ正直言って、これはないw
271 名前:265 mailto:sage [2008/07/25(金) 14:12:35 ] 値渡しのコピーを省くためなら、参照でなくともポインタでできそうですけど、 それをわざと参照でやる理由はなんでしょう? c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。 ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか? int n; int &func(); void main() { int i = 0; func() = i; } int &func() { return n; }
272 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:29:06 ] ポインタは参照と違ってNULLを渡すことができるらしいよ。 参照はポインタと違っていい一般保護例外を起こすようなアドレスを排除できるらしいよ。
273 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:35:22 ] >>271 少なくともread-onlyな引数を、効率のためにconst参照渡しがしたいケースなら、 素直にreference使ったほうが便利だよ >>272 の言うような問題もないし、呼ぶ側としても ただの値渡しと同じように記述できて、型変換や何かが必要な場合もコンパイラが面倒 見てくれるからな ユーザ定義演算子などでは、意図した記法を実現したければ、 事実上参照以外に選択肢が無いこともある
274 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:36:21 ] >>272 やってやれんことはないな void hoge(double &d) { } hoge(*(double *)NULL); hoge(*(double *)123);
275 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:37:23 ] >>271 const参照になるけど、 ・良いかどうかは別にして、コンストラクタの暗黙呼び出しが使える。 ・一時オブジェクトが渡せる。 という利点はある。 struct IntX { int n; IntX():n(0){} IntX(int argn):n(argn){} }; void test(const IntX& a){ std::cout << a.n << std::endl; } void test2(const IntX* a){ std::cout << a->n << std::endl; } int main(){ test(IntX()); test(10); //test2(&IntX(20)); //左辺値でないのでコンパイル不可 return 0; } あと、>>272 がツッコミ入れてくれた通り、 >>270 で書いた *static_cast<const char*>(NULL) みたいなネタは 実際のプログラムでやったら(無効な参照を作ったら)駄目だからね。
276 名前:265 mailto:sage [2008/07/25(金) 14:47:48 ] ふむふむ、なるほど。よく分かりません\(^o^)/ もう少し理解を深めてから出直したいと思います。
277 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:48:21 ] このスレか別のスレかわからないが最近同じネタをやってて、 参照が追加になったのは演算子のオーバーロードやコピーコンストラクタで 必要に迫られたからということらしい。 通常では戻り値はいいとして引数で使うと変数の変化が追いにくくなるので 多用はしないということだった。
278 名前:265 mailto:sage [2008/07/25(金) 14:55:17 ] C++の機能拡張に合わせて追加された、ということでしょうか。 同じネタが上がるということは、同じ疑問を持つ人がいるということですかね。 オーバーロードやコピーコンストラクタのあたりも見直してみます。
279 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:56:12 ] >>274 その場合は呼び出し元に問題があることが確定するのが、参照にしとく利点になるかな? ポインタだと、渡された側でヌルチェックすべきかどうか気になってしまう。
280 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:57:23 ] >>276 まだ勉強中って書いてあったね、ごめん。 慣れるまで、参照でなければならない箇所以外は ポインタで良いと思うよ。 たぶん、経験が自然に教えてくれる。
281 名前:デフォルトの名無しさん [2008/07/25(金) 14:57:42 ] hoge(*(double *)NULL); こんなん落ちないの?
282 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:01:25 ] 落ちると思って良い。 ちなみに言語規約違反な。
283 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:04:08 ] 間違った。規約じゃなくて規格。
284 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:09 ] C++でC言語のキャスト使うのやめれ
285 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:49 ] そういうときは未定義動作っていうんだ。コンパイルはできちゃうからね。
286 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:13:29 ] #define NULL reinterpret_cast<void*>(0)
287 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:21:06 ] BCCでの質問です。 ファイル間のインクルードの関係が以下の時、変更してないファイルも毎回コンパイルされるんですが回避策ってありますか? A.h B.h(include A.h) A.cpp(include A.h) B.cpp(include A.h,B.h) オナがいします。
288 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:22:52 ] >>287 ヘッダを変更しなければいいだけじゃないの?
289 名前:デフォルトの名無しさん [2008/07/25(金) 17:31:40 ] C言語勉強中なのですが、理由が知りたいです。 簡単なプログラムなのですが、回答よろしくお願いします void hogefunc(char *); void main() { char a[256] = "abc 0001"; hogefunc(a); } void hogefunc(char *tmp) { char b[256]; strcpy(b,tmp); } ////////////// デバッグを行うと、bの中身が"abc"のみでaの中身"abc 0001"が文字列コピーできていません。 予想だと、aの中身とbの中身は同じになると思ってました。なぜ0001が切られたのでしょうか? よろしくお願いします
290 名前:289 mailto:sage [2008/07/25(金) 17:34:42 ] 全て打つ前に転送してしまいました・・ このプログラムの場合、aの中身とbの中身を同じにするにはどうすればいいでしょうか?
291 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:34:57 ] そんなはずがない。なんかの見間違いなんじゃないか
292 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:57 ] void hogefunc(char *); void main() { char a[256] = "abc 0001"; hogefunc(a); } void hogefunc(char *tmp) { char b[256]; strcpy(b,tmp); printf("%s",b); } で試したけどちゃんと表示されてました
293 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:58 ] >>289 >>290 んなこたぁーない もう少しデバッグのステップ続けてみ
294 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:36:21 ] >>287 どうやってコンパイルしてる? make 使ってるのなら makefile 見せてみ
295 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:37:42 ] "abc 0001" ^ 実はこれが\0というオチを予想
296 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:01:40 ] >>288 ,294 どうやらファイル名が長すぎるのが原因のようでした。 最小限の再現作ってたらincludeのみのヘッダファイルが二個だけになったので^^;
297 名前:デフォルトの名無しさん [2008/07/25(金) 19:11:07 ] 一様乱数を生成する関数のソースについて質問があります。y=1/sqrt(2)*exp(-1/2*x*x)の計算で In function `GaussRandom':: undefined reference to 'sqrt’と In function `GaussRandom': : undefined reference to `exp'というエラーがでて実行できません。もちろん<math.h>は定義しました。 レポート課題なのでマジで困ってます。是非教えてください。ソースを下に載せておきます。 ちなみにxが一様乱数で、yが正規乱数です。 double GaussRandom() { double x; double y; x=UniformRandom(); y=1/sqrt(2)*exp(-1/2*x*x); return y; } double UniformRandom() { double x; int r=1; r=1229*r+351750; x=r/1664501; return x; }
298 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:29:31 ] >>297 お前いい加減にしろよ。
299 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:53:42 ] >>289 変数寿命が切れてるから上書きされているんじゃないの?
300 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:23:03 ] クラス内の関数ポインタでつまづいた。 分からない、全然分からない。 どこが分からないのかすら分からない。
301 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:28:50 ] 普通の関数ポインタはわかるのか? じゃあメンバ関数ポインタでぐぐるんだ
302 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:35:00 ] ええ、それで調べているんですけど、どうしてこんなに難解なのかと小一時間(ry 関数ポインタをメンバに含めると初期化できませんよね?こんな風に void (*pf[])() = {hoge, piyo, foo}; もう普通に関数にした方がいいのかな……。
303 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:39:47 ] オーバーロード演算子関数のポインタって取れないんですか? X (*f)(X &, X &) = +; X (*f)(X &, X &) = &+; X (*f)(X &, X &) = ::+; X (*f)(X &, X &) = &::+; X (*f)(X &, X &) = *::+; X (*f)(X &, X &) = operator +; X (*f)(X &, X &) = &operator +; X (*f)(X &, X &) = &::operator +; とか色々試したんですが「;が足りません」だの「operatorの位置が不正です」だのなんだの 構文に文句付けられて通りません 取り方があれば教えて下さい
304 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:42:20 ] それってただの関数ポインタじゃないか?
305 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:46:28 ] >>303 これでいけたぞ #include <stdio.h> struct X{}x; X operator+(X&, X&){printf("x");return X();} int main(){ X (*f)(X&, X&) = operator+; f(x,x); }
306 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:53:37 ] >>302 #include <stdio.h> class A{ static void (A::*pf[])(); public: void hoge(){ printf("hoge"); } void piyo(){ printf("piyo"); } void foo(){ printf("foo"); } void call(){ for(int i = 0; i < 3; i++) (this->*pf[i])(); } }; void (A::*A::pf[])() = { &A::hoge, &A::piyo, &A::foo }; int main() { A().call(); }
307 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:56:10 ] 俺には解読不能な文字列が多すぎて、目眩がしそう。
308 名前:デフォルトの名無しさん [2008/07/25(金) 21:24:13 ] 質問があるんですが,C++プログラムの変数の中に入っているデータをJAVAで取得することは可能なんでしょうか? データベースやファイルに書き込むなどの方法を取らずに、出来る方法があれば是非知りたいです。
309 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:27:34 ] >>308 JNIと相談してみてください。
310 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:29:00 ] Javaって他のJavaプログラムの変数の中のデータを取得することできるの?
311 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 21:30:24 ] >>306 ありがとうございます。 あとはゆっくり中身を理解したいと思います。
312 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 22:25:34 ] >>310 普通にclassファイルがあれば、望みは全て叶うでしょう。 実行中のプログラムとかCORBAとかその他みたいなプロセス間通信の事を言っているのなら、そういうインターフェースを自分で作ってください。
313 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 22:52:23 ] >>297 #include <math.h> と書いてありますか? 手元のコンパイラで試しますので、全文をどこかにアップロードしていただけますか?
314 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 23:04:42 ] >>313 pc11.2ch.net/test/read.cgi/tech/1215568848/919-921
315 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 23:18:23 ] >>312 >>308 に言ってあげてください
316 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:16:53 ] ビット演算で文字列中の大文字を小文字にしようとしてるのですが一文字目は出来ますがふた文字目以降ができません。 この場合ってループで回して一文字ずつ処理するしかないんですかね?
317 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:19:56 ] >ビット演算で文字列中の大文字を小文字にしようとしてる 言ってる意味が分からないのでソースで。
318 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:23:35 ] str |= 0x20; としか・・・
319 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:44:13 ] OK、では次はこれをソースで。 >のですが一文字目は出来ますがふた文字目以降ができません。
320 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:45:24 ] OKってようするに、わからないなら答えなくっていいです。 ソースだせソースだせってわからないだけでしょ?それをソースだせって馬鹿なの?
321 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:48:35 ] ソースが無くてトンカツが食えるか!
322 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:48:51 ] w
323 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:52:29 ] 1レス目でソース出してれば1レスで問題点が返ってくるレベルと予想
324 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 09:56:49 ] 文字列がマルチバイトを含まないことを祈るばかりです。
325 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 12:29:55 ] 一文字目は出来てる>>316 さんがマルチバイト文字くらいで困るわけ無いじゃないか
326 名前:デフォルトの名無しさん [2008/07/26(土) 12:59:33 ] >>309 JNIを調べて試してみましたが,自分の場合は使えなさそうです. JAVAソースを書いて→ヘッダー作成→C++ソース作成 という順序のようですが,今の状態ではC++ソースとJAVAソースが全然別のアプリケーションとして完成していて, C++アプリで使っているデータをJAVAで扱いたいという事なんですが…。 C++でデータを自分自身のIPに送って,JAVAでそれを取得するというのを今考えているんですが….
327 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:04:53 ] テキストファイルに書き込む→読み込む
328 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:06:25 ] 自前でシリアル化して通信すれば
329 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:19:36 ] >>10 (2)だと、クッキーの設定はちゃんとしてるのに書き込み確認画面のまま止まってる。 つまりクッキーの設定がうまくいってないみたいなんだが、デバッガで文字列を確認してみても正常だし そのデバッガで確認した文字列を手動で書いて送信するとうまくいく。
330 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 13:20:27 ] すみません誤爆しました。
331 名前:デフォルトの名無しさん [2008/07/26(土) 14:00:26 ] >>327 それでも一応可能なんですが, 取得したデータに対応した動きみたいなモノを作らないといけない為, JAVA側でテキストファイルをずっと参照し続け,更新があった場合○○する. といった風な感じになってずっと参照し続けるというのが気持ち悪いから避けたいんです.
332 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:01:00 ] >>326 プロセス間通信とか、XMLでシリアライズしたのを渡すとか。
333 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:55:33 ] 1〜10までの偶数を書き出すプログラムでもっと簡単なコードがあったら教えてください。 自分で書いたのは↓です。 #include <iostream> using namespace std; int main() { int i; cout << "1〜10までの偶数を出力します\n"; for(i = 1; i <= 10; i++){ if(i % 2 == 1){ continue; } cout << i << "です\n"; } return 0; }
334 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:56:34 ] for(i = 2; i <= 10; i+=2){ cout << i << "です\n"; }
335 名前:デフォルトの名無しさん [2008/07/26(土) 14:58:06 ] for(i = 1; i <= 5; i++) cout << 2*i << "です\n";
336 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:59:02 ] >>334 335 ありがとうございます
337 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 14:59:38 ] cout << "2, 4, 6, 8, 10です\n";
338 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:01:39 ] ウケタw
339 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:07:52 ] そんなに面白くはない
340 名前:デフォルトの名無しさん [2008/07/26(土) 15:08:35 ] ↓次の方どうぞ
341 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:31:54 ] 繰り返し文を利用して ☆ ☆☆ ☆☆☆ ☆☆☆☆ ☆☆☆☆☆ と表示させるコードを書いてみたのですが、もっと簡単に書く方法ありませんか? #include <iostream> using namespace std; int main() { int i; for(i = 1; i <= 5; i++){ if(i == 1){ cout << "☆\n"; } else if (i == 2){ cout << "☆☆\n"; } else if (i == 3){ cout << "☆☆☆\n"; } else if (i == 4){ cout << "☆☆☆☆\n"; } else if (i == 5){ cout << "☆☆☆☆☆\n"; } } return 0; }
342 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:34:26 ] ひょっとしてそれはギャグで言っているのか?
343 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:35:55 ] 普通の小学生ならカウンタの値と☆の数に関連性を見出せる筈
344 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:36:47 ] >>341 cout << "☆\n☆☆\n☆☆☆\n☆☆☆☆\n☆☆☆☆☆";
345 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:41:25 ] >>341 そこはif文じゃなくて、switchで場合分けするべきだと思うんだ。
346 名前:デフォルトの名無しさん [2008/07/26(土) 15:42:47 ] >>345 いやswitchにしてもまだおかしいだろwwww
347 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:44:04 ] 少し考えるので時間ください
348 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:46:10 ] hoshiHyouji(size_t nannko)という関数を作ればいいんじゃに
349 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:53:45 ] 関数はまだ習ってないのでわからないです。 #include <iostream> using namespace std; int main() { int i; int j; for(i = 1; i <= 5; i++){ for(j = 1; j <= i; j++){ cout << "☆"; } cout << '\n'; } return 0; } これでも同じように表示されたましたけど 考え方はあってますか? それとも、もっと簡単な方法があるのでしょうか?
350 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:56:42 ] あってると思うけど 個人的に for(i = 0; i < 5; i++){ for(j = 0; j < i; j++){ の方が好き
351 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:58:14 ] >>350 なるほど0からのカウントですか。 もっと分かりやすいコードが書けるように頑張ってみます。
352 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 15:58:55 ] >>349 そこは繰り返しじゃなくて再帰を使うべきだな。 void print_hosi(int num); void print_hosi(int num) { if ( num <= 0 ) { return; } for ( int i = 0; i < num; i++ ) { cout << "☆"; } cout << endl; print_hosi( num - 1 ); }
353 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:10:37 ] >>350 すいません、自分が指摘するのはあれなんですが ☆ ☆☆ ☆☆☆ ☆☆☆☆ ☆☆☆☆☆ と表示させるなら for(i = 0; i < 5; i++){ for(j = 0; j <= i; j++){ だと思います。
354 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:14:39 ] 俺なら for(i = 0; i < 5; i++){ for(j = 0; j < i+1; j++){ にするかな、気分の問題だけど
355 名前:デフォルトの名無しさん [2008/07/26(土) 16:17:28 ] for(i = 1; i <= 5; i++) for(j = 0; j < j; j++)
356 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:18:08 ] 俺には j < i であってるように見える。
357 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:19:28 ] >>356 それで実行したら ----------- 改行 ☆ ☆☆ ☆☆☆ ☆☆☆☆ ----------- でした。
358 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:19:33 ] >>356 は>>353-354 宛
359 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:29:21 ] まぁ for(i = 0; i < 5; i++){ cout << "☆"; for(j = 0; j < i; j++){ cout << "☆"; } cout << "\n"; } でも出来るけど、>>355 が正解だろうな。
360 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:45:24 ] でもこの手のはCSVやURLクエリのように区切りが出てきて for(int i=0; i<5; i++){ std::cout << "☆"; for(int j=0; j<i; j++){ std::cout << ","; std::cout << "☆"; } std::cout << "\n"; } みたいな感じに落ち着くことも多い。
361 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 16:47:44 ] #include <iostream> #include <iomanip> int main() { int i, j; std::cout.fill('☆'); for(i = 1; i <= 5; i++) std::cout<<std::setiosflags(std::ios::right)<<std::setw(i)<<""<<std::endl; return 0; }
362 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:00:18 ] ('☆')←何この顔バカにしてるの?
363 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:09:26 ] >>362 なんだと
364 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:09:38 ] std::string str; for(int i=0; i < 5; i++) { str += "☆"; std::cout << str; } std::cout << "\n";
365 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 17:11:16 ] >>362 寄生獣ですね、わかります。
366 名前:デフォルトの名無しさん [2008/07/26(土) 19:54:58 ] サービスとして動くプログラムのサンプルをやってるんですが上手くいきません StartServiceCtrlDispatcher()で失敗します GetLastError()で1063が取れるんですけど、どうすればいいんでしょうか? 環境はxp sp2、vc++2005でやってます void ErrorHandler( char *s, DWORD err ) { std::cout << s << std::endl; std::cout << "Error number: " << err << std::endl; ExitProcess( err ); } void WINAPI ServiceMain( DWORD argc, LPTSTR *argv ) { // 空 } void main() { char *SERVICE_NAME = "BeepService"; SERVICE_TABLE_ENTRY serviceTable[] = { { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; // SCMで登録する BOOL success = StartServiceCtrlDispatcher( serviceTable ); if( !success ) ErrorHandler( "In StartServiceCtrlDispatcher", GetLastError() ); }
367 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 20:23:00 ] >>366 よくわからんが、ちゃんとサービスとしてSCMのデータベースに登録済みで、 SCMからサービスとして起動されたときにそういうエラーが出ているの? ただのコンソールアプリとして普通にキックしたときに StartServiceCtrlDispatcher()が失敗するのはただの仕様なんじゃないの
368 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:02:45 ] double型の変数を文字型の変数に疑似変換するプログラムを書けと教授に言われたのですが、 全く方法が解りません・・・。 誰か助けてください。 その際関数のオーバーロードを必ず使用する事、と言われました。 実は問題の意味があまり分かってなかったり。疑似変換とは・・・?
369 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:05:40 ] 問題の意味は出題者に訊くしかない
370 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:08:25 ] 今から教授に電話して聞いてみます。
371 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:10:58 ] sprintf? でもオーバーロードなんか必要ないしなぁ・・・
372 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:13:17 ] 留守電だったので諦めました。 とりあえず考えられる事をいくつかプログラムしてみます。 疑似変換・・・・か。
373 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:20:58 ] char型の固定小数で表せって事だろJK
374 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:22:31 ] >>368 こんなん? 真夜中の電話、不吉な感じがイヤン #include<iostream> #include<string> //ここでオペレータをほげほげ int main(void){ double x=1.2345; std::string str; str=x; std::cout << str << std::endl; return 0; }
375 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:33:26 ] オーバーロードを入れるとややこしくなりそうだな〜
376 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 22:37:31 ] 関数のオーバーロードをする必要性がわからん・・
377 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:15:40 ] inline関数を使う場合は関数の宣言と関数の定義で2回記述しないといけないんですか? #include <iostream> using namespace std; //関数の宣言 inline int square(int x); inline double square(double x); int main() { int i; double j; cout << "整数を入力してください\n"; cin >> i; int sum1 = square(i); cout << i << "の二乗は" << sum1 << "です\n"; cout << "小数を入力してください\n"; cin >> j; double sum2 = square(j); cout << j << "の二乗は" << sum2 << "です\n"; return 0; } //関数の定義 inline int square(int x){ int num1; num1 = x * x; return num1; }inline double square(double x){ double mum1; mum1 = x * x; return mum1;}
378 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:19:47 ] >>377 inline なら定義が無いと意味無いし、定義は宣言を含むから、定義だけ書いとけばいいよ。
379 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:21:06 ] >>378 即レスありがとうございます!
380 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:28:40 ] すいませんもう1つだけ質問です。 テンプレート関数は templat <class T>
381 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:29:25 ] すいません誤爆で途中で投稿してしまいました。 スレ汚しすいません;;
382 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:34:20 ] すいませんテンプレート関数は template <class T> T square(T x){ 処理 } と記述できると書いてあったんですが 宣言と定義みたいに分けて記述することはできないんですか? 試しに //宣言 template <class T> T square(T x); main関数 return 0; //定義 T square(T x){ 処理 } とやったのですがエラーが出ました。要するに無理ってことでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:43:04 ] >>382 無理です。使う時点で定義が読み込まれている必要があります。
384 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:44:15 ] >>383 ありがとうございます。 不思議に思っていたことが解決しました。
385 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:44:31 ] >>382-383 っ export
386 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 23:52:22 ] >>385 つ現実
387 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:02:31 ] >>382 ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-3.html
388 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:06:47 ] >>387 馬鹿?
389 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 00:08:34 ] >>382 分けて書くこと自体は可能。その感じだと、たぶん定義のほうに template <class T> が足りないだけ。
390 名前:デフォルトの名無しさん [2008/07/27(日) 01:35:03 ] 「aaaaiiiuuueooあああああいいいしてるるるる」 みたいに、 ・昇順で並んでいる ・同じ文字がたくさん入ってる ・あとから変更されることはない ・wchar_t ・一文字あたりの繰り返しは少ない(5個くらいまで) ・長い文字列もある(10MBytesくらい) という文字列を扱うんだが、 ・「N番目の文字」を高速に取り出せる ・「N種類目の文字と個数」を高速に取り出せる 条件を満たすデータ構造ってどんなのがある? 配列を2つ用意するしかない? てかこのスレでよかった?
391 名前:390 mailto:sage [2008/07/27(日) 01:36:00 ] すまん矛盾してた > ・同じ文字がたくさん入ってる これは無視してくれ。
392 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:41:12 ] >>390 struct { int start; wchar_t c; } を start でソートした配列、でいいんじゃないかな? その例だと {{0, L'a'}, {4, L'i'}, {7, L'u'}, {10, L'e'}, {11, L'o'}, {13, L'あ'}, ...} って感じで。
393 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:41:14 ] >>390 昇順に並んでるってのは、文字コードが昇順にならんでるってわけじゃないの?
394 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:46:54 ] >>392 おお! なんだかよさそうだ。 ありがと! >>393 そうです
395 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:48:28 ] >>394 例にでてる文字列が文字コード順に並んでないけど、それは例が間違いってことだな。
396 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:50:47 ] >>395 ひらがなが先だっけ? なら例が間違ってるわ。 すまん
397 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:53:16 ] >>396 いや、アルファベットをローマ字で昇順に並べても、文字コード順にはならんよ。
398 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 10:26:24 ] >>397 そうでした
399 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:51:23 ] #include <iostream> using namespace std; //関数addの宣言 void add(int *px, int *py, int *pz); //点数を加算するプログラム int main() { int x1; int x2; int a; cout << "2科目の点数を入力してください\n"; cin >> x1 >> x2; cout << "加算する点数を入力してください\n"; cin >> a; add(&x1, &x2, &a); cout << "科目1は" << x1 << "点です\n"; cout << "科目2は" << x2 << "点です\n"; return 0;} //関数addの定義 void add(int *px, int *py, int *pz){ *px += *pz; *py += *pz;}
400 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:53:22 ] 2科目のテストの点数(x1,x2)にa点を加算する関数add()を、ポインタを使って定義しなさい。 という宿題が出たのですが、これで実行したら成功したのですが。 これは無駄過ぎるという所はありませんか? あったら指摘お願いします
401 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 14:55:17 ] 宿題スレに書かずにここに書く辺りが無駄。
402 名前:デフォルトの名無しさん [2008/07/27(日) 15:00:46 ] >>400 まあパッと見pzはポインタにする必要はまったくないな。
403 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:01:49 ] 宿題スレは〜のコード書いてくださいとかだと勝手に解釈してたので こっちの方に書き込んでしまいました。 ご迷惑おかけして大変申し訳ございませんでした。 この場を借りて謝罪いたします。
404 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 15:05:10 ] >>402 指摘ありがとうございます。
405 名前:デフォルトの名無しさん [2008/07/27(日) 17:59:33 ] template<class T, class U> void f(T t, U u) { ... } template<class T> void f<T, int>(T t, int u) { ... } こういうことってできないんだっけ? error C2768: 'f' : 明示的なテンプレート引数を使用することはできません。 って出るんだが。
406 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:01:19 ] <T, int>いらない
407 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:04:36 ] >>406 ありがとうさん
408 名前:405 mailto:sage [2008/07/27(日) 18:07:53 ] template<int I, int J> void f() { } template<int I> void f<I, 0>() { } これは無理? J=0の場合のみ特殊化。
409 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:11:11 ] テンプレート使った際の演算子オーバーロードで悩んでいます。 コンパイルエラーは以下のように出ます。 ------------------------- Test.cpp:13: error: expected constructor, destructor, or type conversion before ‘Test’ ------------------------- このエラーを理解できないため、デバグできません。 どうしたらいいのでしょうか? 教えてください。 ソースは以下。
410 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:12:25 ] // Test.cpp #include<iostream> using namespace std; template<typename T> class Test{ public: T value; Test(){}; Test operator+(const Test& t); }; template<typename T> Test Test<T>::operator+(const Test<T>& t) //←13行目 { Test tmp; tmp.value = value + t.value; return tmp; } int main() { Test<int> test1, test2; test1.value=100; test2.value=200; Test<int> test3 = test1 + test2; return 0; } -------------------------
411 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:15:34 ] Test<T> Test<T>::operator+(const Test<T>& t) じゃない? const Test<T> Test<T>::operator+(const Test<T>& t) このほうがいいかな
412 名前:410 mailto:sage [2008/07/27(日) 18:25:03 ] おお! ありがとうございます m(_ _)m 続けて質問して申し訳ないのですが、 const をつけると付けないとではどのようなちがいがあるのでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:34:16 ] クラスのメンバ変数をポインタ型にすると メンバ変数が定義されていないとか言うんだけど 何これ…
414 名前:413 mailto:sage [2008/07/27(日) 18:41:51 ] 間違えた メンバ変数じゃなくてメンバ関数をポインタ型にすると メンバ変数が定義されていないって出る
415 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:42:39 ] class hoge{
416 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:46:14 ] 直感で static付けたらどうでしょうと言ってみよう
417 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:48:36 ] メンバ関数をポインタ型? メンバ変数をメンバ関数ポインタの型にするって事か?
418 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:54:38 ] >>417 class A{ praivate: int *a; public: void *get_a(); } void A::*get_a() { return a; } aが定義されていない識別子です ってなる
419 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:56:44 ] void* A::get_a()
420 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 18:58:56 ] voidじゃなくてintだった… >>419 解決した。ありがとう!
421 名前:デフォルトの名無しさん [2008/07/27(日) 18:59:27 ] すみません。。。お尋ねしたいのですが、 GDBでUTF-8の内容を表示させるにはどうすればよいのでしょうか? ご存知の方がいらっしゃいましたら何卒ご教授下さい。 よろしくお願いいたします。
422 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 19:37:58 ] TCHAR pString[64] ; std::wcin.getline(pString, 64) ; が入力を待たずに終わってしまいます。 プロジェクトを別に作って試したんですが他ではちゃんと入力を待ってます。 どういう状況の時だと処理を待たずに終了してしまうのでしょうか?
423 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 19:52:06 ] >>422 現象とは関係ないけど、それ、wchar_tかWCHARを使ったほうがいいよ。
424 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:15:58 ] >>422 直前で数値や文字列を入力したときに改行が残ったままになってるとか
425 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:25:08 ] 文字列に指定した文字がいくつあるか調べる関数を作成して、実際にキーボードから文字を入力して文字の個数を調べるコードを書いたのですが。 include <iostream> #include <string> using namespace std; //関数countの宣言 int count(char str[], char ch); //指定した文字数を調べるプログラム int main() { char str[256]; //入力する文字列 char c; //調べる文字 int sum; //文字数 cout << "文字列を入力してください\n"; cin >> str; cout << "探したい文字を入力してください\n"; cin >> c; sum = count(str, c); cout << str << "の中に" << c << "は" << sum << "個あります\n"; return 0; }
426 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:26:14 ] //関数countの定義 int count(char str[], char ch){ int j; //文字列の文字数 int i; int num = 0; //カウントする変数 j = strlen(str); for(i = 0; i < j; i++){ if(str[i] == ch){ num++; } } return num; } これで実行してちゃんとカウントできたのですが、無駄過ぎる文はありませんか? 指摘お願いします。 連投すいません;;
427 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:29:50 ] >>426 sum = std::count( str.begin(), str.end(), c )
428 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:30:22 ] std::string と std;;wstring で template を使って関数を共通化したいんだけど, 文字列リテラル ( "hoge" と L"hoge") や,文字型の違い ( 'a' と L'a') を吸収するには どうやったらいいの? 例えば,バックスラッシュを付け足す場合とか. template <typename string_type> string_type& AddBackSlash(string_type& str) { return str += '\\';//← wstring の場合は L'\\' にしたい, }
429 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:31:09 ] >>427 ありがとうございます!
430 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:37:12 ] >>428 特殊化
431 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 20:58:44 ] おすすめのエディタ教えてください! 今までC言語を始めよう!というフリーソフトを使ってきました
432 名前:428 mailto:sage [2008/07/27(日) 21:13:16 ] >>430 ありがとうございます.特殊化するということはコピペして,wstring に置換して, L を付ける作業をするしかないですかね… template <typename string_type> string_type& AddHoge(string_type& str) { string_type strInternal = "foo"; return str += "Hoge"; } //特殊化 template<> std::wstring& AddHoge<std::wstring>(std::wstring& str) { std::wstring strInternal = L"foo"; return str += L"Hoge"; }
433 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:32:49 ] >>423-424 ありがとうございます、>>424 さんが言われたとおり直前で数値をwcinにて 受け取ってます。それをコメントアウトしたらgetineのとこで処理が 止まりました。 原因はわかったのですがどうやって回避してよいのでしょうか?^^;
434 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:41:25 ] std::vector<double> v(100); このとき確保されるメモリは実装しだい?
435 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:56:05 ] はい。sizeof(double)*100かもしれませんし、*128かもしれません。
436 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 21:57:02 ] >>431 結局は好みだから使ってみて気にいったのを使えよ。 因みに俺はemacs使ってる。
437 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 22:03:18 ] >>426 strlen(str) で文字列の末尾まで '\0' を検索した後に, 再び文字を検索するのが無駄と言えば無駄かも. int count(const char str[], const char ch) { int num = 0; //カウントする変数 while( *str != '\0' ) if( *str++ == ch ) num++; return num; }
438 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 22:08:45 ] int count(const char * const str, const char ch) { unsigned num = 0; for (char const * p = str; (p = strchr(p, ch)) != NULL; ++p) ++num; return num; }
439 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 23:13:07 ] nul終端文字列ってほんと頭悪い仕様だよな。色々非効率だし。
440 名前:437 mailto:sage [2008/07/28(月) 01:14:04 ] >>438 そんなに変わらないだろうと思ってたけど,ずいぶん速いな
441 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 01:34:49 ] >>439 PASCAL stringを授けよう。
442 名前:デフォルトの名無しさん [2008/07/28(月) 02:20:14 ] メッセージプロシジャでWM_CHARが送られてきた時、 OnKeyDownという関数にwpとlpをそのまま渡しています。 そして、押されたキーが"v"だった時だけ処理をしたいのでstrcmpを使ってみたのですが そこで強制終了してしまいます。正しくはどう書いたらよいのでしょうか? 教えてください。お願いします。 OnKeyDown(WPARAM wp, LPARAM lp) { switch(wp) { case VK_RETURN: break; 〜 略 〜 default: if(strcmp((char*)wp,"v") == 0) { //キーがvだった時の処理 } }
443 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 02:26:08 ] >>442 一文字だったら *(char*)wp == 'v' とかでどうなんだろう あとメッセージボックスなんかでwpの中身確認してみたらどうだろうか ついでにこっちの方が回答もらいやすいかもね Win32API質問箱 Build68 pc11.2ch.net/test/read.cgi/tech/1215348804/
444 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 02:31:31 ] >>443 MessageBoxに表示させようと wpをchar*にキャストしたら同じように落ちました・・・ とりあえずそっちで聞いてきます。 ありがとうございました。
445 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:16:35 ] 初心者ですがC言語を覚えるには数学ができないと駄目ですか?
446 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:19:21 ] C言語だけなら算数が出来れば十分 3Dやら暗号やら圧縮やらを扱いたいなら数学が必要になってくるかも
447 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:21:27 ] 446さんありがとうございます。
448 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:29:53 ] C言語で仮に3Dアクションゲームを造るとすると最低限高校1年の数学と物理が理解できればチャレンジしても無謀ではないですか? 数学:sin cos tan(三角関数?)等 物理:ベクトル等
449 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:34:01 ] うん、あと行列がわかってれば 物理演算しようってわけじゃないんだから、完全な理解も必要なし
450 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:39:08 ] ライブラリ使えば自分で計算する必要ももちろんないしね
451 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 13:18:58 ] まぁ行列分かってれば中学生でもできるよ。
452 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:03:08 ] まぁそれをいったら ベクトルが分かっててプログラミングができるなら小学生にもできるよ、って話だけどな
453 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:04:41 ] ベクトルも行列もプログラミングも分からない大学生にはできないといいたい訳だな
454 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:13:46 ] 分からなきゃ勉強するまでさ。 今までだってそうやってきただろ?
455 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:15:05 ] >>454 >>453 に例示されるような人はおそらく勉強しないでしょう
456 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:27:06 ] スレ違いだと思いますが流れ的に質問させてください。 CとC++とwindowsプログラミングを一通り勉強したので 次にDirectXの勉強をしようと思っているのですが、勉強する前に三角関数・ベクトル・行列を復習してから(曖昧なので) DirectXの勉強をしたほうが理解が深まると思うのですがどう思いますか? 先輩方アドバイスよろしくお願いします。
457 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:29:49 ] 先にDirectXのチュートリアルでもやった方が良い
458 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:30:12 ] >>456 目的にもよりますが Direct3D を勉強しながら分からないところを調べるほうがオススメ
459 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:30:21 ] DirectX進めながら解らないところが出るたびに数学の教科書を見るのでも別に構わんとは思う
460 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:33:25 ] 1からやるわけでもないしな。 思い出すのなら必要なことが出てからでも、今やってることが止まることも無いでしょう。
461 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:37:48 ] DirectX=3Dじゃないと思うんだけど
462 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:01 ] >>457 >>458 >>459 >>460 アドバイスありがとうございます。 この夏休みでDirectXの基本をマスターして3Dゲームが作れるようにがんばります。
463 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:45 ] >>461 そうなんですか? 勘違いしていたみたいです・・。 もう少し調べてみます。
464 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:43:38 ] >>461 DirectXの描画は基本3Dじゃなかったっけ
465 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:47:03 ] Drawが葬られたからね。
466 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:48:25 ] 実はDirectSoundだけ使いたい・・・なんてことはないか
467 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:49:42 ] >>464-465 そうだった 昔2D描画用のがあったんだけどもうなくなったんだね あれ結構評判良かったのに
468 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:02:03 ] 今でもDirectDrawは使えるし、地味にアップデートもされてる(もうされないだろうけど) ドキュメントが無くなったけどな
469 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:38:04 ] 引数←読み方インスウだと思ってたけど ヒキスウって最近知った
470 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:16 ] returnされる値は カエリチ?ヘンチ?
471 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:56 ] 返り血
472 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:53:39 ] >>469 どーぞくハケーン
473 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:54:36 ] 独学でやってたってことかな 授業とかでやったら確実に発音するでしょ
474 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:58:05 ] >>470 俺はモドリチ
475 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:00:15 ] 普通、戻り値だよな
476 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:03:54 ] オレも返り値は返り血に聞こえるから戻り値
477 名前:デフォルトの名無しさん [2008/07/28(月) 17:05:45 ] リターンチだろ
478 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:07:41 ] どれも同じだ
479 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:12:31 ] スタックの血を浴びて 〜社会不適応者のデスマーチ奮闘記〜
480 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:37:50 ] 新ジャンル:仕事人間サスペンスホラー
481 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:39:33 ] ああ、よく考えたら俺も戻り血だったわ。
482 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:52:11 ] オレは「戻り値として0を返す」とかいう。 でも「返り値として0を戻す」はいったことないな。
483 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 21:21:23 ] 俺は「返り値として」には違和感がある 返り値を使うなら「返り値をaに戻す/返す/当てる」とかは言う 返り値の値に言及する時は思いつかない
484 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 00:56:44 ] const std::string& GeRefOfFuncStaticString(int n) { static std::string str = boost::lexical_cast<std::string>(n); return str; } const std::string g_strNotFound("NotFound"); const std::string& GeRefOfFuncStaticString2(int n) { static std::map<int,std::string> mapStr; if( mapStr.empty() ) { mapStr.insert( std::make_pair(100, "100") ); mapStr.insert( std::make_pair(101, "101") ); } std::map<int,std::string>::const_iterator itrFound = mapStr.find(n); return itrFound != mapStr.end() ? itrFound->second : g_strNotFound; } int _tmain(int argc, _TCHAR* argv[]) { std::cout << GeRefOfFuncStaticString( 100 ) << std::endl; // 表示: 100 std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない std::cout << GeRefOfFuncStaticString2( 100 ) << std::endl; // 表示: 100 std::cout << GeRefOfFuncStaticString2( 101 ) << std::endl; // 表示: 101 return 0; } map を使った場合の GeRefOfFuncStaticString2( ) は意図した動作になるんですが,たまたまでしょうか?
485 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:24:05 ] >std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない 関数内のstatic変数の参照を取り出してますよ。
486 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:43:11 ] >>485 解答ありがとうございます.恥ずかしながら static に関してすごい勘違いをしていたようです. 初期化が一度しか行われないんですね.以下のようにして GeRefOfFuncStaticString() でも望みどおりの 動作が出来るようになりました. 有難うございました. const std::string& GeRefOfFuncStaticString(int n) { static std::string str; str = boost::lexical_cast<std::string>(n); return str; }
487 名前:デフォルトの名無しさん [2008/07/29(火) 03:24:06 ] a
488 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 07:50:00 ] static変数が緊急対応以外で必要になったときは設計ミス。
489 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 08:06:38 ] 何故static変数にいちいち保存しているのかが謎。
490 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:24:49 ] 便乗質問なんだけど const std::string& GeRefOfFuncStaticString(int n) { static std::string str = boost::lexical_cast<std::string>(n); return str; } これ static のところ、いつ初期化されるんだ? 今までプログラム 起動時(main以前)だと思ってたんだが、nが関数の呼び出し時に 決まるじゃん。 内部で if(関数の初回呼び出しなら){ str = boost::lexical_cast<std::string>(n); } みたいなコードにコンパイルされるわけ? >>484 の挙動見ているとそう見えるんだが…
491 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:36:58 ] >>490 それであってる。 ちなみに初期化についてスレッドセーフである保証は無いので、 マルチスレッドのプログラムで排他せずにstatic変数使ったら、 いつ異常動作してもおかしくない。
492 名前:デフォルトの名無しさん [2008/07/29(火) 10:07:55 ] 標準ライブラリのメンバ関数までが詳細に載ってるページってありますか? 探したけど俺の目が悪いんだろうか、見つかりません;; だれか教えてください もしくは、この質問に答えてください。 istringstreamのオブジェクトに、文字列を代入(?)するとき、 istringstream is(string("abc")); のように初期化ではなくて、あとから代入することはできますか? やり方を教えてください。
493 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:18:55 ] >>491 いつの間にそうなったんだ… 関数呼び出し時に初回判定が入るんじゃあパフォーマンス に悪影響があるだろうが。 func(){ static int a = 100; } は昔どおり初回判定なんか入らないよな?
494 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:34:42 ] >>493 昔から変わってないよ。その int の例でも、関数内で値の変更があったり、 ポインタや参照を外に渡してしまっている場合は初回判定が必要になるでしょ。
495 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:35:44 ] 昔どおりも何も、単に最適化で判定が消えてるだけだろ
496 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:37:38 ] >>495 は>>493 宛
497 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:38:57 ] >>492 istringstream ではなくて stringstream を使ってみては?
498 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:41:57 ] >>492 www.cppreference.com/ www.cppll.jp/cppreference/ msdn.microsoft.com/ja-jp/library/cscc687y.aspx is.str("abc");
499 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:42:21 ] 定数での初期化なら、初回実行時でなくmainの前にされたりするよ。 その辺の最適化は処理系定義。 引数で初期化したら、まず確実に判定が入る。
500 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:07:28 ] std::wofstreamを使ってテキストに書き込む時自動的にファイルの 頭にBOMを追加してくるみたいなものって存在しますか? 自分で先に書くのが普通でしょうか? 自分でFF FE をファイルと開いて書き込んでから wofstreamを使うと先に書き込んだ2バイトが消されてしまい途方にくれて おります・・・・
501 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:09:44 ] 自分で先に書くのが普通。
502 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:18 ] std:ios::app だっけ?
503 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:48 ] >>499 つまり、関数内のstatic変数の初期値が定数じゃない限り、初回確認用のフラグもstatic領域に用意されるわけだな。
504 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:36:53 ] >>501-502 std:ios::appでBOMが残せましたmありがとうございます!
505 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:43:28 ] >>494 一連のレスは理解できるのだが、 > int の例でも、関数内で値の変更があったり、 >ポインタや参照を外に渡してしまっている場合は初回判定が必要 これが分からん。 プログラムロード時にaが100になるでしょ。それで、関数内で 値の変更があったり、 ポインタや参照を外に渡してしまっている 場合はどうして初回判定が必要になるの?
506 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:48:26 ] >>505 例えばこんなケース。 int func(int n) { static int a = n; return a; } int main() { for (int a = 2; a <= 5; ++a) { printf("%d, %d\n", a, func(a)); } return 0; }
507 名前:494 mailto:sage [2008/07/29(火) 12:23:54 ] >>505 変数宣言通過時に初期化されるんなら初回判定が必要かと思ったんだけど、 プログラム起動時に初期化してもいいみたい。 ってことで >494 は間違いで、初回判定が必要になるのは初期値が定数式じゃないときね。 ごめんよ >>506
508 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:13:54 ] 横から失礼します ファイル中のN個の値で、配列a[N]を作りたいんですが うまいやり方が思いつかないので、どなたか教えていただけませんか?
509 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:15:51 ] >>508 mallocの使い方を聞いてるのか?
510 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:19:20 ] malloc( new? ) を使えば出来るんですね。やってみます。
511 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 16:37:39 ] std::vector<型> a(N);でもよいぞ
512 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:48:40 ] ワイマール憲法を構造体で記述せよ という夏休みの課題が出たのですが、何から始めていいかさっぱりわかりません・・・・。 だれか御助けを・・・・。
513 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:49:31 ] イクイク、ワイマール憲法
514 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 19:32:11 ] struct kenpoo { int Y; int O; };
515 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 20:45:26 ] >>512 残念ですが、その課題を出した先生は脳に異常をきたしています・・・。 まともな対話は不可能でしょう。課題の提出は諦めるほかないでしょう。
516 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 21:39:36 ] みんなイクイク、ベルサイユ条約
517 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:07:51 ] ああ、1919か
518 名前:デフォルトの名無しさん [2008/07/29(火) 22:26:11 ] class hoge{ private: std::list<int> foo; public: void setfoo(std::list<int> foo){ this->foo.clear(); std::list<int>::iterator itr; for(itr=foo.begin();itr!=foo.end();itr++) this->foo.push_back(*itr); } std::list<int> getfoo() const{ return foo; } }; int main(){ hoge hoge0; std::list<hoge> hogehoge; std::list<int> tmp; tmp.push_back(1); tmp.push_back(2); hoge0.setfoo(tmp); std::list<int>::iterator tmpitr = hoge0.getfoo().begin(); hogehoge.push_back(hoge0); std::list<int>::iterator itr = (*hogehoge.begin()).getfoo().begin(); std::cout << *itr << "," << *(++itr); } このコードで、最後に"1,2"と表示されて欲しいところが、"0,0"となってしまいます。 どこが悪いのかがわからず困っています。よろしければ教えていただけないでしょうか…。
519 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:30:32 ] ほう、それがワイマール憲法か。なるほど
520 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:34:42 ] getfooの戻り値であるhoge::fooの一時コピーが次の文に移る間までに破棄されてしまうからと、 ひとつの式の中でitrを代入と参照の両方してるから
521 名前:518 [2008/07/29(火) 23:03:49 ] >>520 ありがとうございます。 最後にcoutするところで、itrが無効化してしまってるということでしょうか。 一時コピーが破棄されるタイミングがイマイチわかりません。 たびたびすいません…。
522 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:15:52 ] >>521 完全式の終わりで破棄される
523 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:39:25 ] だれか、C++のえろい人 百聞は一見にしかずだから >>518 のコードを希望通りに動くように修正汁! すまん、俺C++わからんから><
524 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:44:32 ] getfoo()の戻り値を参照型に換えたら?
525 名前:デフォルトの名無しさん [2008/07/30(水) 00:02:27 ] C言語勉強のためにプログラムを作成しました。 が、printf("hello")の時点で壁にぶちあたりました。 正しくコードを入れたはずですが、実行して表示されるのは、 2chアップローダ:www-2ch.net:8080/up/download/1217343270379299.ZNkHRl です。exeと、badが同時に出現するのは何故?さらHELLOが表示されていないのは何故? 「苦しんで覚えるC言語」を参考にやってみたのですが、いきなり苦しいです。 神様助けてください。。。 コンパイラ:Borland C++ Compiler エディタ:CPad for Borland C++Compiler
526 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:17:17 ] さらに std::cout << *itr << ","; std::cout << *++itr; と二行に分けると動く。 その理由は、((std::cout.operator<<(*itr)).operator<<(",")).operator<<(*++itr) というようにちょっと考えるとインクリメント演算子は後から適用されるように思えるが、 インクリメント演算子は副作用完了点に達するまでのどの段階で働いても 構わない事になっているからである。 もっと言えば>>518 の動作は未定義である。
527 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:18:11 ] >>525 なんで start ってするの?compile したのは a.exe とかじゃない? ところでその本には int main(void) 推奨なの?
528 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:19:57 ] start.cをコンパイルしたからstart.exeなんじゃないの
529 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:21:51 ] start.cなんだからbcc32ならstart.exe吐いてくれるはず まあたぶん./startってやったら動くんじゃない
530 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:24:31 ] 例えば #include <iostream> int main() { int i = 1; std::cout << i << ' ' << ++i << std::endl; } のようなプログラムは "1 2" と出力しそうであるが、実際は未定義動作であり、 無理矢理動かすと大抵のコンパイラでは直感に反して"2 2"と表示されるのも 同じ理由による。
531 名前:デフォルトの名無しさん [2008/07/30(水) 00:25:04 ] 読み返して言葉足らずでした。補います。 printf("hello");では上記URLのようにexeと、badが同時に出現し、また何も表記が無い状態でしたが printf("hello\n");では「HELLO」が改行ありで表記されました。 また、printf("%d",100); printf("円\n");では改行ありで「100円」が表記されました。 私の見解では、ただ単に参考にした構文が間違っている(\nが必要だが書かれていなかっただけ) のだと思いますが。。。意見を聞かせてください。
532 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:26:06 ] コマンドプロンプトにstartってコマンドあるから start.exeはまずくない?
533 名前:デフォルトの名無しさん [2008/07/30(水) 00:26:14 ] >>531 printfのあとに fflush();つけたらどうなるかな?
534 名前:533 mailto:sage [2008/07/30(水) 00:27:06 ] いろいろ間違えたごめん忘れてください
535 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:27:24 ] (なぁなぁ、badって何?)
536 名前:デフォルトの名無しさん [2008/07/30(水) 00:32:52 ] あ、startじゃぁまずいですか^^; aに変えました。そしたらbatのみになりました。 参考元URL:homepage3.nifty.com/mmgames/c_guide/index.html しかも、printf("hello");で改行なし「hello」が表示されました。 お騒がせ申し訳ありません。m(--)m参考元さんも申し訳ありません。m(--)m
537 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:42:51 ] unixでtestという実行ファイルを作ってハマった当時の俺
538 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:44:24 ] あるある うん。あるある
539 名前:デフォルトの名無しさん [2008/07/30(水) 00:44:46 ] batやらbadやら恥ずかしいことばかり書き込んでしまいました。 セキュリティーホールがあれば入りたいです。 startをaに変更すると、 www-2ch.net:8080/up/download/1217345861729515.WpasSs な感じになりました。これで夜も安心して眠れます。 >>527 startにしたのは無知だからでした。「手始めにスタート」のつもりでした。 この本というかサイトではそうでした。他のサイトを見てみると他の記述もありましたが、 最初に見たこのサイトの記述で貫こうと思います。 >>532 決定的な回答ありがとうございます。小鳥の1歩ほど前進することができました。 終わりなきC言語を心ゆくまで堪能したいと思います。親切にしてくださってありがとうございます。 >>534 いっしょにセキュリティーホールに入りませんか。 >>535 完全に撃ち間違いです。申し訳ありま栓。
540 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:16:56 ] すいません質問です。 ソラリスでは使えてたのですが、Linuxだとエラーが出てしまってgoogle検索したのですがいい対応策が見つかりません。 newとdeleteは演算子なのですが、 例 string * aaa; というのを.hで宣言し .ccにて コンストラクタでNULLクリア main処理にて値を入れる場合と入れない場合があるのですが、 値を入れない場合に、 デストiラクタでaaaをdeleteしようとすると、落ちてしまいます。 SolarisからLinuxに入れ替えようとしているので、Solarisでは通るのにLinuxでは通らないという事はあるのでしょうか。 簡単にプログラムの例を classで、 string * aaa; を宣言しておき、 コンストラクタで、aaaをNULL初期化します。 mainルーチンで、aaaにファイルから文字列を取得するのですが、 該当しない場合はaaaはNULLのままとなっています。 デストラクタで、 if(aaa){ delete aaa; } とやっているのですが、そこで落ちてしまいます。 よろしければアドバイスお願いします。
541 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:19:23 ] コンパイラはgccです
542 名前:デフォルトの名無しさん [2008/07/30(水) 02:19:37 ] VC++を使用しているのですが、 char ItemObject[1024]; ItemObject = "TEST"; listBox->Items->Add(ItemObject); とするとコンパイルできません。 プログラミング初心者で、どうすればいいのか分からず困っています。 どなたか、助けて下さい。よろしくお願いします。
543 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:20:01 ] delete演算子は対象のポインタが 0 の時は何もしないで 戻るようになっている。 従って if文は不要。原因は他の所にあるのではないか。
544 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:23:19 ] >>542 listBox->Items->Add( gcnew System::String(ItemObject) ) はじめから System::Stringを使え。 それより、このスレはC++/CLIはOKなのかな?C++/CLIはC++とは別物だから明記しておくように。
545 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:28:22 ] >>543 >>delete演算子は対象のポインタが 0 の時は何もしないで >>戻るようになっている。 これは知ってはいたのですが、チェックしてしまうクセがついてしまっています。 >>従って if文は不要。原因は他の所にあるのではないか。 やはり原因は他にあるのですかね。 Soralisで通っててLinuxでは通らないので、規格の違いかと思い質問させてもらいました。 (LinuxはSoralisと比べて厳しいので もうちょっと調べてみます。 アドバイスありがとうございます。
546 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:29:17 ] >>540 クラスも無いのにコンストラクタとか言ってるのがおかしい。ソース晒せ。
547 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:33:41 ] memsetでクリアしてたりする?
548 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:39:30 ] >>546 class hoge{ string * aaa; } mainでaaaに文字列を取得 (ない場合は取得しない hoge::hogeでaaaにはNULLを設定 oge::~hogeで if(aaa){ delete aaa; } としています。 >>547 >>memsetでクリアしてたりする? memsetはやっていないですね。 文字列取得にはc_str()を使用しています。
549 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:42:52 ] >>548 hoge にデストラクタもコンストラクタもねーじゃねーか。 ソースを省くな。問題が再現する完全なコードを貼れ。
550 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:51:20 ] >>549 すいません、完全なコードを張る事ができないので省略してました。 何かしらヒントでもあればと思い質問しました。 SoralisとLinuxの互換性がまだ完全に把握できていないので 分かる人がいればと思い。 もうちょっと自分で調べてみます。解決したら役に立つかわかりませんが書き込みます。
551 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:59:06 ] >>550 問題が再現する最小のコードを作ってもらわないと、エスパーでもなけりゃわからない。 OS間の互換性に原因があると思ってるようだが、どうせ違う。 そういうコード作るのは相談のためでもあるが、基本的な調査の方法でもあるんで、 たいていは作ってる間に自分で気づくんだけどな。
552 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:10:02 ] 全くのあてずっぽうだが、 hogeが意図せずコピーコンストラクタでコピーされてて、 2箇所でaaaがdeleteされているとかないだろうか。 deleteしたばかりで領域が再利用されていない場合に 2回目のdeleteでもエラーにならない処理系は存在する。 Soralisが落ちない処理系で、linuxが落ちる処理系だとすると・・
553 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:19:04 ] >>552 一応gdbでも処理追ってみたのでコンストラクタが2度通ってる事はないみたいです。
554 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:23:12 ] privateでコピーコンストラクタをきってみたら? デフォルトのコピーコンストラクタが使われているなら、 普通のコンストラクタは通らないよ。 stringがstl::stringだったらポインタで持つ意味があるのかは検討したほうがいいな。
555 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:26:42 ] >>554 なるほどprivateもありですね。試してみます。 stringはstd::stringです。
556 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:49:12 ] OSが違ったら通らないではなくて、Solarisではたまたまエラーが 出なくてLinuxではしっかりチェックされて落ちるってオチだろうな。 多分ソースにバグがある。
557 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:01 ] >>556 その可能性大ですね。 Solarisはチェックが甘いからたまたま通ってただけな気がします。 時間あるから作り直そうかな。他にもありそうですし。 元々作った人が逃げて改修まかされて困ったもんです。
558 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:37 ] Solarisはdeleteした領域を触っても落ちないからね。