1 名前:デフォルトの名無しさん mailto:sageteoff [2015/01/25(日) 12:07:29.52 ID:gAd5OZDm.net] プログラミング言語 D (D Programming Language) について語るスレッドです。 ■本家 dlang.org/ - 公式(英語) www.kmonos.net/alang/d/ - 公式の和訳 (やや古いので注意) https://issues.dlang.org/ - D言語バグ報告 https://github.com/D-Programming-Language - D言語開発リポジトリ ■Wiki wiki.dlang.org/ - 公式Wiki dusers.dip.jp/ - D言語友の会(日本語フォーラムあり) ■プログラミング言語D (TDPL: The D Programming Language) Andrei Alexandrescu 日本語版 www.shoeisha.co.jp/book/detail/9784798131108 ソース貼付サイト dpaste.dzfl.pl/ <$><$> https://www.bountysource.com/trackers/383571-d-programming-language ■前スレ D言語 Part33 toro.2ch.net/test/read.cgi/tech/1396145538/ ■過去スレ、関連スレ makimo.to:8000/cgi-bin/search/search.cgi?q=D%8C%BE%8C%EA&sf=2&all=on&view=table&shw=5000
237 名前:デフォルトの名無しさん mailto:sage [2015/09/29(火) 09:14:53.57 ID:2BMWd/g5.net] 2.068.2 出てた ちなみに Win32-COFF が隠しオプション(-m32mscoff)で出来るようになってるので OMF/optlink がイケてないと思っていた諸兄は試してみるがよいよいよい
238 名前:デフォルトの名無しさん mailto:sage [2015/10/01(木) 21:28:45.14 ID:S1ELEwjTE] 64bitも隠しオプションだったよね 「コンパイラのソースくらい当然読んでるよね?」ってことなんだろうか…
239 名前:デフォルトの名無しさん mailto:sage [2015/10/04(日) 20:25:42.92 ID:fx9NWY8o.net] int arr[x][y][z]; これと同じメモリレイアウトでヒープに確保するにはどうすればいいですか?
240 名前:219 mailto:sage [2015/10/04(日) 20:56:03.94 ID:fx9NWY8o.net] new int[x*y*z]でよかった。 問題なのはint[]のメモリへのアクセスをint[x][y][z]と同じようにする方法だった。
241 名前:219 mailto:sage [2015/10/04(日) 20:59:30.10 ID:fx9NWY8o.net] 自己解決。 [0][0][0],[0][0][1]...[0][1][0],[0][1][1]...の順番で並んでるだけだった。
242 名前:デフォルトの名無しさん [2015/10/06(火) 01:18:13.90 ID:4WYMUnp4.net] くっそ! ↓Manifest ConstantsのenumとAAのからみがおかしい。 dpaste.dzfl.pl/36ab529d6fc5c ↓CTFEで変数を修飾する方のscope class使うと abnormal termination dpaste.dzfl.pl/8ad7e24e5d05
243 名前:デフォルトの名無しさん [2015/10/09(金) 21:58:55.85 ID:So4fPMkx.net] const class A { int a; this(int v) { a = v; } } このクラスAを値に持つ連想配列を作りたいんだけど、 const(A)[int] hoge = [1: new const A(1)]; hoge[3] = new const A(3); // cannot modify const expression hoge[3] みたいに、初期化はできても代入ができない。 A[int] hoge = cast(A[int])[1: new const A(1), 2: new const A(2)]; hoge[3] = cast(A)new const A(3); てなふうにcastしたら回避できたけど、なんか美しくない。 typeof(new const A(1)).stringof == "const(A)" なのがおかしい気がするんだが。
244 名前:223 mailto:sage [2015/10/09(金) 23:28:50.19 ID:So4fPMkx.net] 書き込んでから思い出したけど、Rebindableとかできて結構経つしあきらめるしかない気がしてきた。 >>229 optlink死んでまうん?
245 名前:デフォルトの名無しさん mailto:sage [2015/10/10(土) 00:27:09.81 ID:MYHuAGIQ.net] const classとかscope classとかは今もまともに使おうと思えないね 普通のclass内でメンバをconstにするとかじゃないとまともに動く気しない
246 名前:デフォルトの名無しさん [2015/10/15(木) 18:54:50.42 ID:pJRyZOgY.net] nullではなく、空の連想配列で初期化するにはどうすればよいですか?
247 名前:デフォルトの名無しさん mailto:sage [2015/10/16(金) 08:36:04.34 ID:CAVKRc42.net] 空の配列 == null なので無理 ただし空文字列 "" は例外 落とし穴になりがちなので注意
248 名前:デフォルトの名無しさん mailto:sage [2015/10/16(金) 13:11:04.24 ID:TDfNRPC3.net] ちょっと良くわかりませんが、D言語は空の配列すら作れないんですか? 不便ですね
249 名前:デフォルトの名無しさん mailto:sage [2015/10/16(金) 17:46:08.84 ID:ZZ3JoxKg.net] nullでない空ってなに
250 名前:デフォルトの名無しさん [2015/10/16(金) 17:54:55.90 ID:MCgyDKhx.net] a = {}; こんなのを期待してるのかな
251 名前:226 [2015/10/16(金) 18:32:37.08 ID:+5uWvhRc.net] >>239-242 レスありがとう。やりたかったのはこういうことです。 string[string] buf; auto buf2 = buf; buf2["hello"] = "world"; buf.writeln; // > [] これと↓ string[string] buf = ["": ""]; buf.remove(""); auto buf2 = buf; buf2["hello"] = "world"; buf.writeln; // > ["hello":"world"] では結果が違うわけだけど、後半の上2行を初期化1行で書きたいな。 という話でした。
252 名前:デフォルトの名無しさん mailto:sage [2015/10/16(金) 19:36:08.03 ID:TDfNRPC3.net] 結局どういうことなんですか? Dでは空の配列を作れないんですか? 必ず何か入っていなければダメなんですか? int[] a; って書けば空の配列になるんじゃないんですか?
253 名前:226 mailto:sage [2015/10/16(金) 21:04:57.54 ID:+5uWvhRc.net] >>244 int[] a; で空の配列になりますよ。 226のは「連想配列」が俺にはややこしいっていう話です。
254 名前:デフォルトの名無しさん mailto:sage [2015/10/16(金) 21:47:10.30 ID:BcAfRt/g.net] >>243 string[string] buf = (a => (a.remove(""), a))(["" : ""]); ところで、コンマ演算子を廃止しようとか言ってたのは自然消滅したのか?
255 名前:226 [2015/10/16(金) 22:51:07.22 ID:GwISFyO6.net] >>246 ありがとうございます。ところでもっと基本的な疑問がわいたのですが、 >>243 の後半での、bufとbuf2の中身がずっと同じであるっていうのは、仕様で保証されてるんでしょうか? Windows版dmd2.068.2では、1000個値を追加しても同じでした。
256 名前:デフォルトの名無しさん mailto:sage [2015/10/17(土) 09:05:55.54 ID:M7lcZRBS.net] >>243 バグっぽい removeしつくしたら null になってるはずなんだけど
257 名前:デフォルトの名無しさん mailto:sage [2015/10/17(土) 09:08:29.29 ID:M7lcZRBS.net] それに連想配列の内部実装は最近まで大きく書き換えられてて 動作の微妙な違いとかあるのでトリッキーなことは避けるべき
258 名前:226 [2015/10/17(土) 22:20:49.79 ID:KpZ8gQf0.net] >>248-249 そうなんですね。書き換えます。ありがとうございます。
259 名前:デフォルトの名無しさん mailto:sage [2015/10/20(火) 00:01:18.64 ID:wy5QxwnK.net] リンクエラー。2.067.1では通ってた。 dpaste.dzfl.pl/255495e7489a 1. -m64 で 2. CTFEで実行されるラムダ内で定義されている 3. 配列をメンバに持つ構造体の 4. 配列のconcatを行う
260 名前:デフォルトの名無しさん mailto:sage [2015/10/22(木) 22:35:23.39 ID:WlXBpB56.net] ↓CTFEでtoHash/opEqualsが効いてない。 dpaste.dzfl.pl/ec40b544f45d CTFEはまだまだなかなかナヤマシイな! >>249 がらみかしらん。
261 名前:デフォルトの名無しさん [2015/10/28(水) 16:43:28.27 ID:w9dndjrH.net] D言語って、Javaみたいにソースファイル名とクラス名を同じにしてしまうと、 他のソースでクラス名のつもりで記述したものがパッケージ名扱いになってしまうため Hoge.Hoge のように同じ名前を2回書かないとクラス名と解釈してくれないと思うのですが、 これを1回だけの記述で済ましたい場合、皆さんはどのように解決されているんでしょうか? ソースファイル名を変えるのもmodule文で別名にするのも、何か違うように感じてしまいます。
262 名前:デフォルトの名無しさん mailto:sage [2015/10/28(水) 19:24:28.95 ID:9zUX3+we.net] モジュール名とファイル名は小文字 クラス名は大文字始まり それでもカブるようなケースはパッケージを作るからまず困らない
263 名前:デフォルトの名無しさん mailto:sage [2015/10/29(木) 01:37:25.50 ID:0VE0VetC.net] >>253 D言語の命名規則に則れば >>254 の言うとおり。 ただ、どうしてもと言うならこんなんはいかがか。 dpaste.dzfl.pl/dce8977dacc7 えーと。やっぱ242で。
264 名前:デフォルトの名無しさん [2015/10/29(木) 10:25:47.23 ID:xCMI4xlR.net] >>254 なるほと確かにD言語の命名規則からするとモジュール名は小文字でしたね。 でも、どうしても大きなクラスは同名の一ソースにしたいのです‥すみません。 ところでパッケージで気付かせてもらったのですが、この問題って、 クラスのソースらをルート階層に置いているからこそ起きる問題なのですね。 というわけでディレクトリを一つ掘ってパッケージ下に配置することで一応解決しました! ただ、パッケージ下にあるソースって module パッケージ名.モジュール名 の記述は必ず必要なのでしょうか? module文の記述が無いとルートパッケージ下として格納されてしまうようで、 module文を普段省略していた身からするとちょっと面倒に感じています。 この辺りの挙動はjavaのpackage文の踏襲かなと思うのですが、 D言語ではパッケージはディレクトリに対応すると書かれているようなので、 module文を省略しても適切なパッケージに配置してくれて良いような? >>255 おぉ‥改名選択importというやつでしょうか。確かにこれで通りました。 import _Hoge = Hoge : Hoge; という風に変換されるんですね。 import文までコンパイル時生成できるとは、D言語きm‥素晴らしいです。 ただこの書き方ではモジュール名変更リファクタリングの際にIDEが解析しにくい気がするので (そもそもそこまでお世話してくれるIDEは現存しないようですけれど‥)、 取り敢えずは先のパッケージへの配置法でがんばってみます。 凄いものをありがとうございました。今後の困難の際に参考にします。
265 名前:デフォルトの名無しさん mailto:sage [2015/11/04(水) 15:13:08.14 ID:L5M/yopQ.net] dmd2.069.0
266 名前:デフォルトの名無しさん mailto:sage [2015/11/06(金) 23:00:00.73 ID:XSTiM1/K.net] Error: template std.algorithm.s
267 名前:earching.countUntil cannot deduce function from argument types !()(int[11], int), candidates are: こういうエラーが出たんですけど、countUntilに静的配列は使えないということでしょうか? Error: template instance sort!((uint a, uint b) あと、sortに無名関数を渡したらエラーが出ました。無名関数も使えないのでしょうか? [] [ここ壊れてます]
268 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 11:16:15.31 ID:oYYknJv4.net] 静的配列に対して popFront() が呼べない(初めて知った!) だからレンジ系操作に対しては全滅に近い ソートの方はそれだけじゃ分からんね 無名関数は使い方間違えた時にわかりづらい
269 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 15:26:06.21 ID:k3hAw3NX.net] 静的配列は要素数が変更できないからですか。 Rangeの要件を満たしてないとなると結構不便ですね。 sortはエラーメッセージがこの1行しか出ないんですよね。 シンプルな例でテストしたらコンパイルは通ったんですけど、他のコードが影響してるのかなぁ。
270 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 22:04:33.49 ID:X4t7LIyp.net] 固定長配列の全体のスライスを取って動的配列に見せかければ ある程度のRange操作だったら固定長配列にもかけられるのでちょっと便利です
271 名前:デフォルトの名無しさん mailto:sage [2015/11/08(日) 23:00:15.52 ID:18XUDL229] 静的配列に対してだったらC系の関数呼ぶとかで対応したほうが良いのでは?
272 名前:デフォルトの名無しさん mailto:sage [2015/11/09(月) 04:06:00.73 ID:PiWCufYC.net] はあ、なるほど。
273 名前:デフォルトの名無しさん mailto:sage [2015/11/09(月) 04:09:17.37 ID:PiWCufYC.net] delegateのcovariane/contravarianceはなくなったんですかね
274 名前:デフォルトの名無しさん mailto:sage [2015/11/14(土) 10:33:38.52 ID:TuAUCuHQ.net] SortedRange!(R, ((a, b) => binaryFun!less(unaryFun!transform(a), unaryFun!transform(b)))) schwartzSort(alias transform, alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, R)(R r) if (isRandomAccessRange!R && hasLength!R) { ... } こんなの見ても揺らがないのが真のD言語er
275 名前:デフォルトの名無しさん [2015/11/14(土) 12:16:16.84 ID:AP01jWaC.net] 真のD言語erはそんなに書いて(書かせて)もらえることに感謝する
276 名前:デフォルトの名無しさん mailto:sage [2015/11/14(土) 20:42:57.89 ID:uWuWWunU.net] デバッグ用に関数名を出力したいんですけど、関数名を取得する方法はあるでしょうか? __FILE__や__LINE__みたいな感じのが欲しいです。
277 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 00:26:31.44 ID:4YAQhy/L.net] 標準入出力をフラッシュするにはどうすればいいですか?
278 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 00:49:19.11 ID:DVr3HCs9.net] 基本的には、DではCの標準ライブラリと同等の関数をほぼそのまま薄いラッパで提供しています
279 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 01:23:34.60 ID:4YAQhy/L.net] dout.flush()ということですか。 writeln()に対応するものはないんでしょうか?
280 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 02:08:17.69 ID:4YAQhy/L.net] stdout.flush()でできました。
281 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 07:41:57.52 ID:ndJn5r2D.net] >>267 __FUNCTION__ も使える 日本語訳サイトは古すぎるから 英語サイトも必ず併用すべき
282 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 14:56:12.51 ID:4YAQhy/L.net] >>272 関数名の取得もあったのですね。 英語苦手だけど見ないとだめですね。
283 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 15:01:11.74 ID:4YAQhy/L.net] 自作のプログラムを実行すると毎回同じ場所でobject.Error: Access Violationが発生します。 エラーとは関係なさそうな修正(stderr.writeln()を増やしたり減らしたり)をするとエラー発生の場所が変わったり、 InvalidMemoryOperationErrorに変わったりします。 エラーの原因がさっぱり分からないんですけど、どういうことが考えられるでしょうか?
284 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 15:29:26.30 ID:r8bN
] [ここ壊れてます]
285 名前:QIop.net mailto: リーク [] [ここ壊れてます]
286 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 16:21:30.07 ID:4YAQhy/L.net] GCのある言語でメモリリークとなると、どういうケースがあるのか想像がつかないです。 エラー発生の場所も変わるので謎です。
287 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 17:04:42.06 ID:PV6fOtMt.net] GCのリーク以外に 確保してない場所に書き込むのもリークって言わない?
288 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 17:07:38.68 ID:lu/bgS1P.net] こマ?初めて聞いたその結び付け リーク=解放処理漏れ 以外の認識ないわ
289 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 17:19:50.76 ID:4YAQhy/L.net] newする前のクラスのインスタンスの関数を使ってAccess Violationが出たことは過去にありますね。 しかし、今回はちゃんとnewされているし、1回目の呼び出しでエラーが発生してるわけでもないんですよね。 そして>>274 で書いたようにstderr.writeln()を追加するだけでエラー発生のタイミングが変わるので難解です。
290 名前:デフォルトの名無しさん [2015/11/15(日) 18:08:15.11 ID:PV6fOtMt.net] 初期化してない変数でアクセス
291 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 18:39:09.01 ID:ndJn5r2D.net] AVならばぬるぽか RangeErrorか deleteの間違い -g -debug してないんかいな InvalidMemoryOperationError ならばデストラクタの中で何か変なことしてる疑い デストラクタの中でdeleteとかしちゃダメダメよ〜
292 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 18:44:09.41 ID:zgz009B6.net] 似たことなったことあるなあ。なんやったか。 templateとかmixinがらみで依存関係見落としててobjの更新忘れとか。
293 名前:デフォルトの名無しさん mailto:sage [2015/11/15(日) 19:02:33.53 ID:4YAQhy/L.net] すみませんReleaseビルドになってました。 DebugビルドにしたらRangeErrorになりました。
294 名前:デフォルトの名無しさん [2015/11/15(日) 19:09:44.01 ID:PV6fOtMt.net] 報告乙
295 名前:デフォルトの名無しさん [2015/11/19(木) 16:51:28.76 ID:I2rQS35X.net] char *hoge[] = new char *[N]; scope(exit) free(hoge.ptr); とするのと char **hoge = cast(char **)(new char *[N]); scope(exit) free(hoge); とするのとでは同じ動作が期待出来ますか? あとガベコレを期待するなら scope(exit) free(hoge.ptr); も scope(exit) free(hoge); もどちらも不要ですか?
296 名前:デフォルトの名無しさん mailto:sage [2015/11/19(木) 23:48:30.24 ID:kWkiLP1L.net] 色々とカオス(感想) C : malloc/free C++: new/delete D : new/[destroy] GCがあるので解放は不要だが、領域が不要になったことをdestroyで明示してもよい ただしdestroyで領域が即時解放されるわけでなく、GCが必要に応じてよしなにやる C++のdeleteと区別するために、destroyになった(想像) --- auto hoge = new int[][N]; // int型の動的配列をN要素もてる動的配列(二次元配列) foreach (elem; hoge) elem = new int[色々]; // ジャグ配列も可能 // 以下は不要(してもよい) foreach (elem; hoge) destroy(elem); destroy(hoge); --- GCを使わずmalloc/freeすることも一応可能 (今だと、std.experimental.allocatorを使うべき?) newしたものをfreeすることに保証はないと思う、知らんけど
297 名前:デフォルトの名無しさん mailto:sage [2015/11/20(金) 01:05:01.96 ID:gniDkGmv.net] × foreach(elem; hoge) ○ foreach(ref elem; hoge)
298 名前:デフォルトの名無しさん [2015/11/20(金) 10:48:03.85 ID:LnAg0HCn.net] ありがとうございます!!
299 名前:デフォルトの名無しさん [2015/11/20(金) 22:50:35.51 ID:KMWFgUCm.net] クラスのstaticメンバ関数で、継承先の型って見られますか? class Base { static T[] takusanMake(T)(int n) { //Hogeから呼んでT=Hogeがほしい T[] ret = new T[n]; foreach (ref e; ret) { e = new T; } // ... Baseのフィールドしかいじらないような設定 ... return ret; } } class Hoge : Base { } void main() { //Hoge auto hoge = Hoge.takusanMake(30); } 内容はともかく、大体こんな感じのことをしたいです Baseから派生したクラスで定義するとか、ちゃんと!(Hoge)してもいいんですが、 (this T)を見てから何か方法があるような気がしてきて・・・
300 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 13:20:00.57 ID:1cOWOBS
] [ここ壊れてます]
301 名前:i.net mailto: staticなメンバ関数からは、thisは見えないので UFCS前提でいっそ外部に出して === import std.stdio; class Base {} class Hoge : Base {} class Other {} T[] takusanMake(T : Base)(lazy T d, int n) { auto ret = new T[n]; foreach (ref e; ret) { e = d(); } return ret; } void main() { auto hoge = (new Hoge).takusanMake(30); typeid(hoge).writeln; // Baseに暗黙変換できない型はNG //auto other = (new Other).takusanMake(30); } === こういうのはどうだろう (もっといい方法ありそう。。) [] [ここ壊れてます]
302 名前:デフォルトの名無しさん [2015/11/21(土) 14:42:18.71 ID:8z9xCqW5.net] Hoge という型と Fuga という型があって Hoge[Fuga] hage; という連想配列は定義できるみたいなのですが Any という任意の型があるとして Any[Any] moge; みたいな連想配列は作れますか?
303 名前:デフォルトの名無しさん [2015/11/21(土) 14:47:56.80 ID:8z9xCqW5.net] ちなみに ["A": "B", "C": 3, 4: "E"] みたいなのを作りたいのです
304 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 15:28:20.57 ID:8z9xCqW5.net] Object[Object] moge = ["A": "B", "C": 3, 4: "E"]; これでだめでした orz
305 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 22:31:38.28 ID:jpeEJ7vY.net] import std.variant; auto moge = [Variant("A"): Variant("B"), Variant("C"): Variant(3), Variant(4): Variant("E")]; とかいうダサい感じのしか思いつかない。
306 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 23:35:17.00 ID:BXVotCtM.net] >>290 確かにもう外に出してしまう方がいいかもしれないですね 外に出すことは考えてなかったのでもうちょっと考えてみます
307 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 12:23:27.44 ID:rXOpUu6m.net] >>291 型付き言語に喧嘩売ってんのか
308 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 12:42:54.55 ID:rXOpUu6m.net] >294 ダサくてよければ Variant[Variant] constructor(T...)(T plist){ Variant[Variant] result; foreach(ref p; plist) result[new Variant(p.keys[0])] = new Variant(p[p.keys[0]]); return result; } Variant[Variant] moge = constructor(["A": "B"], ["C": 3], [4: "E"]); 試してないけど
309 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 18:10:01.30 ID:K6EhBG35.net] 引数が1個ずつ別のAAになってる…? きもちわるすぎる
310 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 18:34:22.00 ID:uPJ5yBy3.net] import std.variant; import std.stdio; Variant[Variant] makeTable(T...)(T p) { static assert(T.length%2 == 0); Variant[Variant] t; foreach (i, ref v; p) { static if (i%2 == 0) { t[Variant(p[i])] = Variant(p[i+1]); } } return t; } void main() { auto t = makeTable(1, 2, "hoge", 123.2); writeln(t); }
311 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 19:32:11.41 ID:QPIcOg4c.net] >>293 dpaste.dzfl.pl/2879b11f3fec ま、やっぱロクなことにはならんわなあ。
312 名前:287 mailto:sage [2015/11/22(日) 19:46:28.38 ID:QPIcOg4c.net] やっぱコード追加で。連投御免。 dpaste.dzfl.pl/19cc3ea3bd0d
313 名前:デフォルトの名無しさん mailto:sage [2015/11/23(月) 14:44:46.01 ID:5yZmzCJ8.net] mixin使ったら負けな感じ半端ない
314 名前:デフォルトの名無しさん mailto:sage [2015/11/23(月) 23:06:50.39 ID:zlo1l7ot.net] やろうとしてること自体闇魔術臭いしわりと妥当なのかもしれない
315 名前:デフォルトの名無しさん mailto:sage [2015/11/24(火) 12:03:53.42 ID:Dj+m8Q01.net] >>297 と >>299 ってどちらもコンパイル時に 解決された型変換のコードが生成されるのですか? つまり前者も後者も実行時の速度パフォーマンスは同じですか?
316 名前:デフォルトの名無しさん mailto:sage [2015/11/25(水) 00:37:26.01 ID:euvQfHeH.net] >>304 どんなコードが生成されるか知らないのでベンチとって見た結果 dpaste.dzfl.pl/85212474e9f0 281: TickDuration(3595337) 284: TickDuration(9347285) 286: TickDuration(4128184) 288: TickDuration(3554533)
317 名前:デフォルトの名無しさん [2015/11/26(木) 17:49:18.83 ID:yeqvnwwH.net] Dでcomのclientを書こうとして付属のサンプルソースを試したら動作しました wshサーバーをdispatchしてEcho('hoge')みたいなポップアップを出したいのですが サンプルをどのように書き直せばよいのですか
318 名前:デフォルトの名無しさん mailto:sage [2015/11/26(木) 17:58:08.82 ID:yeqvnwwH.net] 途中まで書いたコードです extern (Windows) HRESULT CLSIDFromProgID(const wchar *, CLSID *); const string wsh = "WScript.Shell"; interface IWSH : IUnknown { extern (Windows) int Echo(); } DWORD dwVer = CoBuildVersion(); HRESULT hr = CoInitialize(null); hr = CLSIDFromProgID(wsh.toUTF16z(), &clsid); IWSH pIWSH; hr = CoCreateInstance(&clsid, null, CLSCTX_ALL, &IID_IUnknown, &pIWSH); // FAILED(hr)の判定コードは省略していますがここまでは動作しているようです // pIWSHに値は入っているようですが次の場所でAccessViolationします pIWSH.Echo(); CoUninitialize(); pIWSH.Echo(); の行をコメントアウトすると何も起きませんが正常に完了します あと &IID_IUnknown のところを &IID_IDispatch に書き換えてもだめでした
319 名前:デフォルトの名無しさん mailto:sage [2015/11/26(木) 21:43:51.54 ID:FqPwpLUO.net] >>307 ちょっとまだよく分かってなくてEcho呼んでも何も起きなかったけど、 PopUp呼べたので参考になりますか? dpaste.dzfl.pl/15f1655e540e
320 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 08:55:22.81 ID:H96QzFnR.net] >>307 IDLとかタイプライブラリとか見ずに静的バインディングしようとしてる 普通は中間ヘッダを入手するかツールで生成する C++で一度やったことがないとダメ ちなみに >>308 は動的バインディング
321 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 09:52:51.69 ID:c/N8jVfb.net] >>307 WScript.Shell に Echo は無いよw
322 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 10:48:43.15 ID:Og1YQ9Di.net] >>310 うっかり勘違いしてました 標準のinterfaceから継承する方法ですが interface IWSH : IUnknown { // add vtbl to define as IDispatch extern (Windows) HRESULT GetTypeInfoCount(UINT *); extern (Windows) HRESULT GetTypeInfo(UINT, LCID, REFIID); extern (Windows) HRESULT GetIDsOfNames(REFIID, LPOLESTR *, UINT, LCID, DISPID *); extern (Windows) HRESULT Invoke(DISPID, REFIID, LCID, WORD, DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *); } にして hr = CoCreateInstance(&clsid, null, CLSCTX_ALL, &IID_IDispatch, &pIWSH); したら 後は >>308 さんと同じように PopUp("Hage") を Invoke 出来ました ほんとうにありがとうございました
323 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 11:49:41.82 ID:c/N8jVfb.net] 質問です。 SysTime st = Clock.currTime(); writefln("%s", st.toISOExtString()); writefln("%s", st.toISOString()); の動作で末尾の小数点以下の数字 (hnsecs) が 7桁になるときと6桁になるときがあるみたいです。 先頭の 0 が表示されないケースがあると思ったのですが 通常の '年月日T114500.1234567' 以外に '年月日T114500.0123456' は表示されました。 ところがたまに '年月日T114500.123456' と表示されることがあります。 つまり '年月日T114500.0123456' なのか '年月日T114500.1234560' なのか判りません。 hnsecs==0 のときにこのパターンがあるみたいなのですがみなさんのところはどうですか? DMD32 D Compiler v2.063.2 です。
324 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 11:52:34.38 ID:c/N8jVfb.net] ちょっと紛らわしいので一部訂正します。 x 小数点以下の数字 (hnsecs) が o 小数点以下の数字 (total hnsecs) が x hnsecs==0 のときにこのパターンが o msecs==123, usecs=456, hnsecs==0 のときにこのパターンが
325 名前:デフォルトの名無しさん mailto:sage [2015/11/27(金) 14:33:53.29 ID:gmvL3Mcs.net] "年月日T114500.123456" == "年月日T114500.1234560"じゃないの?
326 名前:デフォルトの名無しさん [2015/11/27(金) 15:13:20.37 ID:c/N8jVfb.net] なるほど小数点以下だから末尾の0は除かれるんですね。 7桁だと思って決め打ちしない方が良いですね。
327 名前:デフォルトの名無しさん [2015/11/27(金) 15:16:44.79 ID:c/N8jVfb.net] Duration d = hoge - fuga; d.total!"msecs", d.total!"usecs", d.total!"hnsecs" を使うことにします。
328 名前:デフォルトの名無しさん [2015/11/28(土) 10:52:50.96 ID:BU0Z8dtz.net] python の __getattr__ ruby の method_missing javascript の __noSuchMethod__ みたいなものを期待して D で同じようなものが有るかどうか検索したら forum.dlang.org/post/op.usipp0mij5j59l@my-tomato というやりとりが見つかりました そこのサンプルをコンパイルしようとしたのですがエラーになります D で opDotExp ってどう使うんですか?
329 名前:デフォルトの名無しさん mailto:sage [2015/11/28(土) 11:37:36.45 ID:3W8Apw0w.net] opDispatch() ただし型のコントロールは引数とか名前付けとか工夫して自前で面倒を見る必要がある
330 名前:デフォルトの名無しさん mailto:sage [2015/11/28(土) 16:26:20.89 ID:pFoee08yy] 動的型付け言語と一緒にしちゃいかんでしょ
331 名前:デフォルトの名無しさん mailto:sage [2015/11/28(土) 17:00:55.36 ID:OpEOTh0X.net] ないですね
332 名前:デフォルトの名無しさん mailto:sage [2015/11/29(日) 18:45:48.60 ID:DyLnKIJJ.net] import std.stdio; class Hoge { void opDispatch(string s)() {
333 名前:デフォルトの名無しさん [2015/11/30(月) 20:34:23.05 ID:SJumDZBl.net] 有賀d
334 名前:デフォルトの名無しさん mailto:sage [2015/11/30(月) 20:43:06.11 ID:SiMJvgO4.net] IDispatch で auto xl = Dispatch("Excel.Application"); xl.Visible = true; auto workbooks = xl.Workbooks; まではうまく逝くのに auto book = workbooks.Add(); で Access Violation してしまう 何が間違ってるんだろう
335 名前:デフォルトの名無しさん mailto:sage [2015/12/01(火) 02:22:06.91 ID:Zh0/OJc/.net] Excel持ってないんであれだけど、Workbooksが返すのはコレクションらしいよ。 https://msdn.microsoft.com/ja-jp/library/aa288625%28v=vs.71%29.aspx https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.collection.add%28v=vs.90%29.aspx とか見るに、Add()はリストに追加しますよってメソッドじゃね?
336 名前:デフォルトの名無しさん mailto:sage [2015/12/01(火) 08:39:45.47 ID:yW8K+bhB.net] Add がデフォルト引数を持ってるけど引数明示したらどうなるかな ぐぐったら xlFileFormat 列挙型 とか出てくる
337 名前:デフォルトの名無しさん [2015/12/01(火) 20:10:30.52 ID:9BYkXgQy.net] a.unknownproperty = hoge; みたいなのも opDispatch!"unknownproperty"(Args args...) で書けますか?