Guys, thanks for advices.
After all I have proper code.

simple.d

import core.runtime;
import std.stdio;
import std.string;
import std.conv;

version(Windows)
{
    import core.sys.windows.windows;
    alias GetProcAddress GetProc;
}
else
    version(Linux) // not tested
    {
        import core.sys.linux.linux;
        alias dlsym GetProc;
    }

alias extern(C) void function (double *, int) func_One;
alias extern(C) void function (double *, int, ref int) func_Two;

void main(string[] args)
{
    if (args.count != 2)
        return;

    size_t size = parse!int(args[1]);

    writeln("Accept: ", size);

    double[] arr = new double[size];

    auto dllfile = "simple.dll";

    void * lib = Runtime.loadLibrary(dllfile);

    if (!lib)
    {
        writeln("Lib!");
        return;
    }

func_One f_One = cast(func_One) GetProc(lib, "fOne".toStringz);
    if (f_One is null)
    {
        writeln("f_One!");
        return;
    }

func_Two f_Two = cast(func_Two) GetProc(lib, "fTwo".toStringz);
    if (f_Two is null)
    {
        writeln("f_Two!");
        return;
    }

    f_One(arr.ptr, arr.length);

    writeln("array size: ", arr.length);

    for(int k = 0; k < arr.length; k++)
    {
        writeln(k + 1, '\t', arr[k]);
    }

    int ans = 0;
    f_Two(arr.ptr, arr.length, ans);

    writeln("fTwo = ", ans);

    Runtime.unloadLibrary(lib);
}

simple.f95 compiled with gfortran -shared -O3 -o simple.dll simple.f95

subroutine fOne(a, i) bind(C, name = "fOne")
    integer*4, value, intent(in) :: i
    real*8, dimension(i), intent(out) :: a
    print *, 'entry fortran dll'
    print *, 'size', i
    do j = 1, i
        a(j) = j * j;
        print *, j
    end do
    print *, 'exit fortran dll'
end

subroutine fTwo(a, i, ans) bind(C, name = "fTwo")
    integer*4, value, intent(in) :: i
    real*8, dimension(i), intent(in) :: a
    integer*4, intent(out) :: ans
    print *, 'entry fortran dll'
    print *, 'size', i
    if (a(1) .lt. 100) then
        print *, 'inside if'
        ans = 1
        print *, 'end if'
        return
    end if
    ans = 0
    print *, 'exit fortran dll'
end


Reply via email to