Re: Converting void* to D array

2015-04-15 Thread Steven Schveighoffer via Digitalmars-d-learn

On 4/15/15 8:35 AM, CraigDillabaugh wrote:

On Wednesday, 15 April 2015 at 11:18:03 UTC, Steven Schveighoffer wrote:



immutable blocksize = GByte.sizeof * x_block_size * y_block_size;
auto buffer = malloc(blocksize)[0..blocksize];

Also, you don't need to cast pointers to void *. Should be able to do:

GDALReadBlock(AGDALRasterBandHInstance, xblock, yblock, buffer.ptr);



Thanks for the pointers (no pun intended!)

Just out of curiosity, what is the type of 'buffer'?  'malloc' returns a
void* but using the .ptr suggests 'buffer' is an array.  Is the return
of malloc automatically converted to an array?


malloc returns void *, but I am applying the slice operator which turns 
a pointer into a slice. I'll split it up:


auto bufptr = malloc(blocksize);// typeof(bufptr) = void *
auto buffer = bufptr[0..blocksize]; // typeof(buffer) = void[]

-Steve


Re: Converting void* to D array

2015-04-15 Thread CraigDillabaugh via Digitalmars-d-learn
On Wednesday, 15 April 2015 at 11:18:03 UTC, Steven Schveighoffer 
wrote:

On 4/15/15 12:47 AM, Daniel Kozak wrote:
On Wednesday, 15 April 2015 at 04:43:39 UTC, Daniel Kozák 
wrote:


On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:


Hi.
I want to call a C library function that returns a data 
buffer as a
void*.  How do I convert the resulting void* into something 
I can

process in D?

//I have the following function from the GDAL C library.
extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, 
void* );



So I have (GByte is defined in the GDAL library):

void* buffer = malloc( GByte.sizeof * x_block_size * 
y_block_size );


I fill the buffer (and ignore any errors :o)

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, 
buffer );



Now, how can I access the data in buffer?

Or you probably can do it like this:

auto buffer = new GByte[xblock*yblock];

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,
(cast void*)buffer.ptr );
But in this case memory will be scan by GC. Which probably is 
not

something what you want.


Depends on what GByte is. If it doesn't contain pointers (I'm 
assuming its probably ubyte?), then it won't be scanned.


If you still want to use malloc, but in a safe way, you can do:

immutable blocksize = GByte.sizeof * x_block_size * 
y_block_size;

auto buffer = malloc(blocksize)[0..blocksize];

Also, you don't need to cast pointers to void *. Should be able 
to do:


GDALReadBlock(AGDALRasterBandHInstance, xblock, yblock, 
buffer.ptr);


-Steve


Thanks for the pointers (no pun intended!)

Just out of curiosity, what is the type of 'buffer'?  'malloc' 
returns a void* but using the .ptr suggests 'buffer' is an array. 
 Is the return of malloc automatically converted to an array?


Re: Converting void* to D array

2015-04-15 Thread CraigDillabaugh via Digitalmars-d-learn
On Wednesday, 15 April 2015 at 11:18:03 UTC, Steven Schveighoffer 
wrote:

clip
Depends on what GByte is. If it doesn't contain pointers (I'm 
assuming its probably ubyte?), then it won't be scanned.



clip

-Steve


Yes, GByte is an alias for ubyte.



Re: Converting void* to D array

2015-04-15 Thread CraigDillabaugh via Digitalmars-d-learn
On Wednesday, 15 April 2015 at 14:02:38 UTC, Steven Schveighoffer 
wrote:

On 4/15/15 8:35 AM, CraigDillabaugh wrote:
On Wednesday, 15 April 2015 at 11:18:03 UTC, Steven 
Schveighoffer wrote:


immutable blocksize = GByte.sizeof * x_block_size * 
y_block_size;

auto buffer = malloc(blocksize)[0..blocksize];

Also, you don't need to cast pointers to void *. Should be 
able to do:


GDALReadBlock(AGDALRasterBandHInstance, xblock, yblock, 
buffer.ptr);




Thanks for the pointers (no pun intended!)

Just out of curiosity, what is the type of 'buffer'?  'malloc' 
returns a
void* but using the .ptr suggests 'buffer' is an array.  Is 
the return

of malloc automatically converted to an array?


malloc returns void *, but I am applying the slice operator 
which turns a pointer into a slice. I'll split it up:


auto bufptr = malloc(blocksize);// typeof(bufptr) = void *
auto buffer = bufptr[0..blocksize]; // typeof(buffer) = void[]

-Steve
Nice.  Thanks.  I didn't realize you can slice a bare pointer 
like that.


Does druntime have any way of making sure that is safe, or are 
you on your own?


Re: Converting void* to D array

2015-04-15 Thread Steven Schveighoffer via Digitalmars-d-learn

On 4/15/15 11:02 AM, CraigDillabaugh wrote:

Nice.  Thanks.  I didn't realize you can slice a bare pointer like that.

Does druntime have any way of making sure that is safe, or are you on
your own?


No, druntime cannot know what the pointer actually points at. This would 
not work in @safe code. It's on you to make sure it's valid.


-Steve


Re: Converting void* to D array

2015-04-15 Thread Steven Schveighoffer via Digitalmars-d-learn

On 4/15/15 12:47 AM, Daniel Kozak wrote:

On Wednesday, 15 April 2015 at 04:43:39 UTC, Daniel Kozák wrote:


On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:


Hi.
I want to call a C library function that returns a data buffer as a
void*.  How do I convert the resulting void* into something I can
process in D?

//I have the following function from the GDAL C library.
extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, void* );


So I have (GByte is defined in the GDAL library):

void* buffer = malloc( GByte.sizeof * x_block_size * y_block_size );

I fill the buffer (and ignore any errors :o)

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, buffer );


Now, how can I access the data in buffer?

Or you probably can do it like this:

auto buffer = new GByte[xblock*yblock];

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,
(cast void*)buffer.ptr );

But in this case memory will be scan by GC. Which probably is not
something what you want.


Depends on what GByte is. If it doesn't contain pointers (I'm assuming 
its probably ubyte?), then it won't be scanned.


If you still want to use malloc, but in a safe way, you can do:

immutable blocksize = GByte.sizeof * x_block_size * y_block_size;
auto buffer = malloc(blocksize)[0..blocksize];

Also, you don't need to cast pointers to void *. Should be able to do:

GDALReadBlock(AGDALRasterBandHInstance, xblock, yblock, buffer.ptr);

-Steve


Re: Converting void* to D array

2015-04-14 Thread Daniel Kozak via Digitalmars-d-learn

On Wednesday, 15 April 2015 at 04:43:39 UTC, Daniel Kozák wrote:


On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:


Hi.
I want to call a C library function that returns a data buffer 
as a void*.  How do I convert the resulting void* into 
something I can process in D?


//I have the following function from the GDAL C library.
extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, 
void* );



So I have (GByte is defined in the GDAL library):

void* buffer = malloc( GByte.sizeof * x_block_size * 
y_block_size );


I fill the buffer (and ignore any errors :o)

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, 
buffer );



Now, how can I access the data in buffer?

Or you probably can do it like this:

auto buffer = new GByte[xblock*yblock];

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,
(cast void*)buffer.ptr );
But in this case memory will be scan by GC. Which probably is not 
something what you want.


Re: Converting void* to D array

2015-04-14 Thread Daniel Kozák via Digitalmars-d-learn

On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 Hi.
 I want to call a C library function that returns a data buffer as 
 a void*.  How do I convert the resulting void* into something I 
 can process in D?
 
 //I have the following function from the GDAL C library.
 extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, void* 
 );
 
 
 So I have (GByte is defined in the GDAL library):
 
 void* buffer = malloc( GByte.sizeof * x_block_size * y_block_size 
 );
 
 I fill the buffer (and ignore any errors :o)
 
 GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, buffer );
 
 
 Now, how can I access the data in buffer?
Or you probably can do it like this:

auto buffer = new GByte[xblock*yblock];

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,
(cast void*)buffer.ptr );


Re: Converting void* to D array

2015-04-14 Thread Craig Dillabaugh via Digitalmars-d-learn

On Wednesday, 15 April 2015 at 04:43:39 UTC, Daniel Kozák wrote:


On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:


Hi.
I want to call a C library function that returns a data buffer 
as a void*.  How do I convert the resulting void* into 
something I can process in D?


//I have the following function from the GDAL C library.
extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, 
void* );



So I have (GByte is defined in the GDAL library):

void* buffer = malloc( GByte.sizeof * x_block_size * 
y_block_size );


I fill the buffer (and ignore any errors :o)

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, 
buffer );



Now, how can I access the data in buffer?

Or you probably can do it like this:

auto buffer = new GByte[xblock*yblock];

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,
(cast void*)buffer.ptr );


Thank you very much. Works like a charm.

Make that last line:
GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock,

cast(void*)buffer.ptr );


Converting void* to D array

2015-04-14 Thread Craig Dillabaugh via Digitalmars-d-learn

Hi.
I want to call a C library function that returns a data buffer as 
a void*.  How do I convert the resulting void* into something I 
can process in D?


//I have the following function from the GDAL C library.
extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, void* 
);



So I have (GByte is defined in the GDAL library):

void* buffer = malloc( GByte.sizeof * x_block_size * y_block_size 
);


I fill the buffer (and ignore any errors :o)

GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, buffer );


Now, how can I access the data in buffer?


Re: Converting void* to D array

2015-04-14 Thread Daniel Kozák via Digitalmars-d-learn

On Wed, 15 Apr 2015 04:24:20 +
Craig Dillabaugh via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 Hi.
 I want to call a C library function that returns a data buffer as 
 a void*.  How do I convert the resulting void* into something I 
 can process in D?
 
 //I have the following function from the GDAL C library.
 extern(C) CPLErr GDALReadBlock( GDALRasterBandH, int, int, void* 
 );
 
 
 So I have (GByte is defined in the GDAL library):
 
 void* buffer = malloc( GByte.sizeof * x_block_size * y_block_size 
 );
 
 I fill the buffer (and ignore any errors :o)
 
 GDALReadBlock( AGDALRasterBandHInstance, xblock, yblock, buffer );
 
 
 Now, how can I access the data in buffer?

auto buf = (cast(GByte *)buffer)[0 .. xblock * yblock];