[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/05 14:43 / Filesize : 200 KB / Number-of Response : 965
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

D言語 Part18



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

まああの頃とは一味違うつもりなんで……不備は自分でどうにかできる、といいな。
>>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

こういう仕様なのかバグなのか。実装を考えればこの挙動は自然だけど……






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef