1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
792 名前:777 mailto:sage [2009/06/05(金) 15:44:42 ] >>779 ありがとう。コンパイル通るからいいのかと思ったけど やっぱり基本的には全部書かないとだめなのね。
793 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:45:04 ] 禿本と書いてても意味がわからんからスルーしてた スルーで正解だった
794 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:20:14 ] >>787 > 一番、二番目に出てくるならまだしも Googleを使わせるか否かを考えるのに「一番、二番目に出て来るかどうか」を基準にする、 怠惰な人間をつけあがらせる使命でもあるかのような考え方は理解不能だし、 悪いけど二番目の結果(環境依存OKスレの2スレ目)にこういう文章が出て来るぞ。 > 「プログラミング言語C++」は禿本と呼ぶ。 あ、"C++"と"禿本"をダブルクォーテーションで括る発想に至らないバカは考慮してないけど。
795 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:27:12 ] 質問です。どうしてこのスレには捻くれた奴が湧くんですか?
796 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:30:53 ] たとえばどのレスのことなのか例を挙げてくれないと、 本当にそういう傾向があるのか、自分のバカさを指摘されたバカが 必死にそう見ようとしてるだけなのか判断つかず、回答できないです。
797 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:31 ] >>792 2でもいいんだけどね。テンプレートパラメータは 宣言された範囲(テンプレートのスコープ)内では省略していいことになっている。 クラス定義の冒頭で template が宣言されていて、その範囲内に入っているので、 この場合のメンバ関数宣言のテンプレートパラメータは省略できる。 (Accelerated C++ p.197などを参照) template < class T > class foo { template < class T > foo &bar( foo<T> &t ); }; のような紛らわしい宣言も可能な様子。
798 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:34 ] >>795 捻くれものは大抵、過去に何らかの形で虐げられた経験がある あとはわかるな?
799 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:29:36 ] >795 C++自体が捻れた言語だからです。
800 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 15:12:48 ] >>797 全然別人なんだけど割り込んで聞いて良い? template < class T > class foo { template < class T > foo &bar( foo<T> &t ); }; ってのは要するに template < class T > class foo { template < class U > foo<T> &bar( foo<U> &t ); }; ってことだよね?
801 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:23:43 ] >>798 わかります。 現実の現在で叩きのめされたので、架空の過去を夢想して脳内逆襲ですね?
802 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:26:59 ] >>800 最初の方はgcc 4.2.1ではエラーになった。
803 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 21:46:37 ] (・3・) エェー。ぼじゅあるくっぷぷ(Visual C++)では問題なしだYO >>800 Yes。
804 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:04:24 ] 以下の変態プログラムでテンプレートパラメータの挙動についてご確認ください #include <iostream> using namespace std; template < class T > class foo { public: foo() : x( 0 ) {}; foo( foo *p ) : x( p ) {}; template < class T > foo &bar( foo<T> &t ){ cout << t.member << endl; return *x; } T member; foo *x; }; int main() { foo< int > base; base.member = 1000; foo< int > i(&base); foo< char > c; i.member = 1; c.member = 'a'; foo< int > r = i.bar( c ); cout << r.member << endl; }
805 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:02:33 ] 危うく騙されそうになったが return *xだから挙動自体は普通だな
806 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:28:11 ] r.memberが初期化されない…と思ったがコピーコンストラクタじゃないのか。
807 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:07:05 ] >>804 読むだけで疲労した。 barメンバ関数が何をやりたいのか意図が分からない (練習プログラムだから仕方ないことだが。) のに理解をじゃまされた。 分かって良かった。
808 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:38:25 ] >>807 >>797 の再現じゃないの?
809 名前:807 mailto:sage [2009/06/07(日) 12:56:34 ] >>808 ああそうなのか、ここのところこのスレ見てなかったから 全然流れを読んでなかったわ。
810 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:58:30 ] 下のように、クラスAAのインスタンスを、メモリーに割り当てたときに。 コンストラクタとデストラクタをどうやって起動したらいいのでしょ? class AA { int i1,i2; AA(); ~AA(); } void func() { char dat[100]; AA *dat; dat = (AA *)dat; }
811 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:02:17 ] コンストラクタ new(dat) AA(); デストラクタ dat->~AA();
812 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:11:53 ] AA * dat = new AA[100]; delete[] dat;
813 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:38:59 ] 上の例、バッファーとポインターが同じでした、ミスすみません >>881 下記のようにうにエラーになります >>812 100個のインスタンスを作るわけではないです class AA { int a1,a2; public: AA() { printf("AA コンストラクタ\n"); } ~AA() { printf("AA デストラクタ\n"); } }; int _tmain(int argc, _TCHAR* argv[]) { char buf[100]; AA *datp; datp = (AA *)buf; new(datp) AA(); // ここがエラーになる… datp->~AA(); return 0; } エラー 1 error C2660: 'operator new' : 関数に 2 個の引数を指定できません。
814 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:39:55 ] #include <new> が抜けてるだろ
815 名前:デフォルトの名無しさん [2009/06/07(日) 14:41:49 ] atnd.org/events/702 124.45.27.25:12086/stream.mp3.m3u IRCNET #CRYBUTSU
816 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:55:53 ] >>814 できました、ありがとうございます。
817 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:12:11 ] ローカル変数に対するplacement newって、アラインメントを気にする必要がなかったっけ?
818 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:16:19 ] 気にする必要があると思います。 実際のプログラムは、sizeof で確認をしています
819 名前:デフォルトの名無しさん [2009/06/07(日) 16:27:09 ] std::vector のようなコンテナを作ろうと思うんだが、 要件について詳しくまとまってるページない?
820 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:49:49 ] 規格を読め
821 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:55:54 ] 別にinterfaceクラスを継承してるわけでもないし、 要件なんて無いぞ。
822 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:05:30 ] 要するに value_type なんかの必須 typedef や 領域確保時の用件とかを知りたいんじゃろ? 領域確保に new を使っちゃらめとか、 知らないとはまる部分もあるしー。
823 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:09:05 ] >>819 www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf の23.2.6をしっかり読むこと。 SGIのドキュメントはまとまっていて良かったんだが、最新の仕様と乖離してるのかな。 www.sgi.com/tech/stl/Vector.html >>821 馬鹿か?
824 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:17:18 ] >>820-823 トンクス
825 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:21:58 ] >>821 ちょwww
826 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:02:35 ] >>769-770 >>775-776 このレスで出てきている多重例外「例外ハンドラで例外が出ること」についてですが、 try {foo();}//適当な例外を投げる関数 catch(const std::exception& ex) {throw 42;}//ここが多重例外 ってことですよね? では try {foo();}//適当な例外を投げる関数 catch(const std::exception& ex) {throw ex;}//ここは? この様に例外を再送する場合も多重例外となり未定義の動作ですか? また、再送する場合{throw;}と書いても未定義になりますか?
827 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:33:06 ] >>826 >770や>776は何か勘違いしているような・・・。 例外ハンドラ(catch節)で例外を投げるのは正当。 多重例外というのはもっと異常な事態で、 例外によるスタックの巻戻し中にデストラクタがさらに例外を投げたとか、 値渡しのcatchへ例外をコピー中にコピーコンストラクタが例外を投げたとかのことを言い、 そういう時でも未定義ではなく、terminate()が呼ばれるんじゃなかったっけ?
828 名前:==775==826 mailto:sage [2009/06/07(日) 20:20:29 ] とりあえず例外の再送出は問題ないと分かれば当面は解決です。ありがとうございます。 >>827 >例外によるスタックの巻戻し中にデストラクタがさらに例外を投げた は、 私(>>775 )の言う >アクティブな例外が2つ以上同時に発生すること ってヤツですよね。 この場合は未定義だとEffective C++で紹介されています。 しかし デストラクタからの例外送出::実装技術 ttp://cppemb.blog17.fc2.com/blog-entry-31.html ここによると >デストラクタから例外を送出するクラスAのオブジェクトを自動記憶域で宣言し、 >その生存期間内で他の例外が発生した場合、A::~A()が呼び出されて、 >その中でまた例外が送出されます。これは二重例外と呼ばれ、 >問答無用でstd::teminateが呼び出されます。 >次に、デストラクタから例外を送出するかもしれないオブジェクトを >静的記憶域期間で宣言した場合を考えてみてください。 >静的記憶域のオブジェクトを監視ブロック(try〜catchの制御文)で囲む構文を >記述することはできません。すなわち、こちらはデストラクタから例外が発生した >時点で(std::terminateの呼び出しではなく)未定義の動作になります。 と書いてありますが、果たして何がどうなんでしょうね。
829 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:16:02 ] catch節で例外を受けた場合、受け取った例外を再送するか、 受け取った例外を破棄して別の例外を送出するしかなくて、 結局、伝播する例外は1つだけになるので問題ない。 それ以外で例外伝播中に他の例外が発生すると、 2つの例外を伝播させなければならなくなるけど、 それはできないことになってて、かわりにstd::terminate()が呼ばれる。
830 名前:828 mailto:sage [2009/06/07(日) 22:14:01 ] >>829 ・・・としますと Effective C++の未定義だという記述の方が誤りで、 デストラクタからの例外送出::実装技術 ttp://cppemb.blog17.fc2.com/blog-entry-31.html の方が正しいと言うことでしょうか?
831 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 03:03:48 ] 多重例外が未定義動作だなんてどこに書いてあった?
832 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 05:20:46 ] デストラクタで例外を投げてもちゃんと動作は定義されている 意味のある(まともな)動作をさせるのが困難というだけ
833 名前:828 mailto:sage [2009/06/08(月) 06:59:07 ] >>831 Effective C++ 原著第3版 p39末行 〜p40頭の数行 にかけて、はっきりと未定義と書かれています。 >>832 それもEffective C++で上と同じ節に書いてあります。
834 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 08:03:12 ] >>830 静的記憶域期間を持つオブジェクトがデストラクタで例外送出したらterminateじゃなかったっけ と思ったら「staticでnon-local」はterminateらしい 「staticでlocal」は記述が見当たらねぇ…
835 名前:828 mailto:sage [2009/06/08(月) 16:14:44 ] そしてまあ困ったことに、たしかVC2008とかの有名どころですら 複雑な例外処理の仕様は、正確には実装されていないと聞いたことがあります。 結局は多重例外になるという状況を作らないように気をつけていくしかないのでしょうかね。
836 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:14:03 ] >>833 そこは仕様書を持ち出すべきだろ。
837 名前:828 mailto:sage [2009/06/08(月) 21:15:40 ] >>836 私は仕様書を持ってないんですよ。 趣味グラマなもんでして。
838 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:22:44 ] 例外処理の実装を詳しく説明している書籍は何がありますか?
839 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:26:27 ] more exceptional C++
840 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:55:50 ] >>837 興味があるならタダで見られる、日本語で。 www.jisc.go.jp から規格番号X3014。
841 名前:837 mailto:sage [2009/06/08(月) 21:58:59 ] >>840 ありがとうございます。 なんとかDLしたいものですが、ガードされているようですね。 必要に応じてWEBで見るようにします。
842 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 23:40:41 ] FDISでよければこことか ttp://www.kuzbass.ru/docs/isocpp/ 15.5.1に >when the exception handling mechanism, >after completing evaluation of the expression to be thrown but before the exception is caught, >calls a user function that exits via an uncaught exception, >... >In such cases, void terminate(); is called. とあるから、terminate()が呼ばれるのは間違いないと思うのだが、 Effective C++には確かに未定義っぽいことが書いてあるし… 英語版でもそうなのかなあ
843 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 00:25:07 ] しかし、デストラクタで例外なげるようなプログラムなんて書く訳無いし、あんまり気にしすぎても仕方ないよ。 いえ、ごめんなさい。
844 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:20:17 ] 関数テンプレートがインスタンスを指定することによって実体化できるのに対し、 クラステンプレートは型名を指定しないと実体化できないところに不便さを感じます(boost::rangeとか特に)。 何かいい方法はないですかね?
845 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:26:59 ] そのためのtypedefだろ?
846 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:27:22 ] クラステンプレートは、型を引数に取って型を返す関数
847 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:35:16 ] >>846 TMPか。
848 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:40:37 ] >>844 std::make_pairやboost::make_iterator_rangeのように関数テンプレートでラップすればいい。
849 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:41:43 ] >844 関数テンプレートもインスタンスで指定しているわけじゃないぜ。単に引数の型を推論しているだけ。 #動的な型は対応できない どうしてもというなら関数テンプレートでラッパー作ればよろし。
850 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:05:43 ] >>845 型指定するのが手間に思えます。型推論してくれないかなと。 >>846 関数の引数をテンプレートに変更してもそのまま使えるのに、クラスのメンバ変数をテンプレートにすると使う側に手間が増えるのが不便に感じます。 >>848 makeXXXの戻り値を受け取るところで結局型指定が必要になってしまいます。 >>849 書き方が悪かったです。 template<class T> void F(T t); template<class T> class C { T t_; public: C(T t):t_(t){} }; F(hoge);// hogeを簡単に渡せる C<Hoge> c(hoge);// 型を指定しないと渡せない この違いを埋めることってできないですか? rangeを渡す時、後者はめんどくさく感じて仕方ないです。
851 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:13:14 ] >>850 > F(hoge);// hogeを簡単に渡せる > C<Hoge> c(hoge);// 型を指定しないと渡せない どう書ければうれしいの?
852 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:31:30 ] >>851 Hogeを書かなくてよくなればうれしいです。 言語の仕様上、Cを非テンプレートクラスにするしかないですかね。 boost::any使っても値を取り出すことができないし、うーん・・・。
853 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:49:02 ] class B{public:virtual B&fn()=0;}; template<T>class A:B{public:T t_;A(T t);B&fn();}; class C{A&a;public:template<T>C(T t):a(C<T>(t)){};B&fn(){return a.fn();}}; 実現しようと思えば物凄く面倒。
854 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:53:56 ] >>852 つまりこういうこと? C<> c(hoge);
855 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:04:50 ] >850 F(hoge)のhogeはどのみち静的な型になってるだろ。 C<Hoge>とするのに比べてそんなに汎用性が高くなっているわけじゃないよ。 型を推論してくれるから面倒なことは少ないけど。まあ、素直にC++0xのauto待ちでいいんじゃね?
856 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:40:44 ] >>853 頭がクラクラしてきます。 >>854 そのコードが許されれば大満足です。 >>855 単純に入力の手間の問題ですね。 boost::range使っていて、コードを書いてる時に型を意識しないといけないのはつまらないなーと思いました。
857 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:54:20 ] 100万回呼ばれるメソッドがあったとして Hoge * f(...) Hoge & f(...) ってどっちがお得なのでしょうか?
858 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:00:24 ] コンパイラしだいだけど、大体、どっちもいっしょ。
859 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:02:27 ] 100万回程度ならどっちも同じ。
860 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:17:43 ] >>859 ? じゃあ1無量大数回なら?
861 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:24:23 ] 呼び出しの時間なんて気にするなってことだろjk マイクロ秒で競ってどうするんだよ…
862 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:06:29 ] 呼び出し側にも依るが、参照とポインタだけの違いならまったく同じバイトコードになる可能性が高い 参照なんてのは結局ただのポインタだからね
863 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:11:09 ] 参照の場合はコンパイル時のチェックがかかるだけで、バイナリは同じものになるって話を聞いたことがあるが・・・ ホンマかいな
864 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:12:05 ] コンパイルの時間まで考慮するならHoge*f(...)の方が早くなる可能性があるな
865 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 05:24:40 ] >>863 絶対じゃないだろうが、その可能性はあるでしょうな。 参照はどう実装しても良いわけで、 別に参照はポインタを用いて実装されているという保証はない。 だが普通ポインタを用いて実装するので、。
866 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:13:43 ] TCP/IPのソケット通信プログラムなのですが connectを実行し、接続確認にsendとrecv を行っているのですが、recvでソケットエラー が発生し、GetLasterrorでエラーコード を取得すると「既に使われている(183)」でした。 何故こんなエラーになるのか分からず 困っています。どなたか教えて下さい。
867 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:08:03 ] 環境がわからないし、エラーは正確に書くべき。
868 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:09:46 ] WSAGetLastError呼べよ
869 名前:866 mailto:sage [2009/06/10(水) 19:33:58 ] >>867 送信先:Windows2003Server 送信元:WindowsXP 開発:VC2005 recv()の戻り値が-1 WSAGetLastErrorでエラーコードを取得したら 183だった。 ということですm(_ _)m >>868 すまん、WSAGetLastError使ってた。
870 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 20:26:54 ] wineをみるとWSAGetLastErrorとGetLastErrorは同じものです。 recvのすぐ後でミューテックスをロック/アンロックなどを しているんではないですか?
871 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:06:23 ] class MyClass { protected: struct foo_t{ struct bar_t{ }foo; };
872 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:10:14 ] すみません。途中で書き込んでしまいました。 class MyClass { protected: enum {NUM = 5}; struct foo_t{ struct bar_t{ }bar[NUM]; }foo; }; VC6で上記コードをコンパイルすると、NUMにアクセスできないというエラーが出ます。 NUMをpublicで定義すると大丈夫です。 構造体の入れ子になった場合はpublicでないとアクセスできないのでしょうか? class MyClass { protected: enum {NUM = 5}; int foo[NUM]; }; ちなみにこちらは問題ありませんでした。
873 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:13:49 ] bar_tを外で宣言するか foo_tに適切なコンストラクタを用意すれば良い
874 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:09 ] gcc4.2.1なら大丈夫
875 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:18 ] レスありがとうございます。 fooはPOD型であってほしいので、コンストラクタを用意するのは望ましくないです。 後出しですみません。 bar_tを外で宣言するというのはどういうことでしょうか?
876 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:21:33 ] >>874 VC6なのでenumハックを使っています。
877 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:39:37 ] VC6なんて窓から投げ捨てろ
878 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:40:35 ] >>876 VC6はもうVC6言語だと思った方がいいくらい、標準と違う。 そんなクソ環境、捨ててしまえ。
879 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:48:19 ] eclipseとgccにすればっ
880 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:01 ] VCのお手軽感捨てたくなければ最新のExpressって手もあるな VC6はリソースの編集専用にすればよろし
881 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:07 ] 全く持ってその通りなんですが、納品先がVC6で開発してるものでorz
882 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:54:53 ] 納品先を捨ててしまえ!、え?、違うって(ry
883 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:59:41 ] publicにすればビルドできるのでそうしときます
884 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:06:36 ] gccってfriendつけないでも平気なんだ 知らなかった
885 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:11:06 ] 今、双方向のリスト構造のテストプログラム組んで思ったんだけど int main{ // hpはノードのポインタ型 //--上・省略-- hp = hp->next; //--下・省略-- } っていう風にやったら普通にうまくいくんだけど、 これを関数かしてやって void gotoNextNode(Node* pnode){ pnode = pnode->next; } int main{ // hpはノードのポインタ型 //--上・省略-- gotoNextNode(hp); //--下・省略-- } ってやったら「pnode = pnode->next;」の部分が効かないみたいなんだけどなんでだろorz?
886 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:14:28 ] それは、ローカル変数に入れても、なにもならん
887 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:15:48 ] gotoNextNode(&hp);
888 名前:885 mailto:sage [2009/06/11(木) 00:18:06 ] ノードのポインタ型は下のようになってて typedef struct _Node{ int num; struct _Node *next; struct _Node *back; }Node; ポインタ渡してるからいけるんじゃね?・・・って思ったんだけどさ
889 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:19:12 ] *pnode = pnode->next; じゃなくて?
890 名前:885 mailto:sage [2009/06/11(木) 00:20:06 ] んで、hpはNode* hpで定義してます
891 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:20:53 ] void gotoNextNode(Node* &pnode){
892 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:22:51 ] C++ならポインタのリファレンスが使えるから gotoNextNode(Node*& pnode)