If pointer type points to an array, `ptr UncheckedArray[cdouble]` (or `ptr 
array[3, cdouble]` if array size is fixed) is better than `ptr cdouble`.

Example runnable code:
    
    
    import std/strformat
    
    {.emit:"""
    typedef void (*fptr_f) (double, double *, double *, void *);
    void foo(fptr_f f,  double *y, void *_data);
    
    void foo(fptr_f f,  double *y, void *_data) {
      double ydot[3];
      
      f(123.0, y, ydot, _data);
      printf("In C function\n");
      printf("ydot = [%f, %f, %f]\n", ydot[0], ydot[1], ydot[2]);
    }
    """.}
    
    type fptr_f = proc(t: cdouble; y: ptr UncheckedArray[cdouble]; ydot: ptr 
UncheckedArray[cdouble]; data: pointer) {.cdecl.}
    proc foo(f: fptr_f; y: ptr UncheckedArray[cdouble]; data: pointer): void 
{.importc: "foo".}
    
    proc nimCallback(t: cdouble; y: ptr UncheckedArray[cdouble]; ydot: ptr 
UncheckedArray[cdouble]; data: pointer) {.cdecl.} =
      echo "In nimCallback"
      echo &"t = {t}"
      echo &"y = [{y[0]}, {y[1]}, {y[2]}]"
      
      for i in 0..2:
        ydot[i] = y[i]
    
    var y = [cdouble 1.0, 2.0, 3.0];
    foo(nimCallback, cast[ptr UncheckedArray[cdouble]](y[0].addr), nil)
    
    Run

Reply via email to