- 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
- 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++だけ。
- 353 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:16:59 ]
- だから GCC は終ってるから使うなとあれほど・・・
- 354 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:24:54 ]
- 普及していないが、Open Watcomでも使える。
また、標準規格に盛り込まれれば、glibc辺りにも実装されるだろう。
- 355 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:56:24 ]
- 今C言語勉強中なんですけど
本とかサイトとかで一人で勉強してもある程度身につくものでしょうか?
- 356 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:18:27 ]
- 大多数の人は一人で勉強してます
- 357 名前:デフォルトの名無しさん [2007/07/25(水) 14:24:38 ]
- double型をstirng型に変換する方法ありませんか?
- 358 名前:デフォルトの名無しさん [2007/07/25(水) 14:29:55 ]
- double d;
char c[100]; string s; sprintf(c,"%f",d); s=(string)c;
- 359 名前:デフォルトの名無しさん [2007/07/25(水) 14:32:30 ]
- >>358
ありがとうございます。 やはりこの方法しか無いんですね。 itoa()みたいな便利なのあればいいなぁと思ってググったんですが 見つけられませんでした。
- 360 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:36:54 ]
- sprintfの方が数倍便利だと思うが
- 361 名前:デフォルトの名無しさん [2007/07/25(水) 14:38:39 ]
- string dtos(double d){ char c[200];sprintf(c,"%f",d);return (string)c;}
これを先頭へコピペして仕え
- 362 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:40:55 ]
- >>359
itoa()と違って小数点以下何桁、とか指定することが多いと予想されるからな
- 363 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:46:36 ]
- >>356
そうなんですか ありがとうございます
- 364 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:51:02 ]
- とりあえずお約束で
つ std::stringstream つ boost::lexical_cast つ boost::format
- 365 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:58:19 ]
- error C2027: 認識できない型 'name::B' が使われています。
とのエラーで苦しんでいます。よろしければ助言お願いいたします。 ==B.h file========================================= #include A.h namespace name { class B { public: A_Base* const getA_Base() const { return m_a; } private: A_Base* m_a; }; } // name ================================================= ↓続く
- 366 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:58:55 ]
- ==A.h file=========================================
namespace name { class B; class A_Base { protected: B* const getB() const { return m_b; } private: B* m_b; }; class A_Deriv { public: void func() { getB()->getA_Base(); } }; } // name =================================================
- 367 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:00:44 ]
- A_Deriv::func()を実行すると
error C2027: 認識できない型 'name::B' が使われています。 とのエラーが出てきてコンパイルできません。 どうか助言の方、よろしくお願いいたします。
- 368 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:02:58 ]
- A_Derivは
class A_Deriv : public A_Base です、記述ミスですすみません。
- 369 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:09:31 ]
- >>364-368
A.h を頭から順に読んでいったコンパイラさんは、 メソッド B::getA_Base() の存在を知ることができない。
- 370 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:16:33 ]
- クラス定義の中で関数を定義すると、
クラス定義の直後にinline付きで定義されたものとして扱われる。 つまりA_Derivはこう書いたのと同じに扱われる。 class A_Deriv : public A_Base { public: void func(); }; inline void A_Deriv::func() { getB()->getA_Base(); } ところが、この時点ではclass B;という前方宣言しかないため、 Bに関する具体的な情報がわからない。それで367のエラーになってしまう。 解決するには、A_Deriv::funcの定義をBの定義より後に回せばいい。 例えば、A.hとB.hをインクルードするcppファイルでA_Deriv::funcを定義したり、 A_BaseとBを同じヘッダで定義して、そのヘッダの一番下に インラインでA_Deriv::funcを定義するなどの方法がある。
- 371 名前:365 mailto:sage [2007/07/25(水) 16:17:52 ]
- >>369
>>370 早速の返答ありがとうございます。 かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。 そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした) とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!
- 372 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:01:38 ]
- >>353
どこのGCCの話をしてるんだ? Win以外じゃ主流なんだが・・・
- 373 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:05:11 ]
- >>372
かわいそうな子に触らないで
- 374 名前:353=372 mailto:sage [2007/07/25(水) 18:22:02 ]
- つまらん。もっと面白い突っ込みしろよ
- 375 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:01:38 ]
- 質問なんですが、配列には最後の要素に必ずナル文字(\0)が
入らないといけないんですか?
- 376 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:05:27 ]
- 文字列なら
- 377 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:08:49 ]
- >>375
ぬるぽ 文字じゃなければ別に\0入ってなくていい。 文字列だと文字の終わりがわからんから。 文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの
- 378 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:19:54 ]
- みらいなみらいなけーの
- 379 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:13:10 ]
- らめぇー
- 380 名前:デフォルトの名無しさん [2007/07/26(木) 11:42:25 ]
- VC.NET2003で
mkstemp() が使いたいのですが、どうしたらいいでしょうか?
- 381 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 11:59:03 ]
- >>380
それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。
|

|