[ruby-list:47678] プログラム実行時に「[BUG] Segmentation fault」
From:
染谷 康一 <kouichi_someya@...>
Date:
2010-12-09 13:56:29 UTC
List:
ruby-list #47678
染谷と申します。
FelicaLibを使用するプログラムの実行で
以下のメッセージが出力されました。
== ここから =============================================
C:\TEMP>felica_dump.rb
C:\TEMP/felicalib.rb:54: [BUG] Segmentation fault
ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mswin32]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
== ここまで =============================================
実行環境は、以下の通りです。
OS:WindowsXP
Ruby:Ruby-1.8.7(p302)
felicalib.rbの内容ですが、以下の通りです。
== ここから =============================================
require 'Win32API'
module FelicaLib
dllname = 'felicalib.dll'
$pasori_open = Win32API.new(dllname, 'pasori_open', 'P', 'P')
$pasori_close = Win32API.new(dllname, 'pasori_close', 'P', 'V')
$pasori_init = Win32API.new(dllname, 'pasori_init', 'P', 'I')
$felica_polling = Win32API.new(dllname, 'felica_polling', %w(P I I I), 'P'
)
$felica_free = Win32API.new(dllname, 'felica_free', 'P', 'V')
$felica_getidm = Win32API.new(dllname, 'felica_getidm', %w(P P), 'V')
$felica_getpmm = Win32API.new(dllname, 'felica_getpmm', %w(P P), 'V')
$felica_read_without_encryption02 = Win32API.new(dllname, 'felica_read_wit
hout_encryption02', %w(P I I I P), 'I')
$felica_enum_systemcode = Win32API.new(dllname, 'felica_enum_systemcode',
'P', 'P')
$felica_enum_service = Win32API.new(dllname, 'felica_enum_service', %w(P I
), 'P')
POLLING_ANY = 0xffff
POLLING_EDY = 0xfe00
POLLING_SUICA = 0x0003
SERVICE_EDY = 0x170f
SERVICE_SUICA_INOUT = 0x108f
SERVICE_SUICA_HISTORY = 0x090f
#SERVICE_SUICA = 0x090f
def pasori_open(str = nil)
$pasori_open.call(str)
end
def pasori_close(pasori)
$pasori_close.call(pasori)
end
def pasori_init(pasori)
$pasori_init.call(pasori)
end
def felica_polling(pasori, systemcode, rfu, timeslot)
$felica_polling.call(pasori, systemcode, rfu, timeslot)
end
def felica_free(felica)
$felica_free.call(felica)
end
def felica_getidm(felica, buf)
$felica_getidm.call(felica, buf)
end
def felica_getpmm(felica, buf)
$felica_getpmm.call(felica, buf)
end
def felica_read_without_encryption02(felica, servicecode, mode, addr, buf)
$felica_read_without_encryption02.call(felica, servicecode, mode, addr
, buf)
end
def felica_enum_systemcode(pasori)
$felica_enum_systemcode.call(pasori)
end
def felica_enum_service(pasori, systemcode)
$felica_enum_service.call(pasori, systemcode)
end
module_function :pasori_open, :pasori_close, :pasori_init, :felica_polling, :f
elica_free
module_function :felica_getidm, :felica_getpmm, :felica_read_without_encry
ption02
module_function :felica_enum_systemcode, :felica_enum_service
end
module FelicaLib
class << self
def felica_raw_values(systemcode, servicecode, little_endian = false)
values = []
b = Array.new(4)
psr = pasori_open ""
pasori_init(psr)
flc = felica_polling(psr, systemcode, 0, 0)
i = 0
while felica_read_without_encryption02(flc, servicecode, 0, i, b) == 0
row = b.to_a('I')
data = ""
row.size.times do |j|
if little_endian
4.times { |k| data += sprintf("%02x", (row[j].to_i >> (8 *
k)) & 0xff) }
else
data += sprintf("%08x", row[j].to_i & 0xffffffff)
end
end
yield data if block_given?
values << data
i += 1
end
pasori_close(psr)
values
end
end
end
※コメント行削除してあります。
== ここまで =============================================
このfelicalib.rbの54行目は、
def pasori_init(pasori)
$pasori_init.call(pasori) <=この行です。
end
です。
私のコーディングに誤りがあるのでしょうか?
初めて出たメッセージですので、対処方法が
わかりません。
恐れ入りますが、何方かご教授ください。
宜しくお願いします。