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
"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
int
Ur 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.
Jarrett Billingsley schrieb:
"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
int
Ur typesafe variadic function, ur doin it wrong.
You declare the typesafe variadic param as so:
uint BinaryOrPlus(uint[] vals...)
then just use vals.
How to iterate over 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 me
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 Tango
Thanks for spending your time
Bjoern
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message
news:foic4a$1vk7$1 digitalmars.com...
You declare the typesafe variadic param as so:
uint BinaryOrPlus(uint[] vals...)
then just use vals.
How to iterate over vals ?
.. Uh, seriously?
It's an array.
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 Tango
extern(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?