Je cherche des exemples Fortran (également fonction d'interface) pour passer des tableaux comme arguments aux fonctions lua. J'ai été en mesure d'utiliser fortlua project pour commencer. Mais l'exemple fourni passe un élément à la fois. Appréciez toute aide.Passage de tableaux à lua en tant qu'argument de fonction de Fortran
--Lua code
local q1
local q2
function getoutput(qout1, qout2)
-- qout1 and qout2 are arrays with some dimension
q1 = qout1
q2 = qout2
end
- Fortran I utilisé
config_function('getoutput', args, 2, cstatus)
Mais la définition des args est là où je suis à la recherche d'un peu d'aide. Le code suivant fait le travail pour la variable d'argument scalaire pas un tableau je devine.
!> Evaluate a function in the config file and get its result.
FUNCTION config_function(name,args,nargs,status)
REAL :: config_function
CHARACTER(LEN=*) :: name
REAL, DIMENSION(nargs) :: args
REAL(KIND=c_double) :: anarg
INTEGER :: nargs
INTEGER :: status
INTEGER :: iargs
INTEGER(c_int) :: stackstart
stackstart = lua_gettop(mluastate)
config_function = 0
status = 0
CALL lua_getglobal(mluastate,TRIM(name)//C_NULL_CHAR)
IF (lua_type(mluastate,-1) .eq. LUA_TFUNCTION) THEN
DO iargs = 1,nargs
anarg = args(iargs)
CALL lua_pushnumber(mluastate,anarg)
ENDDO
IF (lua_pcall(mluastate,nargs,1,0) .eq. 0) THEN
if (lua_isnumber(mluastate,-1) .ne. 0) THEN
config_function = lua_tonumber(mluastate,-1)
CALL lua_settop(mluastate,-2)
ELSE
! Nothing to pop here
status=-3
ENDIF
ELSE
CALL lua_settop(mluastate,-2)
status=-2
ENDIF
ELSE
CALL lua_settop(mluastate,-2)
status=-1
ENDIF
IF (stackstart .ne. lua_gettop(mluastate)) THEN
WRITE(*,*) 'The stack is a different size coming out of config_function'
ENDIF
END FUNCTION config_function
Utilisez le tag [tag: fortran] pour toutes les questions Fortran. –
Vous pouvez insérer des éléments dans une table, puis passer cette table à la fonction. Cependant, vous devriez toujours pousser les éléments un par un dans la table. J'imagine que si vous regardez de gros morceaux de données, il serait peut-être préférable d'utiliser userdata, bien que cela puisse être assez complexe. Dans aotus, nous utilisons également la mise de scalaires individuels sur la pile, bien que vous puissiez boucler sur un nombre arbitraire d'éléments: https://geb.sts.nt.uni-siegen.de/doxy/aotus/module/aot_fun_module.html – haraldkl