From: "染谷 康一" Date: 2010-12-12T16:39:39+09:00 Subject: [ruby-list:47691] Re: プログラム実行時に「[BUG] Segmentation fault」 再び、染谷です。 今度は、DLで組んでみましたが、またセグメンテーション・ フォルトが発生しました。 DLで組んだPGは、以下の通りです。 === ここから ===================================================== require 'dl' require 'dl/import' module FelicaLib extend DL::Importable dlload 'felicalib.dll' typealias 'uint8', 'unsigned char' typealias 'uint16', 'unsigned int' #typealias 'uint16', 'unsigned short int' extern "pasori* pasori_open(char*)" extern "void pasori_close(pasori*)" extern "int pasori_init(pasori *)" extern "felica *felica_polling(pasori *, uint16, uint8, uint8)" extern "void felica_free(felica *)" extern "void felica_getidm(felica *, uint8 *)" extern "void felica_getpmm(felica *, uint8 *)" extern "int felica_read_without_encryption02(felica *, int, int, uint8, ui nt8 *)" extern "felica * felica_enum_systemcode(pasori *)" extern "felica * felica_enum_service(pasori *, uint16)" POLLING_ANY = 0xffff POLLING_EDY = 0xfe00 #-- システムコード: 共通領域 (Edy などが使 用) POLLING_SUICA = 0x0003 #-- システムコード: サイバネ領域 SERVICE_EDY = 0x170f SERVICE_SUICA_INOUT = 0x108f SERVICE_SUICA_HISTORY = 0x090f end module FelicaLib class << self def felica_raw_values(systemcode, servicecode, little_endian = false) values = [] buf = 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, buf ) == 0 row = buf.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 === ここまで ===================================================== 実行PGは、前メールと同じなので省略します。 実行したところ、前と同じメッセージが出てしまいました。 どこまで実行されたか確認するため、デバッグモードで 実行してみました。 出力結果は以下の通りです。 === ここから ===================================================== C:\TEMP>ruby -d felica_dump.rb "[DL] call pasori_open with [\"\"]" "[DL] retval=# args=[\"\" ]" "[DL] call pasori_init with [#]" "[DL] retval=0 args=[#]" "[DL] call felica_polling with [#, 3, 0, 0]" "[DL] retval=nil args=[#, 3 , 0, 0]" "[DL] call felica_read_without_encryption02 with [nil, 2319, 0, 0, [nil, nil, ni l, nil]]" (eval):5: [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. === ここまで ===================================================== felicalib.dllがいけないでしょうか? 組み方がいけないのでしょうか? 何方か、ご教授お願いします。 以上 ----- Original Message ----- >Date: Fri, 10 Dec 2010 12:34:02 +0900 >From: 染谷 康一 >Subject: [ruby-list:47683] Re: プログラム実行時に「[BUG] Segmentation > fault」 >To: ruby-list@ruby-lang.org (ruby mailing list) > > >染谷です。 > >なかむら(う)さん、ありがとうございます。 > >Win32APIでポインタが使えなかったんですね。 > >DLで組んでみます。 > >ご教授、ありがとうございました。 >