|
forums.silverfrost.com Welcome to the Silverfrost forums
|
View previous topic :: View next topic |
Author |
Message |
Anonymous Guest
|
Posted: Mon Jul 17, 2006 9:48 pm Post subject: passing pointers to functions from c# to fortran |
|
|
I have the following function in a fortran library that I want to call from C# under .NET:
in fortran .dll called 'odepack':
SUBROUTINE DLSODAR (F, NEQ, Y, T, TOUT, ITOL, RTOL, ATOL, ITASK,
1 ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, JT,
2 G, NG, JROOT)
assembly_interface (name="DLSODAR")
EXTERNAL F, JAC, G
...
In the C# code, I want to call the above function, and pass references to the three required external functions:
odepack.DLSODAR (F, NEQ, Y, T, TOUT, ITOL, RTOL, ATOL, ITASK,
ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, JT,
G, NG, JROOT);
The question is, how do I define the external functions in C# and how do I pass them via the interface? I am not overly experienced in either language.
Any help would be greatly appreciated.
Chris Blanksby |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7934 Location: Salford, UK
|
Posted: Tue Jul 18, 2006 6:36 am Post subject: passing pointers to functions from c# to fortran |
|
|
Chris
Have you looked at the Samples in the FTN95 help file and in C:Program FilesSalford SoftwareFTN95DemoNET FortranCalculatorCS etc.?
As I recall, all you need to do is to set up a reference to the DLL in your C# project.
|
|
Back to top |
|
|
Anonymous Guest
|
Posted: Tue Jul 18, 2006 4:30 pm Post subject: passing pointers to functions from c# to fortran |
|
|
Yes, I have set up the reference and can call normal fortran functions from c# (for instance, anything I have to pass reals, integers, strings, arrays etc.) but I am not sure how to pass references to other functions. I did look in the sample and could not see any examples of this (only passing doubles, strings etc.) but maybe I am missing something.
To be clearer, I want to be able to define a function (in c#) and I want to be able to pass a reference to this function to a second function that I am calling from the fortran dll. The fortran function then calls the referenced c# function to execute certain parts of its code. |
|
Back to top |
|
|
Martin
Joined: 09 Sep 2004 Posts: 43
|
Posted: Wed Jul 26, 2006 3:56 pm Post subject: passing pointers to functions from c# to fortran |
|
|
I'm not sure this is exactly what you want, but it might help. The following example is a VB.NET program calling a routine in an FTN95.NET library, passing a reference to another VB.NET function.
=== File: delegate_defs.vb ===
[pre]
public delegate sub DelegateA (i as integer)
[/pre]
===
=== File: delegate_library.f90 ===
[pre]
subroutine test (callback)
external callback
integer i
print *, "in library, calling callback"
do i = 1, 3
call callback(i)
end do
end
[/pre]
===
=== File: delegate_interface.f90 ===
[pre]
! Interface between user's program and library dll.
! This references the library dll and the delegate definitions dll.
! A module to contain the user supplied delegate of the correct type.
! There needs to be one of these modules for each defined delegate.
module delegate_a_data
object("DelegateA") delegate_object
end module
! An interface to the users delegate for the library to call.
! There needs to be one of these for each defined delegate.
subroutine invoke_delegate_a (i)
use delegate_a_data
! Argument declarations.
integer i
! Invoke the user defined delegate.
assembly_external("DelegateA.Invoke") DelegateA_Invoke
print *, "in interface, invoking delegate"
call DelegateA_Invoke(delegate_object, i)
end subroutine
! An interface to the library routine which replaces all delegate arguments with externals.
! There needs to be one of these for each routine in the library that has an external argument.
subroutine itest_ (delegate_obj)
use delegate_a_data
assembly_interface(name="itest")
object("DelegateA") delegate_obj
external invoke_delegate_a
! Save the delegate object.
delegate_object = delegate_obj
! Call the library routine, passing on all arguments, but with all delegates replaced with their equivalent externals.
print *, "in interface, calling library"
call test(invoke_delegate_a)
end subroutine
[/pre]
===
=== File: delegate_main.vb ===
[pre]
' The user's program.
' This will reference the library interface dll and the delegate definitions dll.
module test
private sub MyCallback (i as integer)
System.Console.WriteLine("in callback: "+CStr(i))
end sub
sub main ()
System.Console.WriteLine("in main program, calling library via interface")
delegate_interface.itest(AddressOf MyCallback)
end sub
end module
[/pre]
===
=== File: build.bat ===
[pre]
ftn95 delegate_library.f90 /clr /link delegate_library.dll
vbc /target:library delegate_defs.vb
ftn95 delegate_interface.f90 /clr /ref delegate_defs.dll /ref delegate_library.dll /link delegate_interface.dll
vbc delegate_main.vb /r:delegate_defs.dll,delegate_interface.dll
[/pre]
===
Place all these files into the same directory and run build.bat from the same directory. It should produce 3 dll's and 1 exe.
Some notes:
This uses a .NET delegate as a callback routine (effectively a function pointer). The code is in VB.NET but should be fairly easy to port to C#. This code is designed to allow a VB.NET program call a routine in an FTN95.NET dll with minimal changes - so it uses the code in delegate_interface.f90 to make the call as transparent as possible.
The user's code is contained in delegate_main.vb, the delegate definitions are in delegate_defs.vb, the interface code is in delegate_interface.f90 and the library code is in delegate_library.f90.
The interface code is not re-entrant (so it's not thread safe).
The interface code (delegate_interface.f90) could be compiled into the same dll as the library code (delegate_library.f90), but the delegate definitions (delegate_defs.vb) need to remain separate (as they are referenced by both the interface code and the user's program).
More information:
All the delegate types need to be defined with the correct routine signatures so both the user's code and the library code can use them. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|