On Wednesday, 7 February 2018 at 20:10:10 UTC, dekevin wrote:
On Wednesday, 7 February 2018 at 16:26:16 UTC, Dominikus Dittes Scherkl wrote:
On Wednesday, 7 February 2018 at 12:10:38 UTC, dekevin wrote:


struct ℚ{
ℤ num, den; //cannot call constructors on these, since they require gmp_init, which requires runtime code
     //Default initialiser disabled, since else num=0,den=0

You can use a different default initializer:
      ℤ num = 0, den = 1;

Thus avoiding the bad denominator.

I appreciate the help, but I cannot instantiate these variables with a constructor. Whenever I do, the compiler tries to figure out its values at compile-time. This it cannot do however, since the code requires gmp_init for constructing an explicit value, which is only available after dynamically linking GMP.

Here is the error I get:
source/gmp/z.d(117): Error: __gmpz_init_set_si cannot be interpreted at compile time, because it has no available source code source/util.d(575): called from here: _MpZ(__mpz_struct(0, 0, null)).this(0) source/gmp/z.d(117): Error: __gmpz_init_set_si cannot be interpreted at compile time, because it has no available source code source/util.d(575): called from here: _MpZ(__mpz_struct(0, 0, null)).this(1)

I don't really know what to do now, since I have another struct which already uses static variables with the same naming convention and I'll also need it a second time when I write the bindings to MPFR.

I should perhaps add how  ℤ looks like.
Here is a stripped-down version:

struct ℤ {
    @disable this();
    this(T)(T value) @trusted
        if (isArithmetic!T)
    {
        version(ccc) { ++_ccc; }
        static      if (isUnsigned!T)
            __gmpz_init_set_ui(_ptr, value);
        else static if (isFloating!T)
            __gmpz_init_set_d(_ptr, value);
        else                    // isSigned integral
            __gmpz_init_set_si(_ptr, value);
    }

~this() @trusted
    {
        assert(_ptr, "Pointer is null");
        //if(hasBeenInit)
        __gmpz_clear(_ptr); version(ccc) { ++_ccc; }

    }

    inout(__mpz_struct)* _ptr() inout return @system
    {
        return &_z;
    }
}

Reply via email to