On Tuesday, 2 February 2016 at 22:56:28 UTC, jmh530 wrote:
I'm working on generating a binding to a C library. I've got the .h file converted and can call some parts of the library with no errors. However, I have reached a stumbling block in a critical part.

The library requires passing function pointers to various functions in the library. When I try to run these functions, I get an Access Violation error. I enabled additional DMD warnings, which helped pinpoint the issue.

My D code calls a C function. One of the parameters to the C function is a function pointer to a D function. This D function (below) is one that I copied from the C library's tutorial. I only slightly changed the signature. This function is eventually called in other functions in the C library.

double myfunc(uint n, const double* x, double* grad, void* my_func_data)
{
    if (grad)
    {
        grad[0] = 0.0;
        grad[1] = 0.5 / sqrt(x[1]);
    }
    return sqrt(x[1]);
}

The line (though likely the next will too) that causes a problem is

grad[0] = 0.0;

Thus, as it is an Access Violation, I'm guessing the issue is with accessing elements of arrays in the D function from the C function. I don't know. When I try to call the D function in D, it works, but I have to refer to x and grad as x.ptr and grad.ptr.

I'm not sure how to go about fixing this...

Is grad allocated in the D code? If so, it could have been collected because the GC lost track of its use when passing to and from the C code. Or is grad owned by the C code? If so, either there is a bug in the library or it's misused, because its memory has been freed/has never been allocated/has gone out of scope.



Reply via email to