NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

Phi::PRINTER.printers

投稿者:take_tkさん  2006/01/10 18:22  MLNo.2035   [メール表示]

たけ(tk)です

下記のスクリプトを apollo.exe で実行すると、「:ok」が表示された後で、変
なエラーメッセージが出ます。

ruby.exe や ruby_ap.exe では出ない。
841a の問題ではなく、前から。
p Phi::PRINTER.printers.to_a なら出ない。

再現しますか?

----
require "phi"
p Phi::PRINTER
p Phi::PRINTER.printers
p :ok
----

#<Phi::Printer:0xecf2d0>
#<Phi::Strings: "EPSON PM-A700", "Acrobat Distiller", "\\edicube-02\lp8300", "\\edicube-02\lp7900">
:ok
method `inspect' called on terminated object (0xb65ec8) (NotImplementedError)
G:\apollo\1.rb:4:in `to_s'

Phi = C:/Program Files/Apollo/bin/phi.so .. ( version 0.841a_vcl60 )
Ruby = ruby_so_path?? .. ( version 1.8.4 )

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武


 読み込み中...

  • MLNo.2036   moriqさん  (0) 2006/01/10 18:38  [メール表示する]
    もりきゅうです。

    take_tk wrote:
    > 再現しますか?
    します。
    GC周りですかね。

  • MLNo.2038   take_tkさん  (0) 2006/01/27 18:15  [メール表示する]
    たけ(tk)です

    [ap-dev:2036] Re: Phi::PRINTER.printers にて
    Kazuhiro Yoshida さん曰く:

    > GC周りですかね。

    なんとなく、原因判明。

    (1)$DEBUG=trueで実行すると、printers[i].inspect で例外が出ているのに、
    それが表示されていないことが分かる。

    ----
    require "phi"
    $DEBUG = true
    p Phi::PRINTER
    p Phi::PRINTER.printers
    p :ok
    ----
    #
    Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb6098c)
    Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb66e8c)
    Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb620bc)
    Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb67e64)
    #
    :ok
    Exception `NotImplementedError' at G:\apollo\1.rb:0 - method `inspect' called on terminated object (0xb67e64)
    method `inspect' called on terminated object (0xb67e64) (NotImplementedError)
    G:\apollo\1.rb:5:in `to_s'
    ----

    (2)どこで例外が出ているかというと uStrings.pas の Strings_to_s の
    ap_protect(ap_inspect, obj, state) で出ている。

    C:/Program Files/Apollo/src/u/uStrings.pas
    function Strings_to_s(This: Tvalue): Tvalue; cdecl;
    var
    real: TStrings;
    S: string;
    obj, str: Tvalue;
    i: Integer;
    state: Integer;
    begin
    real := ap_data_get_struct(This);
    S := '#<' + dl_class_name_of(This) + ': ';
    for i := 0 to real.Count-1 do
    begin
    if i > 0 then S := S + ', ';
    S := S + AnsiQuotedStr(real[i], '"');
    if real.Objects[i] <> nil then
    begin
    obj := Tvalue(real.Objects[i]);
    if obj = This then
    S := S + '=>' + '(self)'
    else begin
    str := ap_protect(ap_inspect, obj, state); ←ここ
    if state = 0 then S := S + '=>' + ap_str_ptr(str);
    end;
    end;
    end;
    S := S + '>';
    result := ap_String(S);
    end;

    (3)何故、NotImplementedError かというと、printers.objects[]にはDelphi
    の TPrinterDevice オブジェクトが入っているから。そこから Tvalue を取り出
    そうとしてもエラーになる。

    C:/Program Files/Borland/Delphi6/Source/Vcl/Printers.pas

    with TPrinterDevice(Printers.Objects[PrinterIndex]) do

    ということのようです。

    Take_tk = KUMAGAI Hidetake
    たけ(tk)=熊谷秀武


  • MLNo.2039   take_tkさん  (0) 2006/02/03 16:08  [メール表示する]
    たけ(tk)です

    対策としては次のようなモノか? でも、ちょっと、大がかりすぎ?

    (1)objects_usedインスタンス変数を追加する。RO。

    (2)objects_useable?メソッドを追加する。
     (2−1)objects_used=trueならtrue、(前に調べて、既に使われている)
    (2−2)objectsがすべてnilならtrue、
    (2−3)それ以外であればfalseを返す。

    (3)objectsにセットする場合には、
     (3−1)objects_useableを調べ、falseなら例外を生成する。
    (3−2)objectsにセットした場合には、objects_used変数にtrueをセットする。

    (4)objectsを参照しようとする場合に、objects_useableを調べて、trueならnil
    を返す。

    Take_tk = KUMAGAI Hidetake
    たけ(tk)=熊谷秀武


  • MLNo.2040   take_tkさん  (0) 2006/02/04 11:19  [メール表示する]
    たけ(tk)です。
    [ap-dev:2039] Re: Phi::PRINTER.printers にて
    take_tk さん 曰く:
    > 対策としては次のようなモノか? でも、ちょっと、大がかりすぎ?

    もうちょっと簡単になるか?

    (1)@…_useableインスタンス変数を追加する。nil:未検査、true:利
    用可能、false:利用付加。Rubyからの直接参照不可。

    (2)objects_useable?メソッドを追加する。
     (2−1)@…_useable<>nilならその値を返す。
    (2−2)objectsがすべてnilならtrue、
    (2−3)それ以外であればfalseを@…_useableにセットしたうえ、
    それを返す。つまり、初回の一度しか調べない。

    (3)objectsにセットする場合には、objects_useable?を調べ、falseなら例外
    を生成する。

    (4)objectsを参照しようとする場合に、objects_useable?を調べて、trueな
    らnilを返す。

    * 問題点:objects_useable?で調べた後にDelphiが利用したことは点検できな
    い。(前のバージョンではRubyでobjectsを使用した後にDelphiが利用したこと
    を点検できない)。

    take_tk = kumagai hidetake

  • MLNo.2041   take_tkさん  (0) 2006/02/05 21:33  [メール表示する]
    たけ(tk)です。

    コミットしちゃいました。

    http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/apollo/apollo/src/u/uStrings.pas?sortby=date&r2=1.3&r1=1.2

    require "phi"
    p Phi::PRINTER
    p Phi::PRINTER.printers
    p Phi::PRINTER.printers.objects_useable? #=> false
    p :ok


    [ap-dev:2040] Re: Phi::PRINTER.printers にて
    take_tk さん 曰く:
    > もうちょっと簡単になるか?
    >
    > (1)@…_useableインスタンス変数を追加する。nil:未検査、true:利
    > 用可能、false:利用付加。Rubyからの直接参照不可。
    >
    > (2)objects_useable?メソッドを追加する。
    >  (2−1)@…_useable<>nilならその値を返す。
    > (2−2)objectsがすべてnilならtrue、
    > (2−3)それ以外であればfalseを@…_useableにセットしたうえ、
    > それを返す。つまり、初回の一度しか調べない。
    >
    > (3)objectsにセットする場合には、objects_useable?を調べ、falseなら例外
    > を生成する。
    >
    > (4)objectsを参照しようとする場合に、objects_useable?を調べて、trueな
    > らnilを返す。

    take_tk = kumagai hidetake

  • MLNo.2042   moriqさん  (0) 2006/02/08 16:18  [メール表示する]
    もりきゅうです。

    take_tk wrote:
    > たけ(tk)です。
    >
    > コミットしちゃいました。

    ありがとうございます。とりあえずこれでいいんじゃないでしょうか。
    # useableをusableと書いてしまいそうですが^^;
    全然追えていなかったのですが、難しい問題ですね。


メールへの返信はMLのメンバーしかできません。
【PR】こだわりのブログ掲示板で楽しく話そう無料のブログかんたんブログみんなのブログ

更新順メールリスト

これが憧れの4LDK超/SUUMO