LuaPy:実数/文字列データの受け渡し

2016-05-28 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
7、2、0、0、1、 0、0、0、0、0(40)で、換算ポイント 88pt 。
「Perl」「化学業界」「硝子業界」「グルコサミン」、
「Python」「Firefox」bg値変動。
「C言語」「FM COCOLO」「e-radio」「FM青森」変化無し。
・-・ - -・

さて、本文。

前(2016-05-26)の記事「LuaPy.dll 作成
その後、
“実数型”データや“文字列”の受け渡し方法を学習した。


“実数型”データの使用方法:

機能的には、
 IT[0] がポイントする、double 型配列 DT に於いて、
 DT[1] = np.exp( DT[0] )
とするもの。

呼び出す Lua ファイルは“TestMain.gsl”とし、
“Sub.py”と云うファイルで、“Fun”関数を定義する。
--------------- TestMain.gsl ------------------
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
Int = |x| ffi.cast( 'int32_t', x )
LuaPy = ffi.load('LuaPy')
ffi.cdef[[
int inter( char*, char*, void* );
]]
IT = ffi.new( 'int32_t[1]' )
DT = ffi.new( 'double[2]' )
IT[0] = Int( voidA(DT) )
DT[0] = 1.5
_ = LuaPy.inter( charA('Sub'), charA('Fun'), voidA(IT) )
print( DT[1] )
_ = io.read(1)
#============== Sub.py ====================
import ctypes as ct
import numpy as np
def Fun( p ):
IT = ct.cast( p, ct.POINTER( ct.c_long ) )
DT = ct.cast( IT[0], ct.POINTER(ct.c_double) )
DT[1] = np.exp(DT[0])
return 0
以上の2本を作って、
「TestMain.gsl」をダブルクリックすると、・・・

  4.4816890703381

と表示して [Enter] キー入力待ちの状態に成る。

OKですね。


次は、文字列の受け渡し方法:

文字列 'Enter' を渡して、
'modori' を受け取る。
--------------- TestMain.gsl ------------------
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
Int = |x| ffi.cast( 'int32_t', x )
LuaPy = ffi.load('LuaPy')
ffi.cdef[[
int inter( char*, char*, void* );
]]
IT = ffi.new( 'int32_t[2]' )
IT[0] = Int( charA('enter') )

str1 = ffi.new( 'int8_t[255]' )
IT[1] = Int( str1 ) -- 戻り文字列領域を用意
_ =LuaPy.inter( charA('Sub'), charA('Fun'), voidA(IT) )
str1 = ffi.string( voidA(IT[1]) )
print( #str1, str1 )
_ = io.read(1)
#============== Sub.py ====================
# -*- coding: utf-8 -*-
import ctypes as ct
def Fun( p ):
IT = ct.cast( p, ct.POINTER(ct.c_long) )
s = ct.create_string_buffer(255)
w=ct.cdll.msvcrt.memcpy(s,IT[0],10)
### print ct.sizeof(s) # 255
### print s.value # 'enter' : gsl の IT[0]
s0 = s.value
print len(s0) # 5
print s0 # 'enter' : gsl の IT[0]

s1 = "modori"
s2 = ct.c_char_p(s1)
### print s2 # c_char_p('modori')
### print s2.value # modori
w=ct.cdll.msvcrt.memcpy( IT[1], s2.value, len(s1) ) # 'modori' コピー
return 0
以上の2本を作って、
「TestMain.gsl」をダブルクリックすると、・・・

  5
  enter
  6, modori

と表示して、[Enter]キー待ちになる。


これで、自由に(とは云ってもエラーチェックは皆無だが)、
Lua から、Python 関数が呼べる か ナ ?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


160414
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク