トップページ⇒tech
962コメント242KB

D言語 Part24

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/01/26(火) 00:06:57
プログラミング言語 D (D Programming Language) について語るスレッドです。

■前スレ
http://pc12.2ch.net/test/read.cgi/tech/1253443684/

■本家
ttp://www.digitalmars.com/d/
ttp://www.kmonos.net/alang/d/ (和訳)

■コンパイラ
http://www.digitalmars.com/d/dcompiler.html (DMD, 本家)
http://dgcc.sourceforge.net/ (GDC, gccフロントエンド)
http://www.dsource.org/projects/ldc (LDC, バックエンドにLLVM)

■参考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/candcpp2d2 (C/C++に疲れた人のD言語2.0)
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)
ttp://dusers.dip.jp (D言語友の会)
ttp://www.wish.sakura.ne.jp/desuno/game/Drawing (PrincessDrawing! D言語で作られた横スクロールSTG)

>>2へ続く
0655デフォルトのD言語er651さん2010/06/12(土) 22:00:22
>>654
>>649は"undefined"を書き忘れたのかと思ったから、言ってみた。

"identifier"ってエラーは実は見たこと無いんだ。
0656デフォルトの名無しさん2010/06/12(土) 22:23:03
>>639
オレは逆にDFLのsubversion開発版を使うことでdmd2の最新版で動くようになったぞ。
0657デフォルトの名無しさん2010/06/12(土) 23:50:51
D1.0使ってます
プロパティって+=演算とかに対応してないんですか
0658デフォルトの名無しさん2010/06/13(日) 00:54:23
まだしてない
する予定はあるらしい
0659デフォルトの名無しさん2010/06/13(日) 00:55:30
あ、1.0なら今後も対応することはないか
06606572010/06/13(日) 02:09:50
そうなんですか・・・残念
0661デフォルトの名無しさん2010/06/13(日) 05:06:42
>>656
あれー?おかしいなあ。
入れ直してみる。
0662デフォルトの名無しさん2010/06/13(日) 12:46:20
5/16のスナップショットなら2.061では動かないよって明記されてた気がするな
0663デフォルトの名無しさん2010/06/13(日) 14:30:12
>>662
2.061だと?
0664デフォルトの名無しさん2010/06/13(日) 15:15:15
dmd 2.047 update
0665デフォルトの名無しさん2010/06/13(日) 15:37:04
>>663
D1と混ざってました
生まれてきてすいません
0666デフォルトの名無しさん2010/06/13(日) 17:27:30
俺の方こそすみませんでした
06676492010/06/13(日) 20:12:05
わかりました。
mixinを使用したファイルでもtemplate内で使用される別ファイルで定義されてる関数等は同じようにimportが必要なだけでした。
mixn使えばimportが延々と並ぶの防げるかなーとか考えてたんですが・・・・
単なる勉強不足でした。

0668デフォルトの名無しさん2010/06/13(日) 21:43:25
phobosの改訂ということで久々にマニュアルを見直してみたら、
std.range.zipとstd.range.recurrenceはD言語の象徴的機能という感じだな。
std.range.zipあたりは素でこういう機能が欲しかったという感じなので、
なんというか感動的でさえある
C++で似たようなことをやるときはインターフェースとなるクラスにはめてからこういう操作やってたが、
型情報保存済みで素で出来るようになるというのが恐ろしい
0669デフォルトの名無しさん2010/06/13(日) 22:31:29
>>668
ttp://p-stade.sourceforge.net/oven/doc/html/oven/utilities.html#oven.utilities.zipped
0670デフォルトの名無しさん2010/06/14(月) 20:08:09
コンソール非表示でwriteflnで標準出力してると
Bad file descriptor例外が出るんですけど何か回避方法は無いんでしょうか。
Poseidonのオプションの[-L/SUBSYSTEM:windows:4]を使っているせいかな?
dmdのバージョンは2.039です。
0671デフォルトの名無しさん2010/06/15(火) 21:02:55
char[]型の変数に文字列を代入し、あとでファイルに書き出してみると中身が破壊(文字化け)されている事があります(代入直後に書き出せば正常)。
同じプログラムを何回も実行すると文字化けする時と正常な時があり、実行時にエラーはでません。
どういった原因が考えられるのでしょうか?
0672デフォルトの名無しさん2010/06/15(火) 21:04:58
文字コードが混在
0673デフォルトの名無しさん2010/06/15(火) 21:08:05
std.time復活の兆しがある…のか?
0674デフォルトの名無しさん2010/06/15(火) 21:40:13
>>671
その変数の中身が他所から書きかえられてるのかなぁ
単純なプログラムなら調べもつくんだろうけど
0675デフォルトの名無しさん2010/06/15(火) 21:42:35
D1なら文字列もmutableだから元の文字列が書きかえられてるのかも
代入といってもコピーされるわけじゃないから

char[] b = "test";
char[] a = b;
b[1] = '*';
writefln(a); // t*st
0676デフォルトの名無しさん2010/06/15(火) 21:50:29
>>672
代入直後なら文字化けしないので、文字コードの問題ではない気がします。
>>674
簡単なテストコード書いても再現しないんですよね。
原因を特定するのが難しいです。
>>675
すみません、ただの代入ではなく
char[] str = "ほげ".dup;
のように複製してます。
そして、strを他の配列にはコピーしてないです。
コンパイラはdmd2.041です。
0677デフォルトの名無しさん2010/06/15(火) 21:56:07
BufferedFileが渡したものをバッファにコピーしないでそのまま持ってくれるせいで
破棄されたポインタを使おうとしてハマったりとかあったけど、この場合関係なさそうだな

2.041って配列にappendしたものをGCがカウントミスって回収しちゃうバグがあったような
GC offにして試してみたらどうだろう
0678デフォルトの名無しさん2010/06/15(火) 22:17:33
>>677
まさにそれでした!
GC.disable();
としたら、何度やっても文字化けしなくなりました。

どうもありがとうございました。
0679デフォルトの名無しさん2010/06/15(火) 22:42:05
まったくD2は地獄だぜフゥハハハー
0680デフォルトの名無しさん2010/06/16(水) 05:39:12
670の人もそうだけどなんでそんな古いバージョン使ってるの?
一つ前とかなら分かるんだけど…
0681デフォルトの名無しさん2010/06/16(水) 05:46:40
Dで問題が発生したときに疑うべき順番

- DMD
- Phobos
- ユーザコード
0682デフォルトの名無しさん2010/06/16(水) 05:48:44
2.041はGCにバグがあって半月もせずに次が出たのに、なんでそんなものを未だに使ってる人がいるのか
0683デフォルトの名無しさん2010/06/16(水) 05:53:09
>>678
最新版……dmd2.047にアップ。

GC.disable(); しなくても文字化けしない。
0684デフォルトの名無しさん2010/06/16(水) 07:34:40
Previous Definition Different : _D5tango4text4Text11__T4TextTaZ4Text4Span6__initZ
ってエラーがでたんですが、何を追えばいいのかわかりません。

2回定義されてるって感じのエラーだと思うんですが、具体的にコードのどの部分かを知る方法ってないでしょうか?
0685デフォルトの名無しさん2010/06/16(水) 08:10:34
>>684
Tango……。
あんまりTangoを使うことオススメ出来ないな。

D2 + phobos はGood
0686デフォルトの名無しさん2010/06/16(水) 08:37:39
>>684
bugzillaによるとそのバグ修正されてるからTangoの環境によるのかなぁ
xfBuildのissue見てるとobjとlibで被っているとかあったけど,どれが原因かは分からんね
06876852010/06/16(水) 08:41:40
結論、Tangoは使うな!

と思うのは俺だけじゃないはず。
06886782010/06/16(水) 10:46:55
>>680,682,683
新しいverを入れると既存のコードのコンパイルが通らなくなって、修正するのが面倒くさくて、つい先送りに・・・。

今回も2.047にするとstd.rangeのTakeやらRetroでコンパイルエラーが発生して直し方がわかりません。
2.046なら、今作ってるプログラムは1箇所簡単な修正で済んだので、とりあえずはこれで・・・。
0689デフォルトの名無しさん2010/06/16(水) 20:16:16
D1のtangoのコードをphobosに置き換えてみたら簡潔になりすぎて吹いた
特にファイルパス周りがヤバい
std.pathは合理的だわ、std.fileへの関数の振り分け方の基準が謎だけど

でもtraitsとか使ってるとD2が欲しくなるなぁ
0690デフォルトの名無しさん2010/06/16(水) 20:45:43
そんな楽しげなD2組を指咥えてみてるD1な俺がここに
0691デフォルトの名無しさん2010/06/17(木) 04:02:50
ようやく alexandrescu の本が出たわけだが、どうよ?
ttp://www.amazon.co.jp/D-Programming-Language-Andrei-Alexandrescu/dp/0321635361
0692デフォルトの名無しさん2010/06/17(木) 04:38:19
いつのバージョン準拠なんやろ(笑)
0693デフォルトの名無しさん2010/06/17(木) 21:04:53
英語読めないんだぜ俺
0694デフォルトの名無しさん2010/06/17(木) 21:33:16
英語ちゃんと勉強しておけばよかった
0695デフォルトの名無しさん2010/06/17(木) 23:12:06
>>692
確かにな、いつのバージョンだろ(笑
この2ヶ月でけっこー大きくphobosが変わったからな。
買うの危険?
0696デフォルトの名無しさん2010/06/17(木) 23:26:26
少なくともstd.containerの使い方はわからないだろうな
0697デフォルトの名無しさん2010/06/18(金) 01:31:24
C:\dmd\dmd\bin\..\..\src\phobos\std\functional.d(176): Error: static assert "Bad binary function q{a == b}. You need to use a valid D expression using symbols a of type dchar and b of type string."
C:\dmd\dmd\bin\..\..\src\phobos\std\functional.d(179): instantiated from here: Body!(dchar,string)
C:\dmd\dmd\bin\..\..\src\phobos\std\algorithm.d(1984): instantiated from here: result!(dchar,string)

これってPhobosとdmdのバージョンがあってないんですかね?
0698デフォルトの名無しさん2010/06/18(金) 07:08:37
テンプレートに渡すパラメタを間違えただけという気も
最近のdmdは一番大元の呼び出し元も教えてくれるんだっけ?
06996952010/06/18(金) 10:49:52
>>696
std.containerが出たのは、つい最近だかな・・・。
dcollectionをphobosに入れたくないからって、
事前予告もなしに急に出てきたし。

それにミカン・・・。

>>643
同意。
0700デフォルトの名無しさん2010/06/18(金) 19:19:47
C++をガリガリ書いてる人ですらAlexandrescu博士のコードは難解すぎると嘆いているというのに
誰ぞインタフェース部分を乗っ取って博士のコードを内側に追いやってくれないかのう
0701デフォルトの名無しさん2010/06/18(金) 19:22:54
例外ってどこで発生したかって情報もってないんですかね?
0702デフォルトの名無しさん2010/06/18(金) 19:33:21
new Exception("", __FILE__, __LINE__);
とかやらない限り無いねぇ
そして大抵は__FILE__も__LINE__も抜きに例外が投げられてる

アプリがどこで落ちたのか知りたい場合は-gオプション付きでコンパイルして
ddbg辺りで実行するなりすればいいと思う
0703デフォルトの名無しさん2010/06/18(金) 23:53:29
>>701
スタックトレースが最近入ったからそれで頑張ってくれ
0704デフォルトの名無しさん2010/06/19(土) 02:41:41
>>703
あれってなんなの?
どうすればスタックトレースを見られる?
0705デフォルトの名無しさん2010/06/19(土) 11:03:36
今のところ見たことがない
Windowsで見る方法あるの?
0706デフォルトの名無しさん2010/06/19(土) 19:27:31
パッチ見る限りLinuxだけみたいだが
0707デフォルトの名無しさん2010/06/19(土) 23:56:50
import std.stdio;
import std.date;
d_time now = getUTCtime();
d_time old = now - ticksPerSecond * 60 * 60 * 24 * 365;
writeln(toString(old), toString(now));

Wed Jun 02 14:05:44 GMT+0000 2010Sat Jun 19 14:46:13 GMT+0000 2010

1年前の日付が表示されるつもりが、17日前の日付が表示されます。
どこが間違っているのでしょうか?それともphobosのバグ?
0708デフォルトの名無しさん2010/06/20(日) 00:10:15
ticksPerSecondの型がenumデフォルトでintになってるせいで
>ticksPerSecond * 60 * 60 * 24 * 365
これがオーバーフローしてるみたいね
0709デフォルトの名無しさん2010/06/20(日) 00:22:26
>>708
なるほど。thxでした。
07107012010/06/20(日) 21:17:07
>>703
Linuxだけっすか・・・・
0711デフォルトの名無しさん2010/06/23(水) 00:46:22
D1で改行コードCR設定のcygtermでreadlnすると
Enter入力してもreadlnから抜けない気がする
↓をコマンドプロンプトで実行するとEnter毎に!が出るけど
 cygtermだと何もでない。readlnが入力全部食ってる気がする


import std.stdio;
import std.cstream;
void main()
{
char s[];
while((s = readln()) !is null){
dout.writefln("!");
}
}


※cygterm=cygwinにteratermで接続するやつ
0712デフォルトの名無しさん2010/06/23(水) 00:50:55
↑ちなみに生のcygwinだとEnter毎に!が出る(たぶん改行コードCRLFで行ってる)
readlnは改行コードCRLF、CR、LFに関わらず一行として認識すると
書いてあった気がするのだけどCRだけだとだめなんかね
0713デフォルトの名無しさん2010/06/23(水) 13:24:38
CR+LF, LF は LF だけ判定すれば間違いないが、
CR のみ判定しようとすると、LFが来るか来ないか待たないとダメだからな。
0714デフォルトの名無しさん2010/06/23(水) 13:36:09
いや、CR のみと CR+LF 併用の場合は、
CR 見た瞬間改行扱いにして、次のLFを無視するようにすればいいか。
ただ、CR 改行って Mac でしか見たことないんだよなぁ。
0715デフォルトの名無しさん2010/06/24(木) 05:45:57
Access Violationってどんな時にでるんでしょうかね?
dwtのドラッグする時にラベルのテキスト取りにいったら落ちるんですが
char[]を返してるだけなんですよね。
多分。



0716デフォルトの名無しさん2010/06/24(木) 05:53:57
dmd1でクロージャしちゃったのが原因でした。失敬。
0717デフォルトの名無しさん2010/06/24(木) 07:21:15
dwtはTable上からドラッグしたら本当にバグで落ちたりする
0718デフォルトの名無しさん2010/06/24(木) 09:41:13
自分もdwt使ってるんですが、Treeのノードのドラッグって実装途中なんでしょうかね?
サンプルもないし、SWTのソース流用してもdragStartすら呼ばれんのですが・・・
0719デフォルトの名無しさん2010/06/24(木) 20:27:22
DWT+tango 0.99.9でやってるけど出来るなぁ
TableのはバグってるけどTreeのドラッグは修正した記憶がない
0720デフォルトの名無しさん2010/06/24(木) 21:13:26
>>719
なんかおかしな点ありますか?
Listでやるとこのままでもうまくいくんですが・・・。
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
// Create the drag source on the tree
DragSource ds = new DragSource(tree, operations);
TextTransfer[] t ;
t ~= TextTransfer.getInstance();
ds.setTransfer(t);
ds.addDragListener(new class(tree) DragSourceAdapter {
Tree tree;
this(Tree _tree) {
this.tree = _tree;
}
void dragStart(DragSourceEvent event) {
Stdout("drag").newline;
event.doit = (this.tree.getSelection().length != 0);
}
public void dragSetData(DragSourceEvent event) {
Stdout("dragSetData").newline;
// Set the data to be the first selected item's text
auto txt = new ArrayWrapperT!(char)(this.tree.getSelection()[0].getText());
event.data = txt;
}
});
0721デフォルトの名無しさん2010/06/24(木) 21:55:13
本当だ動かない…
でも手元のプログラムのツリーではちゃんとドラッグできる
えええ何でやねん

TreeItemに画像を設定したり
DropTargetもつけてみたり
TextEditorをくっつけてみたり
してみたけどやっぱりできないな
何が違うんだ?
0722デフォルトの名無しさん2010/06/24(木) 21:59:10
-L"/su:console:5"をつけてコンパイルしたら動いた!

…何でやねん
0723デフォルトの名無しさん2010/06/24(木) 22:05:47
ほんとだ・・・
ありがとうございます!
0724デフォルトの名無しさん2010/06/25(金) 10:47:53
質問を連投してすいません。
コンストラクタでドラッグリスナーの処理を行うと落ちます。エラーメッセージは
dwt.DWTError.DWTError: Cannot initialize Drag

ですが全く同じ処理を、コンストラクタから抜けた直後に書く(関数を呼ぶ)と普通に実行出来ます。
auto tree = new CTree(shell);
tree.init(); <-ドラッグ処理
コンストラクタって何か気をつけてないといけない事があるんでしょうか?
0725デフォルトの名無しさん2010/06/25(金) 19:24:06
エラーメッセージでgrepかけたらこんなコードに行き当たった

>public this(Control control, int style) {
> super(control, checkStyle(style));
> this.control = control;
> if (control.getData(DND.DRAG_SOURCE_KEY) !is null) {
> DND.error(DND.ERROR_CANNOT_INIT_DRAG);
> }
> control.setData(DND.DRAG_SOURCE_KEY, this);

DND.DRAG_SOURCE_KEYをキーにしてデータを登録する処理が
うっかりどこかで走ってるんじゃないかなあ
0726デフォルトの名無しさん2010/06/25(金) 21:37:44
>>725
mixinで2度同じ関数が呼ばれてました・・・。
おかげでバグが取れました。ありがとうございます。
連投を重ねてすいませんが、恥をしのんであと一つお願いします><

ドラッグしたTreeItemが黒いのは、これもやはり自分のバグなんでしょうか?
画像をつけるとそこだけはちゃんとアイコンが表示されてるんですが。
0727デフォルトの名無しさん2010/06/25(金) 22:13:05
その現象にはぶつかった事がないからわからないやごめん

画像を作ってるのはTreeDragSourceEffect.getDragSourceImage()だから
その辺を調べるといいのかも
0728デフォルトの名無しさん2010/06/26(土) 05:38:57
>>727
そうなんですか・・・
>>720
で試して頂いた奴でもならなかったって事でしょうか?
となると自分の環境の問題なのかなぁ・・・

とりあえず頂いたヒントを調べてみます。ありがとうございました。
0729デフォルトの名無しさん2010/06/26(土) 16:11:16
dwtはVistaでビルドするとXPで動かなくなるような事が余裕で起こるから
環境次第で何が起きても驚かん
0730デフォルトの名無しさん2010/06/27(日) 21:46:59
int i = 0;
writeln("abcd"[i..i + 4]);// "abcd"
writeln("abcd"[i..i += 4]);// ""
これってバグですか?
0731デフォルトの名無しさん2010/06/27(日) 21:50:36
iに副作用あるけどどうなの
0732デフォルトの名無しさん2010/06/28(月) 21:49:10
structのデフォルトコンストラクタが定義できない仕様になってる理由は何ですか?
0733デフォルトの名無しさん2010/06/28(月) 21:58:18
俺、>>730 みたいなことする人と仕事したくない。
0734デフォルトの名無しさん2010/06/28(月) 22:19:22
>>730
cdecllってことでしゅ
0735デフォルトの名無しさん2010/06/28(月) 22:25:43
>>733
完全趣味で完全クローズドで未成年なのでそんなのどうでもいいです

>>734
なるほど
ありがとうございました
0736デフォルトの名無しさん2010/06/29(火) 08:08:42
>>732
構造体の配列を確保するときにデフォルトコンストラクタがあると
0で埋めるんじゃなくて要素数分コンストラクタを呼ばないといけなくなって
パフォーマンスに問題が出るから、だと思う。
0737デフォルトの名無しさん2010/06/29(火) 10:52:20
足跡
0738デフォルトの名無しさん2010/06/29(火) 18:19:01
>>736
thx
0739デフォルトの名無しさん2010/06/29(火) 19:42:43
struct A(T...) {
union {T field;}
}

A!(int, real, string) a;
a.field[0] = 0;
a.field[1] = real.nan;
a.field[2] = "aho";
foreach (f; a.field) writeln(f);

みたいなことができると今日知った
仕様書に書いてあればいいのに
0740デフォルトの名無しさん2010/06/29(火) 21:51:59
なんでunion?
0741デフォルトの名無しさん2010/06/29(火) 22:12:30
タプールとヤプールとカプールって似てるよな
0742デフォルトの名無しさん2010/06/29(火) 22:47:12
>>739, >>741
いいこと聞いた!
0743デフォルトの名無しさん2010/06/29(火) 23:03:39
>>740
最初
T field;
とやったらできなくて、だったらどうやってstd.typecons.Tuple実現できるねん
と思ってソース見たらunionがいた
0744デフォルトの名無しさん2010/06/29(火) 23:12:36
ん、できないけ?
0745デフォルトの名無しさん2010/06/29(火) 23:26:37
あれ?できた…
0746デフォルトの名無しさん2010/06/30(水) 01:00:10
できるよね?
0747デフォルトの名無しさん2010/06/30(水) 07:21:40
D1でもD2でも間違いなくできる
じゃああの時出たエラーは別の要因だったのか…

union意味ねぇ!
0748デフォルトの名無しさん2010/06/30(水) 22:45:58
ttp://dusers.dip.jp/modules/forum/index.php?topic_id=73
std.socketの改造の話が!
0749デフォルトの名無しさん2010/06/30(水) 23:07:03
std.processのショボさは何とかならないかなぁ
標準ライブラリだけでfork-execやりたいです
0750デフォルトの名無しさん2010/07/01(木) 02:48:35
streamもね
0751デフォルトの名無しさん2010/07/01(木) 10:06:17
>>749
std.processって別ブランチで新しいの開発されてるけどいつマージされるのやら
0752デフォルトの名無しさん2010/07/01(木) 21:38:19
おお本当だ
すばらしいね
未来はバラ色だな
0753デフォルトの名無しさん2010/07/02(金) 05:28:29
実際にバラ色だったらキモいけどな
0754デフォルトの名無しさん2010/07/02(金) 19:24:43
ttp://bitprox.com/en/products_bde_index.html
Dの有償IDEとか人類史上希に見る大胆なプロダクト
■ このスレッドは過去ログ倉庫に格納されています