www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Help with stdarg templates

reply "Ted Williams" <ted.wil.no.spam verizon.net> writes:
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
next sibling parent reply J C Calvarese <jcc7 cox.net> writes:
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
parent "Ted Williams" <ted.wil.no.spam verizon.net> writes:
"J C Calvarese" <jcc7 cox.net> wrote in message
news:c9jn35$gu9$1 digitaldaemon.com...
 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; }

<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?
Jun 01 2004
prev sibling parent J Anderson <REMOVEanderson badmama.com.au> writes:
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,
Ted

  

import 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