digitalmars.D.learn - variadic (typesafe) args in DLL
- Bjoern (27/27) Feb 08 2008 Hi,
- Jarrett Billingsley (10/25) Feb 08 2008 Ur typesafe variadic function, ur doin it wrong.
- Bjoern (21/57) Feb 08 2008 I can only use C style fixed arrays but this will end in code like
- Jarrett Billingsley (21/41) Feb 09 2008 .. Uh, seriously?
Hi, I hope that I can write a small utility DLL which offers support for : BinaryOrPlus(WS_TABSTOP, WS_CHILD, WS_CLIPSIBLINGS) Why ? Because my 4GL has no binary OR operator (just a function) so this code fragment will not work : x is unsigned int = WS_TABSTOP | WS_CHILD | WS_CLIPSIBLINGS // etc. Instead I have to use : (BinaryOr(BinaryOr(WS_TABSTOP , WS_CHILD), WS_CLIPSIBLINGS) // stinks ! I hope it is possible to create something similar to : export extern (Windows) uint BinaryOrPlus(uint...) { uint result = _arguments[0]; for (int i = 1; i < _arguments.length; i++) { result |= _arguments[i]; } return result; } Unfortunately Error msg is : C:\dmd\projects\bsdutil>dmd -profile -odc:\dmd\projects\bsdutil\obj -ofBSDUTIL.D LL bsdutil.d demangle.d bsdutil.def bsdutil.d(110): Error: undefined identifier _arguments bsdutil.d(110): Error: _arguments must be an array or pointer type, not int etc. I use Tango. ?????? Bjoern
Feb 08 2008
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message news:foi37b$19vv$1 digitalmars.com...export extern (Windows) uint BinaryOrPlus(uint...) { uint result = _arguments[0]; for (int i = 1; i < _arguments.length; i++) { result |= _arguments[i]; } return result; } Unfortunately Error msg is : C:\dmd\projects\bsdutil>dmd -profile -odc:\dmd\projects\bsdutil\obj -ofBSDUTIL.D LL bsdutil.d demangle.d bsdutil.def bsdutil.d(110): Error: undefined identifier _arguments bsdutil.d(110): Error: _arguments must be an array or pointer type, not intUr typesafe variadic function, ur doin it wrong. You declare the typesafe variadic param as so: uint BinaryOrPlus(uint[] vals...) then just use vals. Typesafe variadic params are just sugar for passing an array literal. In fact you can also pass an array reference in place of a list of params. To that end, unless 4GL supports passing D arrays, you're going to have to do something else.
Feb 08 2008
Jarrett Billingsley schrieb:"Bjoern" <nanali nospam-wanadoo.fr> wrote in message news:foi37b$19vv$1 digitalmars.com...How to iterate over vals ?export extern (Windows) uint BinaryOrPlus(uint...) { uint result = _arguments[0]; for (int i = 1; i < _arguments.length; i++) { result |= _arguments[i]; } return result; } Unfortunately Error msg is : C:\dmd\projects\bsdutil>dmd -profile -odc:\dmd\projects\bsdutil\obj -ofBSDUTIL.D LL bsdutil.d demangle.d bsdutil.def bsdutil.d(110): Error: undefined identifier _arguments bsdutil.d(110): Error: _arguments must be an array or pointer type, not intUr typesafe variadic function, ur doin it wrong. You declare the typesafe variadic param as so: uint BinaryOrPlus(uint[] vals...) then just use vals.Typesafe variadic params are just sugar for passing an array literal. In fact you can also pass an array reference in place of a list of params. To that end, unless 4GL supports passing D arrays, you're going to have to do something else.I can only use C style fixed arrays but this will end in code like arr is fixed array on 3 uint = [WS_HONK, WS_TONK, WS_ITCH] so, no win for meokay let's forget about "typesafe" I can manage this in 4GL code, however following the D guidelines this should work : export extern (Windows) uint BinaryOrPlus(uint firstarg, ...) { uint result = firstarg; //_arguments[0]; for (int i = 1; i < _arguments.length; i++) { result |= *cast(uint *)_argptr; _argptr += uint.sizeof; } return result; } In fact it don't work and it is looks dirty. they question here is ; what is the matter with _arguments /// using Tango Thanks for spending your time Bjoern
Feb 08 2008
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message news:foic4a$1vk7$1 digitalmars.com..... Uh, seriously? It's an array.You declare the typesafe variadic param as so: uint BinaryOrPlus(uint[] vals...) then just use vals.How to iterate over vals ?okay let's forget about "typesafe" I can manage this in 4GL code, however following the D guidelines this should work : export extern (Windows) uint BinaryOrPlus(uint firstarg, ...) { uint result = firstarg; //_arguments[0]; for (int i = 1; i < _arguments.length; i++) { result |= *cast(uint *)_argptr; _argptr += uint.sizeof; } return result; } In fact it don't work and it is looks dirty. they question here is ; what is the matter with _arguments /// using Tangoextern(Windows) variadic functions don't have an _arguments parameter, only extern(D) variadic functions do. According to the spec, extern(C) (and maybe Windows, it doesn't say) are supposed to have an _argptr parameter but it doesn't seem to work :\ So, since you're basically writing a C function, you have to do it the C way: with va_start and the like. In phobos it's in std.c.stdarg, and in Tango, tango.stdc.stdarg. You'd do something like: export extern(Windows) uint BinOr(uint firstarg, ...) { va_list args; va_start(args, firstarg); // it's up to you to figure out the end of the list! // isn't that fun? va_end(args); } Lastly -- why _are_ you using this bizarre language anyway?
Feb 09 2008