variable argument lenth mpz init

enders game
Fri, 27 Dec 2002 20:24:58 -0800 (PST)

--- Kevin Ryde <> wrote:
> enders game <> writes:
> >
> > I tried
> > passing the actual mpz_t variables, and printing
> the
> > memory addresses, but I got copied mpz_ts and not
> > pointers.  
> I think you'll find "a" and "&a" give the same
> address passed.  It
> might be easier to use "void *" in the mpz_init_va
> to see that.
> This all comes from mpz_t being a one element array
> of a certain
> structure, so as a variable it makes space but as a
> function parameter
> it's a pointer.

I didn't understand that before, I saw how it was
typedeffed to a one element structure but didnt see
why.  That's pretty cool, but could use a note under
integer internals.

> I guess "va_arg (ap, mpz_t)" doesn't do what might
> be hoped.  It seems
> to step by the size of the structure, not a pointer.
> I guess we don't document "mpz_ptr".  "MP_INT *" as
> a throwback to gmp
> 1.x days would be a possibility.  Or forget about
> wimpy type checking
> and use "void *".
> Should put an example of this in the manual I
> suppose :).

I changed the code to be more pointer oriented.  I
used a pointer to mpz_t which required a typecast from
mpz_t upon assignment, but hey a pointer is a pointer
is a pointer.

Here is the revised code:

#include <stdarg.h>
#include <stdio.h>
#include <gmp.h>

mpz_init_va(mpz_t first, ...);

	mpz_t a, b, c;

	mpz_init_va(a, b, c, NULL);

	mpz_set_ui(a, 53);
	mpz_set_ui(b, 34);
	mpz_set_ui(c, 583);
	gmp_printf("a: %Zd b: %Zd c: %Zd\n", a, b, c);

mpz_init_va(mpz_t first, ...)
	mpz_t *ptr;
	va_list ap;

	ptr = (mpz_t *)first;

	va_start(ap, first);
		ptr = va_arg(ap, mpz_t *);
	}while(ptr != NULL);


PS: is it always safe to use the operand of a function
as the result receiving operand?  If the result of a
calculation is stored in the receiving operand before
the calculation is completed then the results could be corrupted.

Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.