[#47715] Windowsで1.9.2p136+zlibのインストール — AOKI Yoshihiro <aoki@...>

あおきと申します。

14 messages 2010/12/27
[#47716] Re: Windowsで1.9.2p136+zlibのインストール — "U.Nakamura" <usa@...> 2010/12/27

こんにちは、なかむら(う)です。

[ruby-list:47691] Re: プログラム実行時に「[BUG] Segmentation fault」

From: 染谷 康一 <kouichi_someya@...>
Date: 2010-12-12 07:39:39 UTC
List: ruby-list #47691
再び、染谷です。

今度は、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=#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0> args=[\"\"
]"

"[DL] call pasori_init with [#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free
=0
x0>]"
"[DL] retval=0 args=[#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0>]"
"[DL] call felica_polling with [#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 f
re
e=0x0>, 3, 0, 0]"
"[DL] retval=nil args=[#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0>,
 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: 染谷 康一 <kouichi_someya@mbe.nifty.com>
>Subject: [ruby-list:47683] Re: プログラム実行時に「[BUG] Segmentation  
>	fault」
>To: ruby-list@ruby-lang.org (ruby mailing list)
>
>
>染谷です。
>
>なかむら(う)さん、ありがとうございます。
>
>Win32APIでポインタが使えなかったんですね。
>
>DLで組んでみます。
>
>ご教授、ありがとうございました。
>


In This Thread