1 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:10:55 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.68【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1253193779/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
892 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 14:52:56 ] deleteしてもメモリ返せないの?なんで?じゃあどうすんの?
893 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 15:02:56 ] >>892 マジレスはしてあげないよw
894 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 15:03:31 ] どうもしない newしたときに再利用されるだろうな
895 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 15:34:47 ] サンプルをシンプルにしたいからって理由で無茶すんなよなぁw リーク検出とか使えなくなりそうだしなぁ
896 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 16:12:06 ] >>893 無知は黙ってろハゲ
897 名前:852 mailto:sage [2009/11/19(木) 19:05:22 ] 物議を醸していますね^^; 作者の方は東大を出ておられますが、地頭が良いとこういう考え方になるのでしょうか・・・ ともあれ、今はnew、deleteはセットで書くよう心がけたいですね。
898 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 19:44:29 ] deleteするしないはコードの本質でないと判断したんだろう。 まぁ論文ならそれでいいんだろうが、一般向け、しかも初心者が食いつきやすいゲームプログラミングの書籍で それをやると何も考えずに模倣する馬鹿が出てきてしまうから、やめた方がいいと思うがな。
899 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 19:46:38 ] メモリリークしてたらだめだ 実測しむ
900 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 19:49:53 ] 1Mのメモリーリークが100回起これば100M消費する プログラムが終了すればOSが回収するが、 動いている間はそのまま。
901 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 21:10:32 ] 東大出てても糞コード書く奴はどうしようもないよ しかも学歴が高いせいで自信だけはあるから逆にめんどい
902 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 21:34:57 ] Cなら終了時まで解放しないメモリをfreeしないっていう層は結構いるから その亜流なんだろう
903 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 22:48:47 ] >>897 もちろんnew/deleteをセットで書いてもいいが それよりスマートポインタを使うんだ
904 名前:852 mailto:sage [2009/11/19(木) 23:01:20 ] >>903 COMでCComPtrを使ったことがあって、めちゃくちゃ便利でした。 自前のを作るとなると・・・うまく組めるかちょっと心配です(汗) でも便利なのはたしかなので、勉強してみます。 ありがとうございます。
905 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 23:04:08 ] shared_ptr < ・・・
906 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 23:36:09 ] BCB5+Win環境です char配列などを頻繁にnew・deleatする際、どっかのサイトで win環境では固定サイズでnewしたほうが断片化しにくいと 書いてあったような気がするのですか 本当でしょうか? あまりnewをいじりたくないので気になります
907 名前:852 mailto:sage [2009/11/19(木) 23:45:36 ] >>905 おおお! こんな便利なものがあったのですか! VC++2008ならstd::で使えるそうですが、自分は2005ですね・・・ しかし、boostを導入すれば使えますね。 CComPtrと同じように使えるのであれば、慣れていますし、導入もし易そうです。 教えてくださって、ありがとうございました!
908 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 23:54:42 ] std::multimap<int, int> test; test[0] = 1 test[0] = 2 test[0] = 3 ...いろいろ代入... としたときに、 std::multimap<int, int>::iteartor begin = test.lower_bound(0); std::multimap<int, int>::iteartor end = test.lower_bound(0); std::multimap<int, int>::iteartor it; for (it=begin; it!=end; ++it) printf("%d", it->second); で得られる結果は必ず 1, 2, 3 の順番になると保障されていますか?
909 名前:デフォルトの名無しさん mailto:sage [2009/11/19(木) 23:56:21 ] std::multimap<int, int>::iteartor end = test.upper_bound(0); でしたすみません
910 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 00:10:27 ] されてません。
911 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 01:05:18 ] >>906 new の回数を減らせば断片が減る(断片化しにくい)のはあたりまえ。 それ以前に、ほんとうに断片化による悪影響で困ってるのか? Windows 上では、特にギガバイト単位のメモリ空間(アドレス空間)があたりまえな 最近の一般的な環境ではかなり稀なケースになると思うんだが。
912 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:12:17 ] >>901 実際に動作させるコードでdeleteするしないの問題と、解説書でdeleteを省略するしないの問題を 区別できていないお前は多分低学歴なんだろうな
913 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:13:44 ] 実際に動作させるコードからかけ離れたコードを提示する解説書がそもそも問題 削っていい部分とそうでない部分があるが、こういうのを削っていいと思うようなら 糞コードと言われても仕方ない
914 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:15:13 ] ま、万人向けの本でやっちゃだめだよな。
915 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:17:50 ] ぶっちゃけこんなアホなコードを本気で擁護する奴なんて本人以外いるの?w
916 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:28:12 ] >>912 省略したほうがシンプルでいいと思ったけど結局は言い訳がましい Q&A を書くハメに なったってことで、解説書のための判断としても失敗だろ。 紙面の問題を考えても、 std::vector 使っとけば #include が1行増えるかもしれないって 程度だし。
917 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 02:38:29 ] まぁ、全てを綺麗に書くことが正義という言語でもないし、本当に必要ならば手を汚す こともあるけどな。>>884 は手を染める理由としては全く不足だと思うが。 とりあえず買っちゃいけない類の本ではあるな。良い初心者は混乱し、悪い初心者は 汚れる。中級者以上なら他に投資すべき本があるだろう。
918 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 03:10:28 ] 確保したハンドルやリソースを開放しないままプログラムが終了しても 言語やOSの仕様でプログラム終了時に確実に回収することがわかっていて かつ、リークしないこともわかっているなら、別に開放しないまま終わってもいいじゃないか。^^ たとえば、 int main() { int* i = new int; } 上のプログラムはメモリリークしていない。 なぜなら、ポインタが消失して削除不能になるのはプログラムが終了する瞬間であり その直後にはすべてのリソースが回収されることが仕様で決まっているからだ^−^ 美学とかいうなら別だが。
919 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 03:28:08 ] classのお作法を守ってないからでしょ。後で書いた方?は直してるみたいだし
920 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 03:37:02 ] あえてdeleteしない、なんて初心者向け解説本でやるべきじゃないよな。 「3D格闘ゲーム」ってことだから、おそらくキャラクタ2体分のオブジェクトを作って プログラム終了まで開放しない、みたいなコードだと思うんだけど、 読者がそこから拡張していこうとした途端にメモリリークを起こす気がする。
921 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 06:08:35 ] 繰り返しのnewがでたらやばいんだって。
922 名前:852 mailto:sage [2009/11/20(金) 08:12:39 ] この本はdelete問題の他にも、ちょっと「?」というか、もっと効率的な方法があるのでは?と 思ってしまうようなところもあるのですが、 アニメーション付Xファイルの読み込み、およびそれをゲーム中でアニメーションさせるところの 解説はものすごく参考になっています。 今までいくつかのWebサイトでそれを解説しているところも見てきましたが、 この本の内容が一番分かり易かったです。 アニメーションのための本質的なところ(動作、仕様レベル)だけ抽出して、 実装に向けたクラス設計や仕様は自分で改めて考えてからコーディングしていったら良いと思いました。
923 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 09:00:43 ] 分かりやすいように見えても、どこに罠が仕込まれてるか分からんのではなぁ
924 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 09:06:43 ] 糞コードを本にして売るほうも、本に書いてあるコードを吟味せずにそのまま使うほうもアホ
925 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 09:12:37 ] Amazonレビューを見たら、そのアニメーションの解説も参考にするとまずそうな 雰囲気に見えるが… まぁ、買っちまったら何とか活用したいんだろうけどなぁ… つーかサンプルプログラムの作り方もひどそうだ ゲームがコマンドライン引数でviewerに変わるらしいが、やってみたくてやっちゃった のかな、使い勝手とか全然考えずにw もちろん「コマンドラインの処理サンプルを入れたかったので」とか言い訳はいくら でも思いつくが
926 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 10:25:39 ] DLLとEXEでは使ってるアドレス空間が違うとのことなんですがポインタがどっちのアドレス空間に属しているかしらべる方法はありますか?
927 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 11:15:06 ] >>918 そういう特殊な事例でしか当てはまらないものは 特殊な例としてあげればいいんだよ。 int foo() { int* i = new int; } 関数名を変えただけで、この処理はリークしているかもしれない。 int main() { MyClass* i = new MyClass; } クラス名を変えただけだが、delete時にファイル削除とかしているかもしれない。 な? コードは修正されるもの。 そういうときに自分で罠を仕掛けてどうする。
928 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 11:33:29 ] >>926 できるでしょうね
929 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 11:44:16 ] 連続稼働させるものや、多くメモリ確保する物では メモリリークは致命的。 512K確保する関数を200回呼び出せば、合計で1ギガ消費する。 deleteしないでこれを放置するやつは超初心者
930 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 11:45:57 ] ブラウザはよくリークする
931 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 13:23:01 ] >>918 それはメモリリークだよ。 もう使わないからdeleteしていいのにdeleteしないままプロセス終了を迎えたら、それはメモリリーク。 「プロセス終了時に把握できているメモリリークがあっても特に問題無い」には反論しないけど、 「リークじゃない」はおかしい。 そのプログラムがメモリリークしてないなら、メモリリークしてるプログラムなんてこの世に無いよ。
932 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 13:44:20 ] 目立ってメモリリークしなければ無視でも良いけどね。 たとえば、4バイトのメモリリークで128M=2^24バイトたまるには、 400万回やらないといけない。 10秒に一回起こったとしても、400万回するには一年半ほどかかる。、
933 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 14:14:47 ] まぁ、習慣的にリーク対策しないと、大事なとき忘れるし、コードの再利用したときも不具合を生みやすい。 俺は基本的にnewしないでスタックに確保するから、そういう問題はほとんどないな。 はやくスマートポインタが使いたいぜ。
934 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 14:18:40 ] vcでメモリリーク検出できるからそれでいいよ。 わずかに残ったとしても致命的にはなりにくい。 なったら変更すればいいし。
935 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 14:25:54 ] シングルトンな奴は基本 delete しねぇなぁ、俺は。
936 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:10:46 ] new deleteはコンパイラ依存していますか? 別のコンパイラで確保したメモリを、VCでdeleteは出来ませんか?
937 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:27:03 ] >>936 別のコンパイラどころか、同じコンパイラでも異なるDLLでnewしたオブジェクトをdeleteすることは 原則としてできません。(MFCの拡張DLLは別)
938 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:34:39 ] new deleteはオーバーロードだってできるからな。 あえてやるひとはいないだろうけど、 自分以外誰にも使えないnewの実装だってありえる。
939 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:37:30 ] そうだったんですか。 そうだとすると、DLLがメモリ確保してリターンしたら解放不可能になるんですか。
940 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:40:48 ] んなこたーない メモリを確保する関数 と 確保したメモリを開放する関数 を用意しときゃよい fopen() と fclose() の関係
941 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:49:42 ] DLL が提供しているのが newしたポインタを戻すだけで その後始末の delete は呼び出し側がやってね という造りはマズイ ってこと DLL は 自前newしたものを戻すつもりなら それを受けて delete する部分も提供すべき # で、後者を記述するのに安全を見て >>926 で保険かけたいんだけど… どうすれば良い? # という流れになるのかな?
942 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:50:14 ] Windows APIだとCreateなんたらでハンドル作ったら、 CloseHandleよびだしたりするね。
943 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 15:55:17 ] ----DLL---- typedef void *(*dll_alloc_t)(void *(*)(size_t), size_t); __declspec(dllexport) void *dll_alloc(void *(*)(size_t), size_t); void *dll_alloc(void *(*alloc)(size_t), size_t s) { return alloc(s); } ----EXE---- dll_alloc_t dll_alloc = (dll_alloc_t)GetProcAddres(hDLL, "dll_alloc"); void *p = dll_alloc(malloc, size); こうした場合メモリはどっちに確保されるの?
944 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 16:03:32 ] 内部実装に詳しいわけじゃないから適当にいうけど、 EXEから呼ばれるDLLがリンクしているalloc関数を実装しているライブラリ・・・が OSにメモリ割り当てを要求して、OSが返してくれる適当なメモリ領域・・・・の 一部分をallocが適当に調節して返すんだから、 どっかOSが適当に決めた場所なんじゃないの?
945 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 16:37:27 ] VC++だとこうなったが・・・ //DLL.c #include <stddef.h> __declspec(dllexport) void *dll_alloc(void *(*alloc)(size_t), size_t size) { return alloc(size); } //Main.c #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef void *(*dll_alloc_t)(void *(*)(size_t), size_t); int main(void) { HINSTANCE hDLL = LoadLibrary("DLL"); dll_alloc_t dll_alloc = (dll_alloc_t)GetProcAddress(hDLL, "dll_alloc"); char *p = (char *)dll_alloc(malloc, 10); strcpy(p, "hello!"); puts(p); FreeLibrary(hDLL); puts(p); free(p); puts(p); return 0; } //OUT hello! hello! ンンンンンンンンンンンンンンンン-
946 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 17:01:03 ] これで良いみたいだな。winapi使った // DLL #include <windows.h> #include <stdio.h> extern "C" WINAPI void memo( HANDLE hd, char *&p ) { p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, 1<<20); strcpy(p,"hgujyguyguyguyguby"); printf("%s\n",p); } // EXE #include <windows.h> #include <stdio.h> typedef void (WINAPI *FNC)(HANDLE , char*& ); int main(){ HINSTANCE hd= LoadLibrary("dll.dll"); FNC memo = (FNC)GetProcAddress(hd, "memo"); HANDLE hHeap = HeapCreate(NULL, 0, 0); char *p; memo(hHeap, p); printf("%s\n",p); HeapFree(hHeap, NULL, p); HeapDestroy(hHeap); getchar(); }
947 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 17:48:12 ] C言語でWin32APIをさわっています。winbase.hに WINBASEAPI VOID WINAPI OutputDebugStringA(__in LPCSTR lpOutputString); と書いてあったんですが__inって何ですか?
948 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 17:53:49 ] msdn.microsoft.com/en-us/library/aa383701 (VS.85).aspx まずは自分で調べてほしい。
949 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 18:38:48 ] DLLとメモリのやりとりを確実にするには、(HANDLE, char*)のペアで 扱うのが良いと思いますが、 一方ではペアとして、一方ではchar*と自動的にキャストさせる方法はありますか。
950 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 18:43:12 ] >>948 縛りの弱いconstのようなものでしょうか? SAL解釈と言うんですね ググったんですがなかなかそこまでたどり着けませんでした
951 名前:949 mailto:sage [2009/11/20(金) 18:43:43 ] 自作関数だと、ペアでもchar*でも受け入れるように出来ますけど 自作ではない関数に対しても、自動でキャストして通るように出来れば便利なんですが。
952 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 18:46:22 ] 何でもかんでも暗黙キャストしてると後ですごい不安になる
953 名前:950 mailto:sage [2009/11/20(金) 18:46:57 ] >SAL解釈と言うんですね SAL注釈ですね、間違えました
954 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 18:47:31 ] double - int みたいな暗黙キャストを実現する方法はないですか?
955 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 19:00:34 ] >>949 ごめん、なんでハンドルが出て来るのか分からない。
956 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 19:05:55 ] >>946 の HANDLE hHeap = HeapCreate(NULL, 0, 0); と char *p; のペアを char*型のように扱いたいって事なんです。 無理でしょうか?
957 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 19:33:10 ] std::vector< boost::shared_ptr< T > > と boost::ptr_vector< T > はどちらを使っても同じでしょうか? 「一方ではこれができないから注意!」とかあったら教えてください m(_ _)m
958 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 19:45:50 ] 猿介錯
959 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 19:52:27 ] よくわからないならvector<shared_ptr<T>>のほう使っとけ
960 名前:957 mailto:sage [2009/11/20(金) 20:33:38 ] >>959 分かりました! ありがとうございます!
961 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 20:43:50 ] shared_ptrって余分に一回メモリ確保してない?あれは何なの?
962 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 21:00:30 ] 参照回数を共有するため、その変数を確保してる。
963 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 21:00:34 ] 関数の戻り値は、通常 値渡しですが 100Mほどのデータをもつクラスでも値渡しになりますか。 (値渡しのコストを下げるために) もし100Mがポインタに入っていて、 auto変数でリターンするとデストラクタが働いてメモリは解放されてしまいますが newで確保した物をリターンすると、それは解放できなくなりますか。
964 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 21:03:27 ] 戻り値にクラスを持ってこずに引数を参照渡しにすればいいのですが 変数を用意する事無しに、リターンがクラスになっていると便利なことがあるんです。
965 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 21:27:13 ] 戻り値がクラスというのは意味不明。 オブジェクトを返すとして、たとえば、 LARGE func() { return * new LARGE; } というのは結局コピーしてるし、メモリが回収不能になるので、絶対にだめ。 LARGE & func( LARGE & inout ) { //LARGEを使った処理。 return inout; } として、外で大きなデータを用意してやるか、 funcで全く新しいオブジェクトを作成したいと言うなら、newしてポインタを返せばよい。
966 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 21:38:14 ] >>965 Qtでこんな関数をオーバーロードしろって言われてるんだけど、 何を返せばいいの? QSize sizeHint(引数略) { return ? }
967 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:05:09 ] QSizeオブジェクトでいいと思うよ。
968 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:16:32 ] え? でも>>965 ・・・
969 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:18:16 ] QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const あとこんなのもあるんですが・・・
970 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:20:50 ] QSizeオブジェクトを返すことが、ライブラリによって強制されてるんだから、従えよ。
971 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:21:12 ] お前が何を聞きたいのかわからない
972 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:23:15 ] > というのは結局コピーしてるし、メモリが回収不能になるので、絶対にだめ。 ってかいてるじゃないですか
973 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:23:59 ] QSizeって大きくないでしょ。(というか100Mというサイズはどこから) 値で返しても何も問題ないじゃん。
974 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:40:44 ] それ以前に QSize sizeHint(引数略) をオーバーロードするのに、 戻り値を参照やポインタにはできんだろ。 オーバーロードのルールを思い出すのだ。
975 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:42:16 ] いや、戻り値を変えられないのはオーバーライドじゃろ。
976 名前:デフォルトの名無しさん mailto:sage [2009/11/20(金) 22:47:28 ] たまにいるよね(値|参照)(返し|渡し)の違いがわからない人って まあわからないようなレベルでできることなんて高が知れてるから分かるまで値返しでいいんじゃないかな
977 名前:デフォルトの名無しさん [2009/11/21(土) 05:12:37 ] インテルコンパイラでコンパイルしている場合に#ifdef分岐させたい場合、 #ifdefの後何を書けばよいのでしょうか?
978 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 05:16:39 ] defined (__ICC)
979 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 05:35:04 ] archives.postgresql.org/pgsql-committers/2007-08/msg00120.php Apparently icc doesn't always define __ICC, and it's more correct to check for __INTEL_COMPILER. Per report from Dirk Tilger. Not back-patched since I don't fully trust it yet ...
980 名前:デフォルトの名無しさん [2009/11/21(土) 05:37:04 ] オンラインで見られて、プログラム未経験者向けのC++の講座って、ロベール以外に何がありますか?
981 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 09:58:59 ] >>980 こことか見てた Programing Place ttp://www.geocities.jp/ky_webid/index_old.html
982 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:57:09 ] ロベールの翻訳は分かりやすい
983 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 13:17:19 ] >>982 どこが翻訳なんですか?
984 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:38:20 ] 自作クラスをcoutで出力するにはどうすれば良いですか?
985 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:41:43 ] ここみたら無理そうなことがわかりました 諦めました www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
986 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:00:01 ] そのページに書いてあるのは標準ストリームクラスの拡張であって、 君がやりたいのは標準ストリームクラスで自作クラスを出力することでしょ? まったくの別件だと思うよ。 君が勉強すべきなのは、演算子オーバーロード。
987 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:06:21 ] サンクス!です
988 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:27:13 ] これで出来ることはわかりましたが、char*からsize分だけ渡すにはどうすればいいですか。 std::ostream& operator<<(std::ostream& os, const ustring& x) { return (os<<*****): }
989 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:15:23 ] >>983 多くのプログラミング書籍が洋書からの翻訳であることを揶揄したジョークだろう よく書かれるコピペみたいなものだ
990 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:22:42 ] >>988 C/C++言語の仕様で\0まで出力だと思うので、任意の場所に\0を突っ込んでやればいいと思うよ。 バッファのオーバーランやアンダーランに気をつけて。
991 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:30:02 ] \0があっても標準出力へ渡したいんです… ustringはchar*とintのペアです。 STLは使えません。 あと、別の質問があるのですが。 クラスのメンバ関数で、 char* & operator [] ( int n ) { return &(ch[n]); } だとエラーになります。 char* & operator [] ( int n ) { static char*p=&(ch[n]); return p; } だと通るのですが 同時にアクセス来た場合に困ります。 衝突しない参照渡しはどうやればいいですか。STL stringみてもよくわかりません。
992 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:39:11 ] >>991 変数でもないものの参照を返したいとか訳分からん 値を返すんだと不都合なの?