- 1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 252 名前:205 mailto:sage [2007/07/23(月) 03:55:59 ]
- >>228 が正しいんだからもう終わりにしようぜ。
俺も言い方が悪かった。
- 253 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 13:48:26 ]
- ヌルポインタを使ってメンバ関数を呼ぶとどうなるかは未定義と聞いたことがあります。
でも、規格票を読んでもこのことがどこに書いてあるのか見つかりません。 どこに書いてあるのかご存知の方はいますか?
- 254 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 13:55:25 ]
- 未定義って意味知ってるか
- 255 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 13:56:11 ]
- ワラタ
- 256 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 14:02:02 ]
- 規格票に全く書いてない事か、あるいは規格票に未定義と明記されている仕様の事。
- 257 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 16:07:43 ]
- 居ないなら居ないと返事しろ
- 258 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 16:28:49 ]
- 規格票読んだ事ないのか?
「〜は未定義である」って書いてあることもあるんだぞ?
- 259 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 16:38:21 ]
- 規格票(?)もいいけど、>>256も読もうな
- 260 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 17:18:48 ]
- 規格票にちゃんと書いてるかもしれないってことだろ。
- 261 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 17:24:04 ]
- だったら>>253に場所を教えてやれよ。
>>253は未定義も全部書いてあると思ってるみたいだし。
- 262 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 17:36:19 ]
- 場所知らんもんよ。
- 263 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 17:45:20 ]
- 居ないなら居ないと返事しろ
- 264 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 18:02:16 ]
- 規格書を見てみたがたしかにヌルポインタの使用については見当たらないな。
一番関係ありそうなのが、3.8 オブジェクトの生存期間。 3節目の「この規格全体を通じて、オブジェクトの特性についての規定は、 生存期間中のオブジェクトに対してだけ適用される。」という一文を見付けたので精一杯。
- 265 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 18:09:07 ]
- 今はこれが精一杯
- 266 名前:デフォルトの名無しさん [2007/07/23(月) 18:44:02 ]
- 日本語コードを判別して一行よみたいんですけど
UTFがよめないです なぜか全角と機械語みたいなのが入ります どうすればいいんでしょうか 英数字のみのテキストなんですが
- 267 名前:デフォルトの名無しさん [2007/07/23(月) 18:47:51 ]
- 英数字のみでも、UTFとそうでないコードで、文字種が変化するでしょうか??
- 268 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 18:48:08 ]
- どんなデータをどんなソースで読んだんだ
- 269 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 18:49:23 ]
- UTFだけ書かれても、その後ろに数字が続いてるし、それが何種類もあるんだぜ
- 270 名前:266 [2007/07/23(月) 18:58:11 ]
- kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4725.txt
これなんですが UTF16でないと読めません
- 271 名前:266 [2007/07/23(月) 19:00:01 ]
- 一行目の先頭に機械語みたいのが入っています・・・UTF16の特徴なんですか?
- 272 名前:デフォルトの名無しさん [2007/07/23(月) 19:04:21 ]
- もしくは、ファイルの文字種を判別して、例えばシフトJISに変換する
DLLやSTLなどありませんか???
- 273 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 19:05:58 ]
- >>271
見てないけどBOMじゃないかな?
- 274 名前:デフォルトの名無しさん [2007/07/23(月) 19:08:05 ]
- 自己解決しました
nkf32.dllを通す事にしました www.vector.co.jp/soft/win95/util/se295331.html
- 275 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 19:11:31 ]
- ICUとか
- 276 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 19:13:51 ]
- WinでいいんならMultiByteToWideCharとか
WTL使っていいんならCA2Wに渡すだけでおk
- 277 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 19:15:29 ]
- >>264
なるほど・・・。 ヌルポインタを使った場合はオブジェクトが存在しないから、 メンバ関数呼び出しに関する規定はヌルポインタを使った場合には適用されない・・・と。 確かにそう考えることもできそうな感じではありますね。
- 278 名前:デフォルトの名無しさん [2007/07/23(月) 19:21:10 ]
- >>276
汎用性が良くなるため、MultiByteToWideCharでいきます サンクス!
- 279 名前:デフォルトの名無しさん [2007/07/23(月) 21:05:00 ]
- socketを使用してのUDP通信で
自分で定義した構造体を送受信したいのですが sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています どうすればできるのでしょうか
- 280 名前:デフォルトの名無しさん [2007/07/23(月) 21:06:29 ]
- socketを使用してのUDP通信で
自分で定義した構造体を送受信したいのですが sendto()/recvfrom()関数はchar配列を送受信するための引数を持っています どうすればできるのでしょうか
- 281 名前:デフォルトの名無しさん [2007/07/23(月) 21:07:45 ]
- 2連投稿すいません。エラーですorz
- 282 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 21:59:54 ]
- >>253
www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
- 283 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 22:15:28 ]
- >>280
何でそういう質問をするのか、まずはっきりさせましょう。 キャストを使ってダメだったということ? それとも(char *)型に直す方法が分からなかったってこと?つまり、キャストを知らなかったということ? それとも(char *)に直せたけど、受け取り側で値が変になったということ?
- 284 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/07/23(月) 23:07:57 ]
- >>224
>>229 LRUのサンプル ↓ blogs.yahoo.co.jp/mocchi_2003/34182175.html
- 285 名前:デフォルトの名無しさん [2007/07/23(月) 23:26:11 ]
- キャストすることで送信することはできましたが、
受信するときに実行時にエラーがでます。 受信するとき、受信されたデータはchar[]に入るようになっています。 char recvdata[1024]; recvfrom(socket, recvdata, sizeof(recvdata), 0, ......); char*で宣言すると、実行時にエラーがでます。
- 286 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 23:29:41 ]
- >>285
送信してから受信するまでの間に領域が開放されたりしてない?
- 287 名前:デフォルトの名無しさん [2007/07/23(月) 23:43:12 ]
- >>286
それはどういう意味ですか??
- 288 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 23:48:11 ]
- >>280=285
まず、構造体のアライメントを調べたか? 送信側のマシン・・・アライメント4byte struct X { char a; // 1byte + 3byte(4byteになるよう調整) long b; // 4byte } x; sizeof(x) = 8 受信側のマシン・・・アライメント2byte struct X { char a; // 1byte + 1byte long b; // 4byte } x; sizeof(x) = 6 これでは受信側は混乱する。 (char *)で宣言するのは全く問題ない。malloc等でメモリを確保していれば。
- 289 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 23:51:07 ]
- >>287
>>288が詳しそうなんでそっちにまかせた! socketってのを使ったことがないんで憶測ですまん。 構造体をローカルのchar配列に入れてsendto呼んで、 送信関数終了時にchar配列が開放されて受信側があぼーん。 とかなのかな?って思ったんだが、sendtoの仕様次第じゃ問題ないな。
- 290 名前:デフォルトの名無しさん [2007/07/24(火) 00:08:25 ]
- >>285
構造体の大きさは同じでした。 mallocしたことでエラーはでなくなりましたが、値が変わってしまいます。 struct Test{ int a; char c; }; で、aに0をいれて送信すると、受信後は3801416となってしまいます
- 291 名前:デフォルトの名無しさん [2007/07/24(火) 00:20:47 ]
- sendto(SOCKET s, const char *buf, int len, int flags, const sockaddr *to, int tolen);
で、第三引数にstrlen(data)を渡してたのが問題だったみたいです。 sizeof(Test)にしたら問題なく送信できました。 が、受信したあと、char*型に入ってる受信データをTest型の変数に代入できません。 dataがchar*型で、 ((Test*)data)->a とするとちゃんと値を得ることができます。 Test t = (Test)*data;とすると、charをTestに変換できないとエラーがでます。 Test *buf = (Test*)data; Test t = *buf; とすると、tの値が狂います
- 292 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 00:25:41 ]
- memcpyでいいんじゃまいか?
- 293 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 00:27:18 ]
- >>291
buf->aの値は?
- 294 名前:デフォルトの名無しさん [2007/07/24(火) 00:37:31 ]
- memcpyでできました!!
ですが、もう一つ問題が浮かび上がってきました。 Test構造体の、aの値は狂わずに受信できてますが、cの値が変わってしまいます。 何を代入しても、送るとxになります。
- 295 名前:デフォルトの名無しさん [2007/07/24(火) 00:39:12 ]
- cout << ((Test*)data)->c;で表示しても同じでした
- 296 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 00:39:20 ]
- まてまて、どんな構造体かくらい示してくれ。
- 297 名前:デフォルトの名無しさん [2007/07/24(火) 00:43:05 ]
- >>296
>>290でうpした struct Test{ int a; char c; }; です
- 298 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 00:46:38 ]
- >>297
>288が居なくなってかなり心細いんだが、socket知ってる人いねぇの?w 構造体のアライメントが悪さしてるようにしか思えないんだけど、 それは大丈夫だったんだよね? int a; char c[4]; だったらどうなるの?
- 299 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 01:06:14 ]
- アーキテクチャやコンパイラの違いなどを考慮すると、基本的に
ネットワークでの送受信に構造体を直接使うのは薦められないのだが、 それについては言わないことにする。 ・recvfrom()の第3引数(len)はsizeof(Test)になっているか? ・同じく、memcpy()の第3引数はsizeof(Test)になっているか? ちなみにmemcpy()は無駄だ。 Test test; recvfrom(s, (char*)&test, sizeof(test), 0, &addr, &addrlen); のような感じで良い。 char data[sizeof test]; に受け取った場合は、 Test *testp; testp = (Test*)data; でよい。
- 300 名前:299 mailto:sage [2007/07/24(火) 01:18:28 ]
- すまん。
> testp = (Test*)data; アーキテクチャによってはバスエラーになるな。 char[]で受け取りたいなら、 union { data[sizeof(Test)]; Test test; } u; などとして、u.dataに受け取ってu.testを使うほうがよいだろう。 正確には規格準拠ではないが。 それを考えれば、やはりTest型で直接受けるほうがよい。
- 301 名前:デフォルトの名無しさん [2007/07/24(火) 01:30:47 ]
- しょうもない質問で申し訳ないのですが、
スタックダンプって 「メモリのスタック領域に記憶された変数や関数のアドレスを 吐き出すことって」 であってます??
- 302 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 01:33:05 ]
- アドレス吐き出しても意味なくね?ってかmapファイルじゃん。
吐き出されるのはそのアドレスのデータじゃないのか?
- 303 名前:デフォルトの名無しさん [2007/07/24(火) 01:49:27 ]
- >>302
ありがとうございました。えーと、吐き出されるのは スタック領域のアドレス 呼ばれる関数名 呼ばれる関数のアドレス てな感じですか?
- 304 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 01:52:34 ]
- >>282
それを参考に辿ってみたら、こんな質問を発見しました。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315 ここでは 9.3.1 で明確に未定義と述べられているとしていますが、 個人的には 9.3.1 は根拠とするには薄い気がします。 その後に書いてある左辺値→右辺値変換の方が明確な根拠に思えます。 p->f() は (*p).f() に変換され、. の左項は右辺値であることから、 左辺値から右辺値への変換(ヌルポインタの参照)が行われ、結果未定義動作となる、 という流れの方が自然なのかなあ、と。 情報ありがとうございました。
- 305 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 02:13:49 ]
- >>303
スタックダンプって↓みたいなやつだよね? 0241fb0c 5d b6 a0 03 f0 62 75 02 - d0 e7 3d 0a 00 6e 40 00 ]....bu...=..n@. 0241fb1c 00 00 00 00 24 fb 41 02 - 2e bf 98 03 00 00 00 00 ....$.A......... 一般的にスタックに詰まれるのはローカル変数、関数の引数・戻り値、関数の戻りアドレスとかかな? とはいえ、最適化されたら何がどういう順番で詰まれるかなんてアセンブラ見ないとわかんなくなるよ。
- 306 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 04:22:18 ]
- スタックダンプという言葉を使った人に聞いてくれよな。
Javaとかのstacktraceとはまた違いそうだし。 で、sendtoのバッファのアドレスをわざわざchar*にキャストしてるのは何なんだいったい。 void*を受け取るんだから、そのまま渡せよ。 memsetする時にmemset((char*)data, 0, sizeof(data))とかするバカいないだろ。
- 307 名前:デフォルトの名無しさん [2007/07/24(火) 10:21:35 ]
- >>306
sendto(SOCKET, char*, int, ........)だよ sendtoはvoid*使わない
- 308 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 10:25:09 ]
- socketインタフェースってデザインが古いんだよな。
void*が適切に使われていないから、いたるところで (struct sockaddr*)とかやらないといけないし。
- 309 名前:デフォルトの名無しさん [2007/07/24(火) 15:33:36 ]
- 質問があります。
マイクロソフトのVS2003.NET C++なのです。 VS2005のC#では Debug.Print("debug"); というデバグ表示ができますが、これに相当するものはあるでしょうか? 知ってる方、ご教示願います。
- 310 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 15:42:34 ]
- OutputDebugString
- 311 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 15:45:05 ]
- >>309
>>310のOutputDebugStringはAPIだからどこでも使えるけど MFC使ってるならTRACEマクロが簡単。
- 312 名前:309 [2007/07/24(火) 16:26:49 ]
- >>310-311
どうもありがとうございます。私とても助かたです。 MFCは使っていないためTRACEマクロは使用できませんでしたが、OutputDebugStringの 方は使うことができました。こちらを使用したいと思います。 OutputDebugString(_T("HOGE\n"));
- 313 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 16:27:45 ]
- 外人さん?
- 314 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:54:01 ]
- グローバルと無名名前空間に同一の名前があるときそれらを識別する方法にはどういう手段がありますか?
あるいは、 int foo; namespace { int foo; } のときグローバル、無名名前空間それぞれのfooを指定するために用いる構文が知りたいのです
- 315 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:03:07 ]
- >>312
MFC とは無関係な _RPT0, _RPT1,_RPT2,_RPT3,_RPT4 というマクロもありますよ。
- 316 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:04:53 ]
- >>314
ない。 そもそも、そんな同じ名前の変数をみだりに宣言するのはどうかと思う。 どうしても作りたいなら、も1つ名前空間作れ。 int foo; namespace { namespace Local { int foo; } }
- 317 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 21:09:52 ]
- eclipse3.3の更新サイトでついてくるCDT,コンパイラはCygwin使っています。
\a(ビープ音)などのエスケープシーケンスを使ったとき、普通の動作をせず、 コンソールに□とだけ表示されるので、エスケープシーケンスを利用した プログラムが上手く作れずに困っています。(何故か\nは上手くいく ググったり、設定をいじくり回したり色々やってみたのですが、解決できません。 普通の動作をさせるようにできるんですか?もしできるなら教えてください。
- 318 名前:デフォルトの名無しさん [2007/07/25(水) 00:32:11 ]
- string型をwchar_t に変換できませんか??
- 319 名前:デフォルトの名無しさん [2007/07/25(水) 00:33:04 ]
- C++でこういうコードがあったんですが・・・・
class CDialog { public: CDialog(): hDlg(0) {} 最後のところがわかりません。コンストラクタ? なんで空メソッド?
- 320 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 00:35:27 ]
- hDlgを0で初期化してんじゃねえの
- 321 名前:デフォルトの名無しさん mailto:age [2007/07/25(水) 00:35:32 ]
- ニコフォトオールスター
www.freewebs.com/nicophoto/?/@
- 322 名前:デフォルトの名無しさん [2007/07/25(水) 00:40:44 ]
- >>320
なるほど。hDlgってのはHWND型なんでそうかもしれません。 しかし、こんな記述法あるんですか?
- 323 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 00:42:49 ]
- >>322
あるよ。コンストラクタで入門サイトめぐってみては? ところで、この書き方って一般的なの?俺は{}内に書くことが多いんだが。
- 324 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 00:44:06 BE:268527762-2BP(30)]
- effective c++まじオススメ
- 325 名前:デフォルトの名無しさん [2007/07/25(水) 00:48:47 ]
- >>323
なるほど、コンストラクタ初期化子っていうんですね。初めて知りました。僕の見た限りでは初期化数はみんな( )内に書いてるようです。
- 326 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 00:49:04 ]
- >>323
極めて一般的に使われる。 HWND(基を辿ればポインタ型)のような組込型ではどうでもいいが、 クラスオブジェクトの場合、こうでしか 非静的メンバのコンストラクタを呼び出せないので大変重要。
- 327 名前:デフォルトの名無しさん [2007/07/25(水) 00:52:43 ]
- すみません
全く出来ません tring型をwchar_t に変換する方法教えてください
- 328 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 01:04:47 ]
- 標準C++ライブラリだけでやるならこのページの一番下の
hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html おまけが参考になる。 hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
- 329 名前:デフォルトの名無しさん [2007/07/25(水) 01:14:51 ]
- あのexeファイルを実行するにはどうしたらいいんでしょうか
- 330 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 01:16:40 ]
- どのexeファイル?
- 331 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 01:25:05 ]
- CreateProcess() @Win32
fork(),exec() @Unix
- 332 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 01:43:15 ]
- >>326
スマン、いろいろ回ってみたがわからん部分が多々でてきたOTL コンストラクタ初期化子を使う1つの理由としてデフォルトコンストラクタ以外を 使用してメンバ変数を初期化したい場合に必要ということでいいのかな? あと、参照メンバ変数がコンストラクタ初期化子でしか初期化できないという 理由もよくわからんかった・・・まだまだ修行が足らんようです。
- 333 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 02:08:21 ]
- 初期化後の参照変数へのoperator = は、
全部参照先へのオブジェクトコピーになるから、 初期化後に参照先を変えることはできないってこと
- 334 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 02:22:35 ]
- >>333
なるほど。 参照をポインタの延長として理解しようとするからダメなんだよな。 int *p = NULL;として初期化時は何も指していないポインタに後でアドレスを代入する というのは参照では出来ない。 参照変数は宣言と同時に初期化する必要がある。 宣言時に初期化しなければいけない理由等が>333のとおり。 メンバ変数の場合は、その初期化にコンストラクタ初期化子を使用する。 というよりそこで初期化しなければならないし、そこでしか出来ない。 語弊があるかもしれんがこんな感じかな。
- 335 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 02:33:22 ]
- 配列の初期化もやらせてくれるといいんだがなぁ…。
- 336 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:10:33 ]
- 変数宣言時に
array[8] = {0} は 初期化ができるのに array[2][4] = {0} とすると、怒られる 2次元以上の時に初期化しようとすると 怒られるのはどうしてですか?
- 337 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:16:59 ]
- >>336
エラーメッセージは何て言ってる?
- 338 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:23:30 ]
- >>334
参照に限らず、メンバ変数の初期化はコンストラクタ初期化子でしかできない。 これを理解するためにも、まともに C++ を使い続けるためにも初期化と代入の区別を しっかり理解する必要がある。
- 339 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:24:55 ]
- 代入エラー 的な文か 無効な演算子hoge だったかと思います gccで
- 340 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:28:16 ]
- >>339
それ、初期化じゃなくて代入してるんじゃね?
- 341 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:36:30 ]
- いやでも変数宣言時にそうしたら怒られてた気が・・・
- 342 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 03:46:25 ]
- >>341
こんどはちゃんとエラーメッセージもいっしょに持ってこようね。
- 343 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 06:04:20 ]
- >>336
array[2][4] = {{0}, {0}};
- 344 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 06:20:34 ]
- 参照をいろんな感じで使ってみたんですが、よく分からないことがありました。
この場合 int i = 123; int &r = i; int &rr = r; rr = 456; std::cout << i; 自分が考えていた通りに「456」が表示されますが、以下のようにconstを付けると int i = 123; const int &r = i; int &rr = r; rr = 456; std::cout << i; 「123」が表示されます。 自分は int &rr = r; の行でエラーにでもなるのかなと思ってたんですが。 なぜ const を付けるか/付けないかだけで、このように変化するのか分かりません…
- 345 名前:デフォルトの名無しさん [2007/07/25(水) 06:29:40 ]
- >>344
constは変更できないって意味だからでは むしろrr=456でエラーがでそうだけど、 そんな後付け参照までフォローはしないのかな
- 346 名前:344 mailto:sage [2007/07/25(水) 06:33:35 ]
- >>344の結果はBCBです。
VC++とg++で試してみると、両者ともエラーになりました… エラー内容は「int &rr = r; のところで const int & から int & にできない」という感じでした。 BCBだと [C++ 警告] Unit1.cpp(12): W8028 'rr' を初期化するために一時変数を使用する っていう警告が出ました。 BCBが特殊なのかな…
- 347 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 08:18:53 ]
- >>346
Borland のが腐ってる。
- 348 名前:317 mailto:sage [2007/07/25(水) 08:59:52 ]
- あれから色々調べてみたんですが、特定のエスケープシーケンスの文字化けは
CDTに限ったことでは無いようです(OSの問題かな?)まあ色々分かったので もうちょっと調べていこうと思います。cの問題では無かったですね;すみません。
- 349 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 09:00:19 ]
- だから BCB は腐ってるから使うなとあれほど・・・
- 350 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 09:06:13 ]
- const 参照を使うと
const int& r = 1; といったことができるが、 この時はテンポラリオブジェクトが作られて、それへの参照が作られる。 昔は const なしでもこういうことができることがあった。 規格がまだ整理されてなかった時代だったからなのか、独自の拡張だったのかは知らんが。 ここではそれが起こってるんだろう。
- 351 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 12:16:56 ]
- 質問です。
fopen_sってGCCみたいなVC以外の環境でも普及していて普通に使えるのでしょうか?
- 352 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:08:38 ]
- >>351
ぜんぜん普及してないです。VC++だけ。
|

|