簡體   English   中英

將數組作為函數參數從Fortran傳遞給lua

[英]Passing arrays to lua as function argument from Fortran

我正在尋找Fortran示例(也是接口函數)將數組作為參數傳遞給lua函數。 我能夠使用fortlua項目開始。 但是提供的示例一次傳遞一個元素。 感謝任何幫助。

--Lua code 

local q1
local q2
function getoutput( qout1, qout2)
-- qout1 and qout2 are arrays with some dimension
  q1 = qout1
  q2 = qout2
end

- 在fortran我用過

config_function('getoutput', args, 2, cstatus)

但設置args是我尋求幫助的地方。 下面的代碼為標量參數變量做的工作不是我想的數組。

!> 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

為了擴展我的評論,這是一個在Aotus的幫助下實現數組參數的小程序:

program aot_vecarg_test
  use flu_binding, only: flu_State, flu_settop

  use aotus_module, only: open_config_file, close_config
  use aot_fun_module, only: aot_fun_type, aot_fun_do, &
    &                       aot_fun_put, aot_fun_open, &
    &                       aot_fun_close
  use aot_references_module, only: aot_reference_for, aot_reference_to_top
  use aot_table_module, only: aot_table_open, aot_table_close, &
    &                         aot_table_from_1Darray

  implicit none

  type(flu_State) :: conf
  type(aot_fun_type) :: luafun
  integer :: iError
  character(len=80) :: ErrString
  real :: args(2)
  integer :: argref
  integer :: arghandle

  args(1) = 1.0
  args(2) = 2.0

  call create_script('aot_vecarg_test_config.lua')
  write(*,*)
  write(*,*) 'Running aot_vecarg_test...'
  write(*,*) ' * open_config_file (aot_vecarg_test_config.lua)'
  call open_config_file(L = conf, filename = 'aot_vecarg_test_config.lua', &
    &                   ErrCode = iError, ErrString = ErrString)
  if (iError /= 0) then
    write(*,*) ' : unexpected FATAL Error occured !!!'
    write(*,*) ' : Could not open the config file aot_ref_test_config.lua:'
    write(*,*) trim(ErrString)
    STOP
  end if
  write(*,*) '  : success.'

  ! Create a table with data
  call aot_table_from_1Darray( L       = conf,      &
    &                          thandle = arghandle, &
    &                          val     = args       )
  ! Create a reference to this table
  call flu_setTop(L = conf, n = arghandle)
  argref = aot_reference_for(L = conf)

  ! Start the processing of the function
  call aot_fun_open(L = conf, fun = luafun, key = 'print_array')
  ! Put the previously defined table onto the stack by using the reference
  call aot_reference_to_top(L = conf, ref = argref)
  ! Put the top of the stack to the argument list of the Lua function
  call aot_fun_put(L = conf, fun = luafun)
  ! Execute the Lua function
  call aot_fun_do(L = conf, fun = luafun, nresults = 0)
  call aot_fun_close(L = conf, fun = luafun)

  write(*,*) ' * close_conf'
  call close_config(conf)
  write(*,*) '  : success.'
  write(*,*) '... Done with aot_vecarg_test.'
  write(*,*) 'PASSED'

contains

  subroutine create_script(filename)
    character(len=*) :: filename

    open(file=trim(filename), unit=22, action='write', status='replace')
    write(22,*) '-- test script for vectorial argument'
    write(22,*) 'function print_array(x)'
    write(22,*) '  for i, num in ipairs(x) do'
    write(22,*) '    print("Lua:"..num)'
    write(22,*) '  end'
    write(22,*) 'end'
    close(22)
  end subroutine create_script

end program aot_vecarg_test

這使用了一個小幫助例程aot_table_from_1Darray ,它為一個實數數組創建一個Lua表。 查看其代碼,了解如何將數據放入表中。

然后,我們創建對該表的引用,以便以后輕松查找並將其作為參數傳遞給Lua函數。 該示例創建了相應的Lua腳本本身,該腳本定義了一個簡單的函數,該函數需要將單個表作為輸入並打印每個表條目。 運行它會產生以下輸出:

 Running aot_vecarg_test...
  * open_config_file (aot_vecarg_test_config.lua)
   : success.
Lua:1.0
Lua:2.0
  * close_conf
   : success.
 ... Done with aot_vecarg_test.
 PASSED

以Lua開頭的兩行以Lua函數print_array編寫。

還有其他可能的解決方案,但我希望這至少能說明如何做到這一點。 我們還可以考慮擴展aot_fun_put接口來處理數組本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM