1 名前:デフォルトの名無しさん [2008/04/14(月) 15:16:22 ] プログラミング言語 D (D Programming Language) について語るスレッドです。 過去スレは >>2 ■本家 ttp://www.digitalmars.com/d/ ttp://www.kmonos.net/alang/d/ (和訳) ■コンパイラ ttp://www.digitalmars.com/d/dcompiler.html (DMD, 本家) ttp://dgcc.sourceforge.net/ (GDC, gccフロントエンド) ■参考URL ttp://f17.aaa.livedoor.jp/~labamba/ (D言語研究) ttp://f17.aaa.livedoor.jp/~labamba/?D%B8%C0%B8%ECBOF (D言語BOF) ttp://dsource.org/ (dsource) ttp://tinyurl.com/3da5oa (C/C++に疲れた人のD言語) ttp://www.kmonos.net/alang/wnd/ (わかったつもりになるD言語) ttp://shinh.skr.jp/d/ (SDL, SDL_*, OpenGL, GLU, glutのポーティングとか) ttp://shoo.s20.xrea.com/shoo/programing (D言語とTangoの入門講座) ttp://www.nicovideo.jp/mylist/4453698 (D言語で作られた芝ゲー niconico動画) ttp://www.asahi-net.or.jp/~cs8k-cyu/ (ABA Games) ■ IDE ttp://dronten.googlepages.com/dscite (DSciTE) ttp://forums.codeblocks.org/index.php?board=20.0 (Code::Blocks) ttp://www.dprogramming.com/entice.php (Entice Designer) ttp://www.dsource.org/projects/descent (Descent) ttp://www.dsource.org/projects/poseidon (Poseidon)
552 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:45:54 ] Constraintsって何か意味あるんですか? static ifで同じことができる気がするんですが
553 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:48:19 ] >>552 分けてかけることに意味があるんじゃない? よくわからんけど。
554 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:03:45 ] >>553 うーん、わざわざ構文拡張してまでやることなのかな… まあよく考えたら将来的な理由かもしれないし、 あんまりこだわらないことにします
555 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:36:32 ] スクリプト言語ひとつ覚えたんで、次は念願のコンパイル型言語を――と思って Dを狙ってるんですが、このスレ見る限りやめたほうがいいような気がしてきました。 この言語将来性あるんでしょうか? こんなに利用者にコケにされてる言語はじめてみた。
556 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:41:27 ] このスレは信者だらけだから、少なくともコケにはされてないだろ。
557 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:43:11 ] ……コケにされてるか? むしろこのスレでは愛されてると思うんだがな。 まあそれはさておき、バイナリ吐く言語使いたいなら素直ににC/C++やった方がいいと思うんだ
558 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:49:54 ] >555 初のコンパイラ方式をDにするのはやめたほうがいいのではないかと。 CかJavaかC#が良いと思う Dは、ある程度以上の実力者が戯れるのには最適な言語だと思う
559 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:00:03 ] いろいろできたのう // 特殊化 template factorial(int n) { enum factorial = n * factorial!(n - 1); } template factorial(int n : 1) { enum factorial = 1; } // constraints template factorial(int n) if(n != 1) { enum factorial = n * factorial!(n - 1); } template factorial(int n) if(n == 1) { enum factorial = 1; } // static if template factorial(int n) { static if(n != 1) enum factorial = n * factorial!(n - 1); else enum factorial = 1; } // CTFE int factorial(int n) { if(n != 1) return n * factorial(n - 1); else return 1; }
560 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:04:41 ] Java出身者にはテンプレートが魔法に見えるから困る これだけでチューリング完全とかw
561 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:11:52 ] なんというか、There's more than one way to do itって感じになってきたな…
562 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 00:37:59 ] もともとそういう志向はなきにしもだったからな でもテンプレート周りとかconst周りはmore than one wayだけでもないぜ。 コンパイル時に決定可能かどうかという重大な違いがある
563 名前:555 mailto:sage [2008/06/29(日) 00:48:50 ] 色々ありがとうございます。 言語仕様や標準ライブラリにいろいろけちつけるのは愛の鞭だったんですね。 初のコンパイラ型言語ってわけでもないので(Cを一通り。MinGWのWindows SDKにあちこち不備があるのが鬱陶しくなってやめた) 忠告を聞かずにDの世界に飛び込んでみます。
564 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 00:55:09 ] >不備があるのが鬱陶しくなってやめた ここがひっかかるw Dはそんなのの塊のような気がす
565 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 01:02:32 ] ゲーム作るのでなければwxDを使えばいくらか幸せになるかと
566 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 01:24:57 ] >>564 > >不備があるのが鬱陶しくなってやめた > ここがひっかかるw w まああの頃とは一味違うつもりなんで……不備は自分でどうにかできる、といいな。 >>565 GUIツールキットってメモリ喰いであまりいいイメージないんですよね。 せっかくWindows API結構覚えてるんで生で頑張ります。 と、ここまで書いてちょっと調べてみたらwxWidgetsって普通のGUIツールキットとはちょっと違うんですね。これは素敵かも。
567 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 11:58:28 ] メモリの配置を覚えるためにもやっぱC/C++あたりを使うのがいいだろうな CはやることやったらすぐC→C++でもいいと思うし
568 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:46:39 ] C++は時間の無駄だと思ってるからやっぱりDで
569 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:55:40 ] Dこそ時間の無駄で終わらなければよいが…って思ってる いつか仕事で使える日が来ることを期待してるが
570 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 13:11:16 ] 仕事で使わせてくれる会社に入ればいい
571 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 13:26:44 ] Hoge hoge = new Hoge(); SetWindowsLong(win, GWL_USER_DATA, &hoge); ってかんじでウィンドウにインスタンスをひも付けさせたら しばらくは使えるんだけど、そのうちインスタンスが まともにとれなくなるのはやっぱりGCのせい?
572 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 13:53:34 ] >>571 yes. どこかに参照を残しておかないとなくなる。
573 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:36:45 ] カーネルオブジェクトの中にある参照をGCが見つけられるわけがない
574 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 15:06:22 ] DのGCって、再配置型?
575 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:16:29 ] >>571 そもそもDのクラスは参照型なので、やるとしても Hoge hoge = new Hoge(); SetWindowsLong(win, GWL_USER_DATA, cast(void*)hoge); こうじゃないか? &hogeだとhogeの寿命が来た時点でダメになる気がする。
576 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:58:12 ] >>575 GreenPadのソースみながらウィンドウプロシジャ周り(0x042444c7の)をDでやろうとした時に引っかかったw 冷静になって考えれば簡単なミスなんだが。結構考え込んだ気がする。
577 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:25:48 ] GWL_USER_DATAでぐぐったらこのスレが出た。 9時間弱しか経ってないのにgoogleすごいな
578 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:31:21 ] 最近のゴッゴル先生とか凄いよな… 足りない情報を探そうと思ったら〜というのを探してますっていう昨日の自分の書き込みがヒットしたり…
579 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:56:57 ] 2chで質問して反応がないので、後日検索すると 自分の質問が検索結果のTOPにでる悲しさ
580 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 04:32:39 ] 最近のゴッコル先生は2chのクローリング頻度をやたら上げてるからな 2chで質問してから2時間くらいで自分の質問が引っかかったことがある しかし自分のブログは一切かからない
581 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 06:23:57 ] 更新頻度でクロール頻度も変えてたりするのかね
582 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 08:54:49 ] switch〜case で break 書かなきゃ下に降りちゃうの? こんなとこまでCを真似なくていいのに
583 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 09:08:02 ] caseで複数条件に対して一つの処理にしたいときにできないと困るじゃない
584 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 09:40:12 ] >>541 見て心臓が痛くなったんだけど訴えたら勝てるかな
585 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 09:54:58 ] すぐ下でびっくり系のブラクラって説明されてるのにクリックするなよ
586 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 10:17:15 ] 2ちゃんねる鉄の掟. 出されたご飯は残さず食べる。 転んでも泣かない。 おいら(ひろゆき)のギャグには大爆笑する。
587 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:46:30 ] >>583 switch(n) { case 1: ... case 2,3: ... case 4,5,6: ... } でいい
588 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:50:23 ] そんなことよりもほかの言語との整合性が取れなくなって余計なヒューマンエラーが発生することのほうが問題。 って我らがうぉるたーたんのお達しだ。諦めておけ。
589 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:52:13 ] まぁ、違う仕様にするならキーワードを case じゃなくて when にするとか しないと混乱するしな。
590 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 13:54:04 ] 個人的にはswitch_breakみたいな名前でも欲しい でも、無くてもそんなに困らないし、 そんなことよりライブラリをどうにか…
591 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:41:27 ] case 0..10とかできないのかな。VBみたいだけど。
592 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:14:06 ] いよいよ ... がほしくなる
593 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:23:22 ] vbといったらcase is
594 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:54:49 ] MPDさんのウィンドウは閉じないww
595 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:55:25 ] 誤爆すまぬ
596 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 03:47:38 ] >584 はbreak; って書かれても fall thru しちゃういけない子
597 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 05:58:54 ] switch (url) { case ブラクラ: if (res!=584) throw new bad_res; } こうですか?わかりま(ry
598 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 06:10:32 ] res = 584;goto case ブラクラ;
599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 10:50:14 ] nullオブジェクトにアクセスしたときにAccess Violationになりますが、 このときにうまくスタックトレースを取る方法がありますでしょうか。 flectionedを使うと例外の場合のスタックトレースは取れたのですが……
600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:43:35 ] そこはddbgじゃねーかな
601 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:13:59 ] 関数内で定義したローカル変数のポインタを返しても大丈夫ですか? int* Func(){ int Num = 10; return &Num; } みたいにした場合にスコープを抜けてもアドレスは有効なのでしょうか。
602 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:22:57 ] 今年のD言語カンファレンスは、スピーカが集まらなかったので中止に lists.puremagic.com/pipermail/digitalmars-d-announce/2008-July/009696.html il|li orz il|li
603 名前:601 mailto:sage [2008/07/02(水) 17:45:01 ] 自己解決。 良いわけないですね。コンパイルエラーになりました。
604 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:49:37 ] >>602 あらぁ…w
605 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:06:05 ] 東京でやってくれるなら喋りに行くのに。
606 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:37:56 ] ネタがないっす
607 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:40:31 ] 英語ミリ
608 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:52:24 ] >>602 え?どうせ行くつもりなかったけどいつ募集してたの?
609 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:57:19 ] >>608 普通にずっとNGで募集してたと思うが。
610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 21:56:38 ] 更新まだー?
611 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 01:03:37 ] おまいらNGって何で読んでる?
612 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 02:46:14 ] 俺はfirefox
613 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 06:42:09 ] thunderbirdで読んでる
614 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 16:28:12 ] D2.0とphobosでeliminateなどで使用する叙述関数に 任意の引数を渡したいのですが、可能でしょうか? void main(){ const int Value = 3; int[] Nums = [1,2,3,4,5]; Nums = eliminate!("a < Value")(Nums); } とか void main(){ const int Value = 10; int[] Nums = [1,2,3,4,5]; static bool Func(int Src, int Value){ return Src < Value; } Nums = eliminate!(Func(Value))(Nums); } のような事をやりたいのですが。
615 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 16:58:48 ] D2.0のstd.streamって使えないんですかね FileのreadLineをstringに渡そうと思ったら Error: cannot implicitly convert expression (input.readLine()) of ty pe char[] to invariant(char)[] とかエラーがでるから困る 標準ストリームはdin,doutでいいんだけど CFileを使うのは気が引ける。fopenとかいまさら使いたくないし
616 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 17:08:14 ] 時間ないから簡単に 前者はmixinで文字列生成 後者は static bool Func(int Value)(int Src){return Src < Value;} eliminate!(Func!(10))(Nums) とか? 試してないから間違ってたらごめん
617 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 17:10:44 ] ええい mutable typeからinvariant typeへは明示的な変換が必要だからidup string s = stream_.readLine().idup;
618 名前:615 mailto:sage [2008/07/04(金) 17:45:28 ] >>617 っていうか標準ライブラリなんだからinvariant仕様に直しとけと言いたい Fileをカプセル化した自前クラスで美味しくいただけそうです
619 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 21:35:03 ] std.stringは全部をconst(char)[]にしてもらいたい 更新まだかなぁ・・・
620 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 23:50:07 ] >>614 とりあえず成功する例 かっこ悪いのでbindとか関数リテラルがどのくらい効くのか教えていただけると助かります const int Value = 3; static bool func(int a) { return (a < Value); } void main(){ int[] Nums = [1,2,3,4,5]; Nums = eliminate!(func)(Nums); writefln(Nums); }
621 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 23:55:51 ] >>616 後者は動きました。 >614のコードにはめると eliminate!(Func!(Value))(Nums) で動きますね
622 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 01:33:35 ] Valueを用意する必要がないのでは? あえて定数に名前を付けたいのなら enum Value = 3; をおすすめ
623 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 01:34:07 ] あと std.bind はずっとぶっこわれ中
624 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 11:41:28 ] lazyな引数を関数外部に持っていく方法あったら教えてくれ〜
625 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 13:46:31 ] void delegate() dg; void func(lazy void a) { dg={return a;}; } これでいけると思うんだがコンパイラが死ぬな。 void func(void delegate()[] a...); でも使っとくといいと思う。
626 名前:614 [2008/07/06(日) 01:30:55 ] すいません、説明不足でした。 というか提示した例が悪かったです。 比較したいValueは動的な値です。 const int Value = 3; を int Value = 3; に置き換えた場合で考えて頂けますでしょうか。 C++でboost::lambdaを使った場合の int Value = 3; remove_if(Nums.begin(), Nums.end(), _1 < Value); のようなことがやりたいのです。
627 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 01:47:05 ] 謎さんとこのstd.expressionとか。
628 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 01:49:21 ] phobosのstd.algorithmはコンパイル時に決定してる関数しか受け付けないから不便だな。 とっとと、static引数導入してオーバーロードで関数ポインタとかも取れるように整理してほしいわ
629 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 03:06:20 ] 自分で書くしかなくね? import std.stdio; T[] removeIf(alias cond, T)(T[] arr) { T[] ret; foreach (i; arr) if (cond(i)) ret ~= i; return ret; } void main() { auto less3 = (int i){return i < 3;}; static bool greator3(int i){return i > 3;}; int[] arr = [1,2,3,4,5]; writefln(removeIf!((int i){return i<4;})(arr)); writefln(removeIf!(less3)(arr)); writefln(removeIf!(greator3)(arr)); }
630 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 03:12:21 ] closureあるから int j = 3; auto less = (int i){return i<j;}; これできるよ
631 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 03:26:59 ] 名前が付いてないとダメだってのは使い勝手が悪いな
632 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 08:29:38 ] 俺もそう思ってたが実は無名関数でもいけてる件
633 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:14:43 ] >>632 コードplz
634 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:05:28 ] >>629 のこれのことなのだが writefln(removeIf!((int i){return i<4;})(arr)); もしかしてphobosの話だろうか
635 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 17:20:20 ] こないだのアップデートからリテラルのaliasも取れるようになったんだっけか。
636 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 19:50:48 ] ああそれでか
637 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 21:17:26 ] 連想配列の clear ってどうやるですか?
638 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 21:33:51 ] 新しいのと取り替えればいいんじゃない?
639 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 22:03:14 ] これでよくなかったっけ int[int] a = [1:1]; writefln(a); a = null; writefln(a);
640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 22:23:11 ] それは空のと取り替えただけでクリアしたと言えるかは疑問だな。 もとのaの参照をどこかで持ってれば、そっちはクリアされないわけだし。
641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 22:38:19 ] foreach (key; aa.keys) aa.remove(key); じゃダメ?
642 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 02:05:06 ] 2.016まだかよー
643 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 13:24:28 ] >629 やりたかったのはまさにこれです。 ばっちりです。ありがとうございました。
644 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 13:47:40 ] D言語の配列は参照型だとあるのですが、引数で渡す場合は確かにrefを つけなくても参照で渡されているのですが、返値で返した場合って.dup されたものが返されてしまうのでしょうか? class CTest{ int[] Nums; this(){ Nums ~= 1; Nums ~= 2; Nums ~= 3; } int[] GetNums(){return Nums;} } void main(){ CTest Test = new CTest; int[] Nums = Test.GetNums(); Nums ~= 4; } でTest.Numsに4を追加したいのですが。 配列に限らずD言語で参照返しする場合ってどうやるのでしょうか。
645 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:22:17 ] もうすぐTango 0.99.7リリース来そうですね。 twitter.com/larsivi/statuses/851357615
646 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:58:32 ] >>644 Nums ~= 4; の直前と直後の配列のポインタを見てみるとわかるけど、インスタンスが変わっちゃってる。 # ということは、 ~= の演算子は配列のインスタンスに対する捜査ではなくて、配列のインスタンスを保存している変数に対する操作っていうこと…かな? classの場合は普通に返せる。配列だけは操作するときにインスタンスが同じものになるかどうか注意しなきゃいけない。 # 配列の要素を増やす時は違うインスタンスになる場合があって、配列の要素を減らす場合にはインスタンスは変わらない。 tangoのArrayBagみたいなクラスでラップすると幸せになれるかもしれない。
647 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 15:09:35 ] Core2DuoE6600の環境なんだけどstd.cpuid.amd64がtrue 笑っちゃった。俺の環境がおかしいのか?
648 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 16:06:54 ] >646 試してみましたが自分の環境では ~= の前後ではアドレスは変わらなかったです。 そして引数で渡したときはアドレスが変わらず、返値で返した場合はアドレスが 変わっていました。 class CTest{ int[] Nums; this(){ Nums ~= 1; Nums ~= 2; Nums ~= 3; } int[]* GetpNums(){return &Nums;} } void main(){ CTest Test = new CTest; int[]* pNums = Test.GetNums(); *pNums ~= 4; } と配列のポインタを返すようにしたらできました。 ただ、これだとGCがちゃんと返した配列のポインタを追ってくれるのかが不安だったり。 うーん、いまいち配列の扱いがわからない。 やはりクラスでラップするのが安全なのかなぁ。
649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 16:13:58 ] たぶん勘違いしてる、というか俺の伝え方が悪かった。すまん。 配列のポインタは Nums.ptr これで得られる。 codepad.org/tvVXZGEx ↑を参考にするとわかると思う。 # ちなみに、容量をリザーブしておくとインスタンスが変わらない。 # コメントアウトをはずすと同じポインタになる。
650 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 16:26:26 ] >>648 codepadの環境では、前後でアドレスは変わった。 codepad.org/Mxf3ifJm > Test.Nums: [401C3FB0] > main.Nums(before): [401C3FB0] > main.Nums(after): [401C2F80] 一応、仕様では「配列の連結は、 片方が長さ 0 の配列であっても必ずコピーを伴います」 だそうなので、Nums ~= 4; でローカルのNumsアドレスが新しい配列のものになるのが正常だと思う。 (つまり、参照先の配列インスタンス自体を連結演算によって変更するのは無理ってこと) 一個のメンバ変数を対象として変更する場合はメンバ変数への参照(ポインタ)を返してやればいいけど、 それだとTest.Numsの指す配列が他の変数によって参照されてたりするとやっかいな問題になると思う。
651 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 16:50:42 ] >>647 AMD64とEM64Tってほぼ互換じゃなかったっけ
652 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 16:53:20 ] >>649 > # ちなみに、容量をリザーブしておくとインスタンスが変わらない。 > # コメントアウトをはずすと同じポインタになる。 ホントだ。 Nums ~= 4; を Nums = Nums~4; とすると、アドレスが変わるようになる。 codepad.org/WetmPBdy アドレスが変わらない場合も、Test.Numsの長さが自動的に延びるわけじゃなくて、 スライスみたいなことになってるみたいだ。(Test.Numsには4は追加されない) codepad.org/cWJnruXE こういう仕様なのかバグなのか。実装を考えればこの挙動は自然だけど……