[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2ch.scのread.cgiへ]
Update time : 10/30 23:33 / Filesize : 168 KB / Number-of Response : 749
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Julia Juno Jupyter part1



1 名前:デフォルトの名無しさん [2016/02/12(金) 19:05:13.83 ID:zhNvVfnf.net]
LLVM で動く Julia のお勉強
Python に少し似てネイティブの速さで動く素敵な関数型言語
julialang.org/
junolab.org/
jupyter.org/

関連
Pythonista のための Julia 100 問 100 答
bicycle1885.hatenablog.com/entry/2014/12/23/170745

7 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 10:11:00.83 ID:3L3e3K/U.net]
という訳で保守がてら

juliaからCの関数を呼んでみた

julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", "abc")
abc
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}, Int), "%s%d", "abc", 9)
abc9

引数の数が自由なのがいいねっ!

8 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 10:12:28.35 ID:3L3e3K/U.net]
おれおれDLLだと呼び出し方がちょっと変わるみたい
(最近仕様が変わったらしいので古いドキュソの通りやると動かない
っていうか最新のドキュソもまだ動かないサンプルのままだぞω)

julia> libcurl = Base.Libdl.dlopen_e("./libcurl.dll")
Ptr{Void} @0x2c76e2c0
julia> curl_version = Base.Libdl.dlsym(libcurl, :curl_version)
Ptr{Void} @0x6b25c740
julia> curl_getenv = Base.Libdl.dlsym(libcurl, :curl_getenv)
Ptr{Void} @0x6b25c854
julia> curl_free = Base.Libdl.dlsym(libcurl, :curl_free)
Ptr{Void} @0x6b25cbf8
julia> p = ccall(curl_version, Ptr{Cchar}, ())
Ptr{Int8} @0x6b29c060
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", p)
libcurl/7.30.0 OpenSSL/1.0.1e zlib/1.2.7
julia> q = ccall(curl_getenv, Ptr{Cchar}, (Ptr{Cchar}, ), "NUMBER_OF_PROCESSORS")
Ptr{Int8} @0x2c76df10
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", q)
8
julia> ccall(curl_free, Cuint, (Ptr{Void}, ), q)
0x00000001
julia> Base.Libdl.dlclose(libcurl)

うっかり解放忘れそう

9 名前:デフォルトの名無しさん [2016/02/13(土) 10:14:00.39 ID:3L3e3K/U.net]
stdcallな関数だとさらにこんな感じだよ

julia> user32 = Base.Libdl.dlopen_e("user32.dll")
Ptr{Void} @0x2c767300
julia> MessageBoxA = Base.Libdl.dlsym(user32, :MessageBoxA)
Ptr{Void} @0x76c6cf50
julia> err = ccall(MessageBoxA, stdcall, UInt, (Ptr{UInt}, Ptr{Cchar}, Ptr{Cchar}, UInt), 0, "Hello, work!", "Message", 0)
0x00000001

wchar_tはArray{UInt16,1}らしい(UTF8を表示したければ先にwchar_tへの変換が必要)

julia> MessageBoxW = Base.Libdl.dlsym(user32, :MessageBoxW)
Ptr{Void} @0x76c6d280
julia> err = ccall(MessageBoxW, stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Array{UInt16,1}([0x304C,0x3063,0xFF01,0]), Array{UInt16,1}([0x306C,0x308B,0x307D,0]), 0)
0x00000001
julia> Base.Libdl.dlclose(user32)

解放解放

引数や戻り値の定義を呼び出しのたびに何度も書くの面倒なのでマクロを書くのが良いらしいよ

10 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 10:17:20.41 ID:3L3e3K/U.net]
>っていうか最新のドキュソもまだ動かないサンプルのままだぞω

ああごめん動くわ

11 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 10:22:27.58 ID:3L3e3K/U.net]
ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", ccall((:curl_version, :libcurl), Ptr{Cchar}, ()))

err = ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Array{UInt16,1}([0x304C,0x3063,0xFF01,0]), Array{UInt16,1}([0x306C,0x308B,0x307D,0]), 0)

Array{UInt16,1}のところはArray{Cwchar_t}とかVector{Cwchar_t}とも書ける

err = ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Vector{Cwchar_t}([0x304C,0x3063,0xFF01,0]), Array{Cwchar_t}([0x306C,0x308B,0x307D,0]), 0)

これでいいね
loadは省けるけど毎回loadと解放してくれてるんだろうか






[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<168KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef