| Thread overview | ||||||||
|---|---|---|---|---|---|---|---|---|
|
July 07, 2004 property as template parameter | ||||
|---|---|---|---|---|
| ||||
template foo(int i)
{
void foo() { }
}
void main()
{
struct S { int bar; }
foo!(S.bar.offset)(); // error: identifier 'offset' of 'S.bar.offset' is not defined
}
| ||||
July 24, 2004 Re: property as template parameter | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sark7 | Sark7 wrote: > template foo(int i) > { > void foo() { } > } > > void main() > { > struct S { int bar; } > foo!(S.bar.offset)(); // error: identifier 'offset' of 'S.bar.offset' is not defined > } I know this bug report has been out a while (so you might have already solved your problem), but I just looked at this. What is "offset"? I initially thought it was a property of int, but I can't find it on that page of the spec. It's not a keyword. I think that's why the compiler is confused. I'm confused, too. If I'm wrong and there is an offset built into the language, please tell me what it is (and where I can find out about it). It might come in handy. -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/ | |||
July 25, 2004 Re: property as template parameter | ||||
|---|---|---|---|---|
| ||||
Posted in reply to J C Calvarese | you're using a property without knowing what it means? that's a new one to me ;)
offset gives you the offset in bytes of a member variable from the start of a struct. because structs are left in the order they are, and assuming the default alignment is 4 bytes, in struct S { int a,b; }, a.offset=0 and b.offset=4.
| |||
July 25, 2004 Re: property as template parameter | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley wrote: > you're using a property without knowing what it means? that's a new one to > me ;) > > offset gives you the offset in bytes of a member variable from the start of > a struct. because structs are left in the order they are, and assuming the > default alignment is 4 bytes, in struct S { int a,b; }, a.offset=0 and > b.offset=4. Who said I was using it? I'm sometimes careless, but I'm never psychic. ;) I didn't know there was such a thing, and I still can't find a reference to it. Here's what the spec lists as Struct Properties: .sizeof Size in bytes of struct .size Same as .sizeof .alignof Size boundary struct needs to be aligned on As far I can tell there isn't an "offset" property (although "alignof" may be what is desired). import std.stdio; struct S { int bar; } void main() { S myStruct; writef(myStruct.bar); // writef(myStruct.offset); // offset2.d(13): no property 'offset' for type 'S' writef(myStruct.bar.offset); // offset2.d(17): no property 'offset' for type 'int' } -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/ | |||
July 25, 2004 Re: property as template parameter | ||||
|---|---|---|---|---|
| ||||
Posted in reply to J C Calvarese | odd. this is from the D docs, in the "converting C to D" section.
Getting the offset of a struct member.
The C Way
Naturally, another macro is used:
#include <stddef>
struct Foo { int x; int y; };
off = offsetof(Foo, y);
The D Way
An offset is just another property:
struct Foo { int x; int y; }
off = Foo.y.offset;
but the compiler doesn't recognize it?
| |||
July 25, 2004 Re: property as template parameter | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley wrote: > odd. this is from the D docs, in the "converting C to D" section. > Getting the offset of a struct member. > The C Way > Naturally, another macro is used: > #include <stddef> > struct Foo { int x; int y; }; > > off = offsetof(Foo, y); > The D Way > An offset is just another property: > struct Foo { int x; int y; } > > off = Foo.y.offset; > but the compiler doesn't recognize it? Okay. I finally got the compiler to recognize offset. So I agree now that the original post does correctly identify a bug. I'm not sure if the bug is a poor error message or if the code is legal, but I'd call it a bug. I'm going to post a new bug complaining about how offset is essentially undocumented (yes, it's on ctod.html, but I think it should be on the struct page, too). import std.stdio; struct S { int bar; } void main() { S myStruct; // writef(myStruct.offset); // offset2.d(13): no property 'offset' for type 'S' // writef(myStruct.bar.offset); // offset2.d(16): no property 'offset' for type 'int' writefln(S.bar.offset); writefln(typeof(myStruct).bar.offset); } -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/ | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply