On 02/10/2013 11:38 AM, Danny Arends wrote: > I need to call some C code which takes a double** > > In D I have a dynamic array X, Whats a good way of doing this ? > > #SNIP > > extern(C){ > void toCall(double** X, size_t d1, size_t d2); > } > > void main(){ > double[][] X; > > // How to be able to: > toCall(X, X.length, X[0].length); > } > > #/SNIP > > Danny Arends > http://www.dannyarends.nl
You need to use two properties of slices: .ptr: Pointer to the first element .length: The number of elements import std.stdio; import std.algorithm; import std.range; extern(C) { void toCall(double** X, size_t d1, size_t d2) { for (size_t row = 0; row != d1; ++row) { for (size_t column = 0; column != d2; ++column) { writefln("%s,%s: %s", row, column, X[row][column]); } } } } void main(){ double[][] X = [ [ 1, 2, 3 ], [ 10, 20, 30 ] ]; double*[] X_c = X.map!(d => d.ptr).array; toCall(X_c.ptr, X_c.length, X[0].length); } The line with map is the equivalent of the following: double*[] X_c; foreach (slice; X) { X_c ~= slice.ptr; } Ali