- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 513 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:27:02 ]
- >>507
それは実装依存だな。 どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、 重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。 >>509 文字どおりさ。 動けば何でもいい、そういうやりかた。 >>510 何らかの意味があるのだからtypedefすべきだし、 大抵の場合は何か付随したデータがあるわけで、 それと本体のvector<string>を別管理するのは、 不適切だと思う。 >>512 オブジェクト志向と言いながら、 BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。 彼らは万能ナイフを作ることに喜びを感じているようだが。
- 514 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 08:58:30 ]
- ふ〜ん。君はそういう事に喜びを感じているんだね。
- 515 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:02:19 ]
- そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる 重いオブジェクトのコンテナならこれで決まり☆
- 516 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:21:21 ]
- >>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな アホとしか思えん いちいち型を定義してたら型がむやみに大量発生するし、 そのせいでtypedefされた型の元の型がわからなくなって どういう操作ができるのかいちいち調べる羽目になる 名前の一覧は vector<string> names; で十分 過度の抽象化は毒であると知れ
- 517 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:44:09 ]
- >>516の書き込みをみて
VC++が頭をよぎった。 ふとよぎった。
- 518 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:50:52 ]
- >>513は早すぎる最適化をやっちゃうタイプだな
- 519 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:51:54 ]
- >>516
> 名前の一覧は vector<string> names; で十分 名前だけで単独なんだ・・・どういう場合?
- 520 名前:デフォルトの名無しさん [2007/10/23(火) 15:36:35 ]
- スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。 グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?
- 521 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:04:40 ]
- つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。
グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。 勿論、そのクラスの生存期間に注意が必要。
- 522 名前:520 [2007/10/23(火) 16:23:07 ]
- せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。
- 523 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:37:47 ]
- >>520
設定も参照もどちらも割り込みルーチンから行なうのなら、 グローバル変数にしておくのが無難だがなぁ。 グローバル変数にしたくない理由は?
- 524 名前:デフォルトの名無しさん [2007/10/23(火) 16:44:44 ]
- メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど
- 525 名前:520 [2007/10/23(火) 17:49:50 ]
- >>523
やはりグローバル変数がいいですか・・・。 プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。
- 526 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:12:44 ]
- >>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。 グローバル変数以上に問題のあるコードかもしれんが。
- 527 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 19:13:25 ]
- >>524
割り込み処理だと渡しようがないと思うんだ。
- 528 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/23(火) 21:52:40 ]
- >>520
>>525 1.割り込みマスク外した後ならsignal関数では? 2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?
- 529 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:25:37 ]
- ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか? とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。 これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?
- 530 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:29:32 ]
- 調べてみたら自己解決できそうなので、自分で調べてみます。
- 531 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:32:45 ]
- 解決、スレ消費申し訳ありませんでした。
- 532 名前:デフォルトの名無しさん [2007/10/25(木) 16:20:24 ]
- VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが VCで作ったものをDLLにまとめることくらいしか現在わかっていません。 何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?
- 533 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 16:23:09 ]
- VBのスレで聞いたら?
- 534 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 18:26:14 ]
- >>532
> 何に対応させればよいのか ↓ > コントロール 自分で書いていて気がつかないとは。
- 535 名前:デフォルトの名無しさん [2007/10/25(木) 19:31:24 ]
- ABのどっちが好き?
#include <iostream.h> void f(unsigned int u){ printf("%u", u); } main(int argc, char **argv){ unsigned int u = 0; if(argc > 1){ A u = static_cast<unsigned int>(atoi(argv[1])); B sscanf(static_cast<const char *>(argv[1]), "%u", &u); } f(u); }
- 536 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:32:55 ]
- lexical_cast<>
- 537 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:55:07 ]
- qa3457974
- 538 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:33:48 ]
- >>535
エラー処理してない点は同じなのでどちらも却下。 だ が 敢 え て 言 わ せ て も ら う if(1 < argc){ だと!
- 539 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 06:44:04 ]
- >>538
if(argc > 1) より if(1 < argc) の方がいい理由も添えて書いてくれ。
- 540 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:33:39 ]
- いまどきiostream.hって・・・
- 541 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:57:17 ]
- .h
- 542 名前:デフォルトの名無しさん [2007/10/26(金) 14:13:27 ]
- bf
- 543 名前:538 mailto:sage [2007/10/26(金) 17:15:12 ]
- >>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。 単に俺のスタイルなだけ。 例えば、『aが1よりおおきくて、かつ10より小さい』という命題について if(1 < a && a < 10) と書くと、常に右が大きくなるでしょ。 完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。 (数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。 それだけ。
- 544 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:36:45 ]
- >>543
俺もそう書く 理由も同じ
- 545 名前:デフォルトの名無しさん [2007/10/26(金) 21:27:52 ]
- vectorは「動的配列」という事なのですが、
これは、 void init_vct() { vector< vector<int> > v; v.resize(3); for(int i=0; i<v.size(); ++i) v[i].resize(5); int array[] = { 0, 1, 2, 3, 4}; } int main() { init_vct(); return 0; } としたときに、init_vct()関数を抜けても、 int型配列 arrayと違って、vector< vector<int> >型配列 vは、 メモリ上から消されないということですか? //初歩的な質問で申し訳ありません。
- 546 名前:デフォルトの名無しさん [2007/10/26(金) 21:33:34 ]
- 消えるだろ ふつう
- 547 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:37:01 ]
- >>545
関数中のvはスコープから抜ける時デストラクタが呼ばれ、 確保された領域は開放される。 v.push_back(i)などで、どんどん追加でき、 サイズが動的に拡張されていく配列。
- 548 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:57:37 ]
- >>543
if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と 書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と 書くと良い みたいなことがドコカの本で書かれていた記憶がある
- 549 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:00:36 ]
- >>548
ぱっと見て「ヘタだなぁ」と思うコード その6 pc11.2ch.net/test/read.cgi/tech/1193250955/l50 ここで今、思いっきりその話になってます。
- 550 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:33:42 ]
- >>543
俺は『aが1よりおおき』いなら、 if(a > 1) と書くな。『1がa未満』なら逆に書くけど。 俺も一時期>>543と同じ書き方してたけど、 仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。
- 551 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:35:50 ]
- sscanf()はバッファオーバーフローがあるから
使ってはいけないんじゃなかったっけ? 普通atoi()だろ。
- 552 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:39:02 ]
- どちらでも仕様書どおりだよ。
- 553 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:21 ]
- >>545です。
>>546さんありがとうございます。 以下のようなプログラムを書いたのですが、 正しく表示されるのはたまたまメモリに残っているせい? #include<iostream> #include<vector> using namespace std; class VEC{ private: public: vector< vector<int> > vec; VEC(int num); VEC(){}; }; VEC::VEC(int num) { vec.resize(3); for(int i=0; i<3; ++i) vec[i].resize(5); for(int i=0; i<vec.size(); ++i){ for(int j=0; j<vec[i].size(); ++j){ vec[i][j] = num+j; } num+=vec[i].size(); } }
- 554 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:58 ]
- class A{
private: public: A(); void Show(); vector<VEC> v; }; A::A() { int j=0; for(int i=0; i<10; ++i){ v.push_back(VEC(j)); j+=10; } }
- 555 名前:デフォルトの名無しさん [2007/10/26(金) 23:51:55 ]
- void A::Show()
{ for(int i=0; i<v.size(); ++i){ for(int j=0; j<(v[i].vec.size()); ++j){ for(int k=0; k<(v[i].vec[j].size()); ++k){ cout << v[i].vec[j][k] << " "; } cout << endl; } cout << endl; } } int main() { A aa; aa.Show(); return 0; }
- 556 名前:デフォルトの名無しさん [2007/10/26(金) 23:52:44 ]
- >>553
関数抜けた時点で解放され、別の値に変わる可能性はある ゴミ箱の中身消したけど復活できるかどうかと同じ事だ
- 557 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:04:16 ]
- >>553-555
別にどこもおかしなようには見えないが、どこに問題があると思ってるの?
- 558 名前:デフォルトの名無しさん [2007/10/27(土) 00:49:51 ]
- >>545です。
>>546 >>547 >>556 さんのご指摘もありますが、 newで確保されていないvector配列の中身(vector< vector<int> > vec)が、 最後まで保持されていること・・・ についてです。 vecはクラスの中で宣言はされているものの、 VEC()で代入される中身は局所的なもので、 VEC()を出たらvec配列の中身は、開放されるのかなぁと。 サイトで「vectorは"動的"配列」というのを目にしたのですが、 これは配列のサイズを"動的"に確保するだけで、 newのメモリの"動的"確保とは別物なのではないか? と思ったので、試しています。
- 559 名前:デフォルトの名無しさん [2007/10/27(土) 00:51:53 ]
- >>545です。
かなりトンチンカンなこと言ってると思いますが、 ご指導お願いいたします。m(_ _)m
- 560 名前:デフォルトの名無しさん [2007/10/27(土) 00:57:53 ]
- >>559
クラス内の関数は、抜けても値は保持される 常識だろう vectorとか関係なし
- 561 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:59:15 ]
- >>559
基本的なことが、いくつも、理解できていない気配がする。 泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。
- 562 名前:デフォルトの名無しさん [2007/10/27(土) 00:59:20 ]
- オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ
あれこれ作業するごとにデータが消えていたら駄目だろ
- 563 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:00:16 ]
- v.push_back(VEC(j));
の VEC(j)はどこいっちゃったの? ってこと?
- 564 名前:デフォルトの名無しさん [2007/10/27(土) 01:20:13 ]
- >>545です。
みなさん、レスありがとうございます。 クラスの中でサイズを指定しないと配列の宣言てできませんよね。 もしコンストラクタの引数の値を配列のサイズにしたいときには、 データメンバに、 int a*; を入れて、 コンストラクタの中で、 a=new int[コンストラクタの引数の値]; と(私は)します。 だから、私はvector配列をクラスのデータメンバとするときも、 配列のサイズを指定しないから、 どこかでnewすることでvector配列の領域を確保しなければ ダメなのかぁと思ってしまったわけです。 newをせずに、ただ値を代入しただけでは、 局所な値を代入しているに過ぎないなどと思ってしまいました。 色々考えているうちに、頭の中がごちゃごちゃになってしまいました。 己の力の無さを改めて自覚しました。
- 565 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:31:07 ]
- >>564
vectorの中でnew/deleteしてる。
- 566 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:32:02 ]
- コンストラクタとデストラクタで何か表示するクラス作って
vectorにpush_backしてると何か閃くかもしれない
- 567 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:38:24 ]
- クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。
きちんとした本を読んでいれば間違わないような誤解してるんだもの。
- 568 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:50:13 ]
- これからプログラムを勉強する俺に是非教えてほしい。
ちょっとしたアプリケーションを作りたくて なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては 自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。 けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか? 自分は結構VBがなじんできてるしこの頃。。 実際、プログラムの組みやすさ、軽さ、ほか色々。 ここで聞くのはどうかと思うけど、できれば教えてほしい もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。
- 569 名前:デフォルトの名無しさん [2007/10/27(土) 01:54:18 ]
- すいません、教えていただけないでしょうか。
C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、 決められた値になったら終了する。という処理を作りました。 ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を 実現したいのですが、どうすればいいでしょうか。 自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば データを渡せることがわかったのですが、見当違いな考えかもしれません…。 どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。
- 570 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:59:25 ]
- OSぐらい書けよ
- 571 名前:デフォルトの名無しさん [2007/10/27(土) 02:02:14 ]
- >>570
申し訳ありませんでしたorz 作成環境は以下のとおりです。 OS:Windows XP コンパイラ:Microsoft Visual C++ 2005 Express Edition
- 572 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:03:22 ]
- VBが糞と言われる理由
1. VB自体ではなく、VB使いが糞であるため 2. VBでプログラミングを勉強すると糞になるため 3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから 4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから
- 573 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:05:35 ]
- >>569
質問が抽象的すぎる。 もっと具体的に詳しく。 また、なぜ、グローバル変数をやめようと考えているのか、その理由も。
- 574 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:16:09 ]
- ∧_∧ クワッ!
∩`iWi´∩ ヽ |m| .ノ |. ̄| U⌒U
- 575 名前:デフォルトの名無しさん [2007/10/27(土) 02:17:26 ]
- >>574
それ何か可愛いな。
- 576 名前:デフォルトの名無しさん [2007/10/27(土) 02:25:48 ]
- >>573
色々と足りない部分が多くて申し訳ありません。 初心者の為、処理が的確ではないかもしれませんが現在の処理は以下のとおりです。 unsigned __stdcall thread0(void *lpx) { /*排他制御にミューテックスを使っています*/ HANDLE hM; hM = *(HANDLE*)lpx; while ( 100 > nCnt ) { WaitForSingleObject( hM, INFINITE ); nCnt++; printf("nCnt = %d", nCnt); ReleaseMutex( hM ); } printf("thread0 END"); return 0; } これと同様の処理を行うスレッドがもう一つありまして、 交互にグローバル変数nCntをインクリメントして、100になったら終了させるようにします。 このnCntをグローバル変数ではなく、ローカル変数にしてスレッド間で値を渡し合うことで、 同様の処理ができるようにしてみたいのです。 グローバル変数を使わない理由ですが、現在C言語を勉強中で、 様々な処理方法を試してみたいと思ったからです。
- 577 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:33:47 ]
- そのスレッドに渡すlpxでミューテックスと一緒に共有したいデータを渡すとか。
struct thread_data { HANDLE hM; int nCnt; }; unsigned __stdcall thread0(void *lpx) { struct thread_data *data = lpx; /*排他制御にミューテックスを使っています*/ HANDLE hM; hM = data->hM; while ( 100 > data->nCnt ) 以下略
- 578 名前:573 mailto:sage [2007/10/27(土) 03:03:46 ]
- >>576
なるほど。文字どおりの処理をしていたのね。ごめん。 まず、そのプログラムには重大な問題がありそう。 それはともかく、 スレッド毎にメッセージ・キューを持たせて、相互にメッセージを送り合う ということだと、まず、最初の選択として、 Windowsが提供してくれるメッセージ・キューを使うのか、 それ以外のメッセージ・キューを使うのか、 というのがあるが、とりあえず前者の方向で。 Win32APIのPostThreadMessageを使う。 まずは、MSDNライブラリ等でPostThreadMessageの解説を見よう。
- 579 名前:デフォルトの名無しさん [2007/10/27(土) 03:04:25 ]
- >>577
ご助言ありがとうございます。 ただ、私が今回試してみたいのはスレッド間通信?というものになりそうなんですが、 このコードがそういった処理になるのでしょうか。 サンプルコードが分かり辛いと思うので、自信がありません…。
- 580 名前:デフォルトの名無しさん [2007/10/27(土) 03:07:12 ]
- >>578
ありがとうございます。 エラー処理や組み方自体についても、学ぶべきことが多いですorz PostThreadMessageについて、早速見てみます。
- 581 名前:573 mailto:sage [2007/10/27(土) 03:14:26 ]
- ついでに>>576のプログラムの問題点と解決方法を。
まず、コンパイラの最適化の問題。 変数nCntの宣言にvolatileを付けていますか? 付けていなければ、付けること。 次に、100 > nCnt の比較が、排他制御の外にあること。 nCntに触っていいのは、排他制御の内側だけ。
- 582 名前:デフォルトの名無しさん [2007/10/27(土) 03:28:55 ]
- >>581
たしかにこれでは…色々と参考になりました。 MSDNライブラリで調べたところ、 PostThreadMessage関数でデータをポストして、 GetMessage関数でポストされたデータを取得することで、 スレッド間でデータをやりとりできそうなので、早速試してみます。 ご助言いただいた方々、本当に有難うございましたm(_ _)m
- 583 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:47:47 ]
- >>545です。
>>554 のA()で、 A::A() { int j=0; for(int i=0; i<10; ++i){ v.push_back(VEC(j)); j+=10; } } としているのですが、ここで作られるVEC型オブジェクトは、 局所的なもので、寿命はfor 1回分の間だけですよね? コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、 vector<VEC*> v; と宣言を直して、 A()では、 v.push_back(new VEC(j)); としなければダメですか? 何度も申し訳ないです。
- 584 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:55:04 ]
- VEC(j)のコピーがvector内に追加される
- 585 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:59:02 ]
- > コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、
ただし、Aのvector<VEC> v;は、v.push_backの内部で、 引数を使ったコピーコンストラクタを使い、勝手に保持する。 vector<string> v;でv.push_back("ababa");と渡しても、 const char *pを受け取って内部で string(p) のようにして保持する。 > vector<VEC*> v; > v.push_back(new VEC(j)); のようなことをするのなら、Aのデストラクタで、 push_backの所でnewしたぶんをdeleteしてやる必要がでてくる。
- 586 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:59:51 ]
- かぶったorz
- 587 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:34:43 ]
- >>583
基本ができてなさすぎ。 ちゃんと勉強して出直せ。
- 588 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:26:59 ]
- >>583
いろいろごっちゃになっているようだが、 ・関数内で宣言されたオブジェクトは関数が終わったら破棄される と言われて、 関数が終わったらvectorの中身が壊れるのでは、と疑問を持ったみたいだけど、 この場合は関数へ渡す引数として宣言した「一時オブジェクト」なので問題ない。 そうでなくても、vectorは要素を「コピー」して保持するので、 元のオブジェクトが破棄されても何ら問題はない。
- 589 名前:588 mailto:sage [2007/10/27(土) 20:31:56 ]
- 間違えた、俺がごっちゃになってるorz
書き直すと、 関数内で作ったオブジェクトをvectorに入れたら、 関数を抜けた時にそのオブジェクトが破棄されてvectorの要素が無効になるのでは、と疑問を持ったみたいだけど、 この場合はvectorへ渡す要素として宣言した「一時オブジェクト」なので問題ない。 そうでなくても、vectorは要素を「コピー」して保持するので、 元のオブジェクトが破棄されても何ら問題はない。
- 590 名前:588 mailto:sage [2007/10/27(土) 20:34:03 ]
- ああ、いや、一時オブジェクトは関係ないか、結局破棄されるんだから
とにかくvectorはコピーコンストラクタ呼び出してコピーしてるので、 元のオブジェクト破棄しても問題ない
- 591 名前:588 mailto:sage [2007/10/27(土) 20:42:08 ]
-
- 592 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:47:52 ]
- ややこしく考え杉。
int g_c ; void funcA(int& a) { int b = a ; g_c = a ; } void testA(void) { int x = 3 ; funcA(x) ; } これと同じよ
- 593 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 21:33:41 ]
- フフフフフフハハハハハハ
- 594 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:07:18 ]
- int ary[2] = { 1000 , 2000 };
int *po; po = &ary[0]; printf("po\t = %x\n" , po); printf("*po++\t = %d\n" , *po); po++; printf("po++\t = %x\n" , po); printf("*po++\t = %d\n" , *po); *po++; printf("po++\t = %x\n" , po); printf("*po++\t = %d\n" , *po); これで最後の方で*poに1を加えてるつもりなのですが、変な値になって *po+=1だと大丈夫です *poはポインタの中身だと今まで思ってたのですが、、、、なんでなのでしょうか
- 595 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:09:12 ]
- (*po)++;
釣りなんだろうけど
- 596 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:21:37 ]
- 理由のところ、教えてくれませんか
なんで()つけないとダメなのか。 というか中身にアクセスするときは()つけた方がいいんでしょうか
- 597 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:28:44 ]
- >>596
演算子の優先度
- 598 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 04:23:38 ]
- *po++ は *(po++) という意味だから、だな
- 599 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 04:48:37 ]
- 俺は演算子の優先度の表を暗記するだけの頭脳がないので、
決して、 *po++ ; なんてコードは書かない。 他人が書いたのを読まないといけないときは、優先度の表を見て確認する。 そもそも、後ろに++を付けるのは特別なときだけだし・・・。
- 600 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:39:19 ]
- *++p
- 601 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:40:46 ]
- ++(*po);
- 602 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:56:27 ]
- >>601
括弧イラネ
- 603 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:02:43 ]
- 優先順位覚えてないから付けといて
- 604 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:33:35 ]
- 左側に単項演算子二つで優先順位も糞もないだろ
- 605 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:52:24 ]
- むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける
- 606 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:55:25 ]
- >>605
それって何て逆ポーランド記法?
- 607 名前:デフォルトの名無しさん [2007/10/28(日) 23:15:58 ]
- ★改行が多すぎと言われたので、何度かにわけます。
構造体Sのvectorがあって、SのメンバdoubleDataに関してfindをしようとしています。 (#include <algorithm>しています) struct S{ string strA; int intData; double doubleData; }; findを使っているところは、こんな感じです。 vector<S>::iterator it; it = find(VecTest.begin(), VecTest.end(), 1.7); cout << (*it).doubleData << endl;
- 608 名前:デフォルトの名無しさん [2007/10/28(日) 23:16:34 ]
- ★続き
Boland55で、以下のようなエラーが出ます。 エラー E2094 c:\Borland\Bcc55\include\algorith.cc 72: != 演算子が使われたがクラ ス S では double 型のための定義が存在しない(関数 find<S *,double>(S *,S *,const double &) ) 警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'last' は一度も使 用されない(関数 find<S *,double>(S *,S *,const double &) ) 警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'value' は一度も 使用されない(関数 find<S *,double>(S *,S *,const double &) ) *** 1 errors in Compile ***
- 609 名前:デフォルトの名無しさん [2007/10/28(日) 23:17:24 ]
- ★続き
ちなみに、以下のような演算子オーバーロードをしているのですが、 何がよくないのでしょうか。 bool operator == ( const S& left, const S& right ) { return left.doubleData == right.doubleData; } bool operator != ( const S& left, const S& right ) { return left.doubleData != right.doubleData; }
- 610 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:32:46 ]
- find には 1.7 じゃなくて S を渡さんといかんのでは?
- 611 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:34:03 ]
- struct has_double
{ bool operator()(const S& s, double d) const { return s.doubleData == d; } }; find_if(VecTest.begin(), VecTest.end(), has_double(1.7));
- 612 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:36:44 ]
- まちがった
struct has_double { double d; has_double(double d) :d(d) {} bool operator()(const S& s) const { return s.doubleData == d; } };
- 613 名前:デフォルトの名無しさん [2007/10/28(日) 23:44:17 ]
- >> 612さん
コンパイル、通りました!すごい!! でも全く解読できましぇん。 一語一句の意味をこれから勉強します。。。
|

|