Thread overview
"Error: no property `offsetof` for type `char*`"
Aug 19, 2022
MyNameHere
Aug 19, 2022
kinke
Aug 19, 2022
MyNameHere
Aug 19, 2022
kinke
Aug 19, 2022
kinke
Aug 19, 2022
MyNameHere
Aug 20, 2022
Tejas
August 19, 2022

I am receiving this error:

Error: no property `offsetof` for type `char*`

from this snippet:

import core.sys.windows.setupapi;

void main() {
    SP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetail;
    uint Offset = DeviceInterfaceDetail.DevicePath.offsetof;
}

You may try this at https://run.dlang.io/, build with LDC, with argument: -mtriple=x86_64-windows-msvc.

August 19, 2022

It's a method returning a CHAR* - _DevicePath is the actual member. I guess it's a dynamically sized struct, which cannot be mapped directly to D, hence this representation.

August 19, 2022

Thank you, that seems to have resolved the issue, though I wish these sorts of problems would stop cropping up, they are souring the experience with the language.

August 19, 2022

On 8/19/22 9:49 AM, MyNameHere wrote:

>

Thank you, that seems to have resolved the issue, though I wish these sorts of problems would stop cropping up, they are souring the experience with the language.

Most likely that "member" is a macro in C. D doesn't have macros, so it uses properties.

The error message could be better though.

-Steve

August 19, 2022

On Friday, 19 August 2022 at 14:22:04 UTC, Steven Schveighoffer wrote:

>

On 8/19/22 9:49 AM, MyNameHere wrote:

>

Thank you, that seems to have resolved the issue, though I wish these sorts of problems would stop cropping up, they are souring the experience with the language.

Most likely that "member" is a macro in C. D doesn't have macros, so it uses properties.

Nope, it's really a dynamically sized struct with a last CHAR[1] member: https://docs.microsoft.com/en-us/windows/win32/api/setupapi/ns-setupapi-sp_device_interface_detail_data_a

Just like with C, these abominations need very special care, and regularly allocating on the stack or using as an aggregate field isn't possible.

August 19, 2022

On Friday, 19 August 2022 at 13:49:08 UTC, MyNameHere wrote:

>

Thank you, that seems to have resolved the issue, though I wish these sorts of problems would stop cropping up, they are souring the experience with the language.

Oh and DevicePath() is a convenience member returning a pointer to the 'dynamic array' (as the array decays to a pointer in C too), so no need to fiddle with .offsetof and computing the pointer manually.

August 19, 2022

On Friday, 19 August 2022 at 14:30:50 UTC, kinke wrote:

>

Oh and DevicePath() is a convenience member returning a pointer to the 'dynamic array' (as the array decays to a pointer in C too), so no need to fiddle with .offsetof and computing the pointer manually.

I am using -BetterC, so that path is closed to me, I think.

August 19, 2022

On 8/19/22 12:36 PM, MyNameHere wrote:

>

On Friday, 19 August 2022 at 14:30:50 UTC, kinke wrote:

>

Oh and DevicePath() is a convenience member returning a pointer to the 'dynamic array' (as the array decays to a pointer in C too), so no need to fiddle with .offsetof and computing the pointer manually.

I am using -BetterC, so that path is closed to me, I think.

dynamic arrays are really slices, and they are allowed in betterC.

-Steve

August 20, 2022

On Friday, 19 August 2022 at 16:36:24 UTC, MyNameHere wrote:

>

On Friday, 19 August 2022 at 14:30:50 UTC, kinke wrote:

>

Oh and DevicePath() is a convenience member returning a pointer to the 'dynamic array' (as the array decays to a pointer in C too), so no need to fiddle with .offsetof and computing the pointer manually.

I am using -BetterC, so that path is closed to me, I think.

I believe you aren't allowed to append to dynamic arrays/slices; otherwise you can use them