- 1 名前:デフォルトの名無しさん [2007/06/25(月) 12:01:46 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.38【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1180877635/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 46 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:36 ]
- >>44
const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ constのつかないポインタ渡しでもしてたんなら君も悪い
- 47 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:47:18 ]
- つうか値渡しでどうやって受け取るんだ
- 48 名前:47 mailto:sage [2007/06/25(月) 21:48:37 ]
- あぁ読み込みパラメータね
勘違いした ごめんよ
- 49 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:56:24 ]
- const ポインタ渡しするのが普通だな。
小さい構造体の場合は別な事もあるけど、 まあ場合によるな。
- 50 名前:44 mailto:sage [2007/06/25(月) 22:21:39 ]
- >>46
上司を鼻で笑ってやったら首になりました。 貰ってやって下さい。
- 51 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:29 ]
- >>50
早っ!
- 52 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:49 ]
- >>50
うちに来い。Cだが、ひどいデスマも無い。 残業代は0だけど・・・
- 53 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:43:57 ]
- >>16-17
15です。 曜日、時間でのバックアップの件でしたが、 お礼遅れてすみません。sleepで行きます。 ありがとうございました。
- 54 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:02:28 ]
- >>49
C++ならconst参照だろ
- 55 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:03:36 ]
- あ、C++ だったか。
大きな構造体って時点で C かと思ってしまってた。
- 56 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:07:00 ]
- C++です。
struct S { int a; int b; int c; }; という定義の構造体があったとして、 S s = {0}; と書いた場合、b と c が 0 になることは保証されますか?
- 57 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:09:31 ]
- されます。
- 58 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:16:54 ]
- 8.5.1p7 に書いてあるね。
int() すなわち 0 で初期化される。
- 59 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:24:54 ]
- >>57,58
ありがとです。
- 60 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:00:48 ]
- C++Builderです。
builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,) ってありますが、こういうことする場合は、どんな部品を 使用すればよいでしょうか?
- 61 名前:60 mailto:sage [2007/06/26(火) 01:03:49 ]
- タブをクリックしたら、なにか表示させたり、
追加、削除もしたいんです。 よろしくお願いします。
- 62 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:34:19 ]
- >>38
あんたの思ってるとおり、しといたほうが安全だよ。 その前に std::exception は別でキャッチしてエラー表示してね。
- 63 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:55:44 ]
- 変な状態のままデストラクタが呼ばれたら、
それはそれで危険という気もしなくもない。 どっちがいいのかね?
- 64 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:36:20 ]
- 例外と言えば、例外指定って使ってる?
俺は使ってない。
- 65 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:37:35 ]
- 正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか
- 66 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:41:34 ]
- まあ、たとえ例外が起きても
メンバ変数が変にならないように気をつけるべきということで、 キャッチされても問題ないように作るべき、なのかな?
- 67 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:33 ]
- >>63,65,66
www.boost.org/more/generic_exception_safety.html boost.cppll.jp/HEAD/more/generic_exception_safety.html 「まるで例外は、正しいコードに対するミステリアスな攻撃であり、 我々が自らをその攻撃から守らなければいけないようなものであると 見なされているかのようである。 言うまでもなく、これはエラー捕捉との 健全な関係に繋がらない!」
- 68 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:00:32 ]
- >>64
boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。 www.boost.org/more/lib_guide.htm#Exception-specification
- 69 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:08:14 ]
- 最適化の問題で使わない方がいいという話もあるのか。なるほど。
- 70 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:17:40 ]
- 標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、
catch 中で別の例外起こされたら面倒だからかな?
- 71 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:23:55 ]
- >>67
確かに健全な関係ではないけど、 無視できないんだよなあ。 例外指定を普通使わない以上、 どの関数がどんな例外を投げるか パッと見分からないことも多いし、 思わぬ例外を投げられたらそれは ミステリアスな攻撃と思われてもしゃーない気がするよ。 全ての関数が例外を投げる可能性があるって感覚で プログラムを組むのがいいのかね。
- 72 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:35:26 ]
- >>71
安全側に倒すという意味で、そう思ってかかってもいいだろう。 思わぬ例外を投げられてもきちんと動作するように書くべきだし、 極力そう書くことができるように言語や標準ライブラリが整備されている。
- 73 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:36:45 ]
- >>70
標準ライブラリの中でも throw() はいろんな関数についてるよ。 型付で指定してるのはグローバルな operator new () ぐらいかな?
- 74 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:44:20 ]
- >>73
あ、そうなんだ。 std::exception::what はオーバーライドすることがあるから 目立つってだけのことか。
- 75 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:46:24 ]
- >>72
Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。 でも、標準ライブラリやキーワードが例外投げる以上、 無視するわけにもいかないと思うんだけどね・・・。
- 76 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:26:57 ]
- >>75
あの話は戻り値についてもいっしょだろ。 ただ単に戻り値でのチェックに慣れているから、 戻り値をチェックしていないコードのほうが見つけやすいって話。 例外に慣れてしまえば、例外安全でないコードは同じぐらい 簡単に見つけられる。ただし現状では、↑の理由で他の人に 伝わらないことが多い。 敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。 新しい言語をデザインするなら、 try ブロックじゃなくって nothrow ブロックを作ればいいんじゃないかと思う。 「オレはここでは例外が飛ばないと仮定して書くぜ」っていう ブロックね。
- 77 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:31:57 ]
- どうなんかねえ。
例外をうっかり無視するコードより、 戻り値をうっかり無視するコードの方が危険性は高いと 個人的には思うんだけど。
- 78 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:19 ]
- つーかC++の例外が糞で使いにくいだけ
- 79 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:24 ]
- 例外は「うっかり無視」できないのがいいんだよ。
- 80 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:43:09 ]
- そうそう。
- 81 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:55:16 ]
- 例外は戻り値と違って発生源や内容の概要が簡単に特定できるから
エラー→復旧っていう処理に使いやすい エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど エラー内容によってstrategyパターンを使って処理を色々と変えるなら 例外の方がやりやすい と思ったんだけどどうかな? 軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
- 82 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:05:12 ]
- std::fstream のコンストラクタに渡すファイル(パス)文字列って、
ネイティブなフォーマットのものなの?それとも POSIX 準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt で Windows では C:\home\hoge\test.txt ? どういうフォーマットのパス文字列を取りうるかに関する 規約って定められてるの??
- 83 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:39:34 ]
- POSIX かんけーねー。
処理系で好きに決めりゃいいべさ。
- 84 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:48:09 ]
- そうか・・・標準の C++ のライブラリではそこまでは
決められていないんだね。 boost::filesystem では native/ portable が厳密に切り分けられていたので、 fopen や fstream でもそうなってるのかと思った。
- 85 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:51:43 ]
- >>82
const char*なのが困り物 たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する それ以前ではコードページ依存の方法でUTF-16に変換する いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて カスタムのストリームバッファを作れという話になるだろう
- 86 名前:デフォルトの名無しさん [2007/06/26(火) 21:17:53 ]
- ofstreamやifstreamでファイルを開くとき、
ios::binary指定というのは、意味があるのでしょうか? コンパイラはg++です。 いままでとくに指定してもしなくても結果は同じになりました。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:23:21 ]
- >>86
UNIX系は関係ない。 WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ 読むときは0x0d0aが0x0aになる。
- 88 名前:デフォルトの名無しさん [2007/06/26(火) 21:26:02 ]
- ios::binaryしない奴は死ねっていつも思う。
- 89 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:27:15 ]
- >>86
テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある 有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある 逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで テキストモードとバイナリモードの違いが表れるはず
- 90 名前:デフォルトの名無しさん [2007/06/26(火) 23:37:20 ]
- while(!feof(fp1)){
ch = fgetc(fp1) if(!feof(fp1) fputc(ch,temp); } ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか? 何か意味があるんですか? whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
- 91 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:44:12 ]
- >>90
意味以前にその例題、コンパイルできるか?
- 92 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:45:19 ]
- >>90
fgetc()で読みに行ってみないとEOFだとわからんことがあるから。 その場合、whileの条件式の時点ではEOFではないと判断して 読みに行ってみたらEOFだった(読めませんでした)というカタチになるので 下のチェックが要る。 だがこんなのは糞コード。 while ((ch = getc(fp)) != EOF) putc(ch, temp); とするがよい。
- 93 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:12:20 ]
- >>92
バイナリファイルを操作する場合は>>90の方がよい
- 94 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:13:20 ]
- >>93
なぜ?
- 95 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:16:51 ]
- >>94
int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
- 96 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:02 ]
- とても初歩的な質問ですが
short i; long k; float f; double d; としたときに @ (f+15)/(long)(d-15) A k+20.0 B (int)d/i の型(double,longなど…)はどうなるでしょうか? こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
- 97 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:55 ]
- >>95
あ、chがcharだと仮定しているわけね。 それならば、単にint chと宣言して>>92のコードで良い。
- 98 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:21:04 ]
- >>96
整数拡張、型の昇格
- 99 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:00 ]
- というかgetc()の戻り値をcharで受け取る奴がアホ
- 100 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:13:04 ]
- C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。
気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。 ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
- 101 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:27:57 ]
- >>100
残念ながらキャストが必要。 毎回キャストするのが嫌なら、適当な関数で包め。
- 102 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:13:44 ]
- 別にfread使っても一向にかまわないわけだし。
適材適所。
- 103 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:36:59 ]
- freadはvoid*の代わりに、サイズと数の2つを指定するだろう
- 104 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:42:16 ]
- fread()/fwrite()は(Unixの)read()/write()のインタフェース
真似れば良かったのにな
- 105 名前:デフォルトの名無しさん [2007/06/27(水) 10:16:53 ]
- データがBIG ENDIANかLITTLE ENDIANのどちらかで
単純に&hogeで受け取れない場合もあるし。 つまり、CPUとデータの並びが逆の場合。 今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?
- 106 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:26:23 ]
- ネットワークを跨ぐとか、別PCでもそのファイルを r/w するのならエンディアン気にするけど…
たかだか、同じPC内で完結するのならそのまま保存するよね?
- 107 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:41:33 ]
- そりゃファイル仕様に因るべさ。
- 108 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:49:46 ]
- ああ、先にファイル仕様があって(当然エンディアンも明示されてて)それを
読む→(なんかする)→(書く) なら、それに従うしかないね。
- 109 名前:デフォルトの名無しさん [2007/06/27(水) 12:14:06 ]
- >>87-89
なるほど、ではテキストでないときには、 ios::binaryを付けるようにします。
- 110 名前:デフォルトの名無しさん [2007/06/27(水) 14:39:49 ]
- 基底クラスのポインタを継承クラスの動的配列でオーバーライドすることはできませんか?
class Base{ public: Base(){val0=0;}; virtual ~Base(){}; virtual void show(void){cout << val0 << endl;} int val0; }; class Deriv:public Base{ public: Deriv(){val1 = 1;}; virtual ~Deriv(){}; virtual void show(void){cout << val1 << endl;} int val1; }; int main(int argc, char *argv[]) { Base *test; int num = 10; test = new Deriv[num]; for(int i=0;i<num;i++) test[i].show(); } を実行すると,main()の中のfor文2回目のループ(i=1)で 0x0041e12c でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000005 を読み込み中にアクセス違反が発生しました。 。 というエラーが出ます。 test[0]は無事Derivにオーバーライドできていますが,test[1]以降が不可能なようです。 何か良い方法はないでしょうか? 環境:WindowsXP + VisualC++ Ver.7
- 111 名前:110 [2007/06/27(水) 15:02:56 ]
- オーバーライドの意味間違ってますね。
何と呼んで良いのか分からないですが、領域確保? とにかくnewするという意味です。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:11:45 ]
- >>110-111
BaseとDerivのメモリ上の大きさが違うのに、配列でどう動けと。
- 113 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:34:55 ]
- 無理するなら↓
((Deriv *)((char *)test + sizeof(Deriv) * i))->show(); もしくは↓ ((Deriv *)test)[i].show();
- 114 名前:110 [2007/06/27(水) 15:51:45 ]
- >>112,113
ありがとうございます。 なんとなく分かりました。 new Deriv[num]が失敗してるのではなく、 forループのなかでのindexの指定が間違ってるということですね。 *testがBase型のポインタなので test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。 >>113さんの方法で動きましたけど、 そもそもこういう状況が必要になる設計はまずいでしょうか?
- 115 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:28:34 ]
- >>114
一般的にはまずい。 でも、テンプレートを使って下のようにやればできないことはない。 template<class T> class poly_array { template<class U> poly_array(U *ptr, int array_size) : ptr_(ptr), size_(sizeof(U)) ... {...} T *get(int i) {return (T *)((char *)ptr_ + size_ * i); } private: T *ptr_; size_t ptr_size_; ... };
- 116 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:34:21 ]
- 基底クラスへのポインタの配列を作って、
それぞれに対してまたオブジェクトを作っていくのが、 まあ一番安全なのかね。 メモリ管理が複雑になるという点では、 安全とは言えんかもしれんが。 >>115 はちょっと感動したよ。
- 117 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:51:04 ]
- 下記を左側の数字のキー値で、ソートしたいです。
(8,x),(2,y),(3,z)・・・ ソートして、 (2,y),(3,z),(8,x)・・・ を出力。(int,std::string)の形です。 どういうデータで扱って、どのような方法がよいでしょうか。 mapとか自動でソートされるみたいですが、 自分で比較して並べ替えたいです。 よろしくお願いします。
- 118 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:58:37 ]
- int, std::string をメンバに持つ構造体の配列?
それなら構造体で < 演算子をオーバーロードするか 比較関数を定義するかすれば std::sort でソートできるけど。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:00:21 ]
- >>117
つ[std::vector]
- 120 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:12:57 ]
- 訂正お願いします。
×キー値で、ソート ○キーでソート >>118 ごめんなさい。 「(int,std::string)」 これは、余計でした。(数字,文字列) なんです。 どのデータに入れて、どんな風に処理するのか知りたいです。 >>119 std::vectorに、キーを入れてソートするんでしょうか? 対応する値は、どうやって対応させて出力を。。。
- 121 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:19:20 ]
- 何がしたいのかよく分からない。
int 値はキーで、std::string はキーに対応する値? std::map を使うのがベストだと思うけど、 std::map を使わない理由は何かあるの?
- 122 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:22:08 ]
- >>117
とりあえず、すんごい単純で愚直な方法。 #include <iostream> #include <string> #include <vector> #include <utility> #include <algorithm> typedef std::pair<int,std::string> nspair; bool cmp(const nspair& a, const nspair& b) { return a.first < b.first; } int main() { int n; std::string s; std::vector<nspair> vec; while (std::cin >> n >> s) vec.push_back(nspair(n,s)); sort(vec.begin(), vec.end(), cmp); for (std::vector<nspair>::iterator i = vec.begin(); i != vec.end(); ++i) std::cout << '(' << i->first << ',' << i->second << ')' << std::endl; }
- 123 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:25:51 ]
- >>116
つboost::ptr_vector
- 124 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:41:02 ]
- >>121
(数字,文字列),,,, をキーでソートするんですが、どんなデータに格納して どんな処理をするのか知りたかったんです。 >>122 プログラムも、書いていただきありがとうございます。 数分しかたってないのに。(汗 中身がstd::pairのstd::vectorですか。 typedefの使い方もすごい勉強になります。 ありがとうございました。
- 125 名前:119 mailto:sage [2007/06/27(水) 19:10:32 ]
- ちっ、プログラムを書いてみたけどstd::pairとstructの違いだけで殆ど同じだから貼るのやめよ。
- 126 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:01:34 ]
- >>124
(数字,文字列) 全体がキーなの? じゃ、それに対応する値もあるの? それとも set みたいにキー=値なの? そして、数字が同じ時には文字列も比較するの? と、質問攻めになってしまった。
- 127 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:30:26 ]
- 結局ポインタって何に使うんですか?
違った名前の変数で同じ値を参照できるってことですか? でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・ ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・
- 128 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:32:29 ]
- >>127
C はポインタが無ければ配列も関数に渡せない言語です。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:34:24 ]
- ポインタ使いまくりw
ポインタを理解していないみたいだが君も知らない内に使ってるよ
- 130 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:04:33 ]
- >>127
scanfを使ったことはないのかい?
- 131 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:08:35 ]
- ポインタより似たような文法上の特徴を持つC++のイテレータの方から覚えた方がいいかもね
概念としては似たようなもんだし、イテレータ理解できるならポインタも理解できるようになるか どうしてもポインタが駄目ならC++でイテレータから入るのも十分ありだよ
- 132 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:54:19 ]
- ポインタの概念を理解できないレベルでイテレータを理解できるか疑問
- 133 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:05:18 ]
- イテレータ自体がデータをポインタライクに扱うようなもんだしなぁ
- 134 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:08:52 ]
- ポインタのノリでイテレータが使うとそれはそれでバグの元に・・・
- 135 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:10:27 ]
- アドレスがどうのという話が無いぶんイテレータの方が簡単だと思うな
概念的な話より、何が出来るかの方が理解しやすいだろう
- 136 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:25:39 ]
- 抽象概念を理解できない香具師にはどっちみち理解できない罠。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:07:25 ]
- ポインタがわからない→Javaへ行く
Javaのダメプログラマがまた一人。
- 138 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:17:46 ]
- >>127
a = 5; /* aに対応する箱に5を入れる */ b = a; /* bに対応する箱に、aに対応する箱から取り出した値を入れる */ おんなじaでも式の右辺と左辺ではぜんぜん意味が違うのだが、それを理解してるかな? 物を入れるには箱が必要で、Cで箱そのものを値として取り回すための 仕掛けがポインタだ。 どういう時に必要になるかはいずれ分かる。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:47:44 ]
- Cでのポインタの必要性が特に大きいのは、配列や左辺値を渡す手段が
他に存在しないから。関数は全部値渡しだし。 参照渡しが存在するならポインタの必要性は大分減るが、リストや木のような 配列より複雑なデータ構造を扱うようになれば、ポインタの有用性が自然に 理解できるだろう。
- 140 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:14:41 ]
- >>127
関数とのデータ受け渡し時に構造体とかそのまま実体渡すとコピーされるのでメモリの無駄だし速度的にもデメリットがある それに不定なサイズのデータを扱おうと思ったらポインタ使うと思うが。
- 141 名前:デフォルトの名無しさん [2007/06/28(木) 14:42:29 ]
- vc++2005で警告レベルを/W4にした時、
stlのアルゴリズム使って代入処理とかイテレータを用いたコンテナの初期化とかすると > xutility(1685) : warning C4244: '+=' : '__int64' から '__w64 unsigned int' への変換です。 > データが失われる可能性があります。 とかコンパイラ様が仰られて出力窓がカオスになって困るのでこれをどうにかしたい訳ですが こういうのは#includeディレクティブの羅列全体に(つまりxutilityを使ってるライブラリ全体を) #pragma warning(disable:4244)と #pragma warning(default:4244)やpush, pop使って抑制を適用しちゃっていいんでしょうか? 一応、ライブラリ以外の部分ではちゃんと/W4で警告が行われますし問題ないと思うんですが なんか良い解決法ってございませんかね?
- 142 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:47:55 ]
- >>141
__w64 は 64 ビットにするんじゃなくて、 32 ビット環境でコンパイルする時にも もし 64 ビットにしたとしても整合性が取れるかチェックするだけ。 つまり、__w64 unsigned int は 32 ビット環境では 32 ビット符号無し整数型になる。 __int64 は 64 ビット符号付き整数型だから、 そこから 32 ビット符号無し整数型への暗黙変換で警告が出るのは当たり前。 それで本当に大丈夫なのかをまず確認した方がいい。
- 143 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:53:54 ]
- boost::serialization ってクロスプラットフォームで
使ってもおk?つまりできたファイルはプラットフォームを またいで移動してもおk?たとえば endian の異なる プラットフォームに持っていっても安全?
- 144 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 15:32:13 ]
- >>142
なるほど、助言をヒントに 使用するされているイテレータの差の型にsize_tを指定して定義すればあっさりと消えました どうもです><
- 145 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:04:11 ]
- >>144
> イテレータの差の型 difference_typeのことならstd::size_tよりも 符号付のstd::ptrdiff_tのほうがいい。 it = begin(); it2 = begin(); ++it2; このときit2 - itは1になるはずで、it - it2は-1になるべきだから。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:25:10 ]
- >>143
あれの出力形式にはいろいろあって、 バイナリは知らないけど、xmlなら間違いなくできる。
|

|