digitalmars.D - Help with stdarg templates
- Ted Williams (23/23) Jun 01 2004 Hi
- J C Calvarese (43/74) Jun 01 2004 This at least compiles:
-
Ted Williams
(9/54)
Jun 01 2004
- J Anderson (17/41) Jun 05 2004 import std.c.stdarg;
Hi I am using the stdarg templates as in the following code: ===== int WriteLine( char[] format, ... ) { va_list args; alias va_start!(char []) start; alias va_arg!(Object) arg; start( args, format ); . . . ===== When I compile this I get the following errors (with line numbers adjusted:) console.d(8): function va_start (va_list ap,char[]parmn) does not match argume nt types (ubyte*,char[]) console.d(8): cannot implicitly convert ubyte* to va_list I've tried everything I can think of and can't find any combination of things that will compile. I think I have a fundamental flaw in my understanding of the way templates work. Can anyone help shed some light on this for me? Thanks, Ted
Jun 01 2004
Ted Williams wrote:Hi I am using the stdarg templates as in the following code: ===== int WriteLine( char[] format, ... ) { va_list args; alias va_start!(char []) start; alias va_arg!(Object) arg; start( args, format );This at least compiles: import std.c.stdarg; int WriteLine( char[] format, ... ) { va_list args; va_start!(char []) (args, format); va_end(args); return 1; } void main() {} Here's a fuller example is available from http://www.dsource.org/tutorials/index.php?show_example=94 ---------------------------------------------------------- import std.c.stdarg; int foo(char *x, ...) { va_list ap; va_start!(typeof(x))(ap, x); printf("&x = %p, ap = %p\n", &x, ap); int i; i = va_arg!(typeof(i))(ap); printf("i = %d\n", i); long l; l = va_arg!(typeof(l))(ap); printf("l = %lld\n", l); uint k; k = va_arg!(typeof(k))(ap); printf("k = %u\n", k); va_end(ap); return i + l + k; } void main() { int j; j = foo("hello", 3, 23L, 4); printf("j = %d\n", j); assert(j == 30); } Hope that helps... .. .. ===== When I compile this I get the following errors (with line numbers adjusted:) console.d(8): function va_start (va_list ap,char[]parmn) does not match argume nt types (ubyte*,char[]) console.d(8): cannot implicitly convert ubyte* to va_list I've tried everything I can think of and can't find any combination of things that will compile. I think I have a fundamental flaw in my understanding of the way templates work. Can anyone help shed some light on this for me? Thanks, Ted-- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/
Jun 01 2004
"J C Calvarese" <jcc7 cox.net> wrote in message news:c9jn35$gu9$1 digitaldaemon.com...Ted Williams wrote:<snip> I made my code look like the code above, and it still gives the same compiler error as before: console.d(101): function va_start (va_list ap,char[]parmn) does not match argument types (ubyte*,char[]) console.d(101): cannot implicitly convert ubyte* to va_list Could it be a compiler bug?Hi I am using the stdarg templates as in the following code: ===== int WriteLine( char[] format, ... ) { va_list args; alias va_start!(char []) start; alias va_arg!(Object) arg; start( args, format );This at least compiles: import std.c.stdarg; int WriteLine( char[] format, ... ) { va_list args; va_start!(char []) (args, format); va_end(args); return 1; } void main() {} Here's a fuller example is available from http://www.dsource.org/tutorials/index.php?show_example=94 ---------------------------------------------------------- import std.c.stdarg; int foo(char *x, ...) { va_list ap; va_start!(typeof(x))(ap, x); printf("&x = %p, ap = %p\n", &x, ap); int i; i = va_arg!(typeof(i))(ap); printf("i = %d\n", i); long l; l = va_arg!(typeof(l))(ap); printf("l = %lld\n", l); uint k; k = va_arg!(typeof(k))(ap); printf("k = %u\n", k); va_end(ap); return i + l + k; }
Jun 01 2004
Ted Williams wrote:Hi I am using the stdarg templates as in the following code: ===== int WriteLine( char[] format, ... ) { va_list args; alias va_start!(char []) start; alias va_arg!(Object) arg; start( args, format ); . . . ===== When I compile this I get the following errors (with line numbers adjusted:) console.d(8): function va_start (va_list ap,char[]parmn) does not match argume nt types (ubyte*,char[]) console.d(8): cannot implicitly convert ubyte* to va_list I've tried everything I can think of and can't find any combination of things that will compile. I think I have a fundamental flaw in my understanding of the way templates work. Can anyone help shed some light on this for me? Thanks, Tedimport std.c.stdarg; int WriteLine( char[] format, ... ) { va_list args; alias va_start!(char []) start; alias va_arg!(Object) arg; start( args, format ); return 0; } void main(char[][] args) { WriteLine("test"); } Works for me in dmd (.91), so I can't see anything wrong with your code. -- -Anderson: http://badmama.com.au/~anderson/
Jun 05 2004