2016-06-14 13 views
-1

私は、以下の関連するコードを含めています、と私はそれがここまでやっている知っていることを説明することができます:別のファイル(TCL)からこの行を取得していますか?

proc rshm {where {i 0}} { 
    global ob 
    set what "???" 
    set ob(last_rshm_failed) "yes" 
    if {![info exists ob(shm)]} { 
     return "0.0" 
    } 
    if {[info exists ob(shm_puts_exist_in_progress)]} { 
     return "0.0" 
    } 
    shm_puts "g $where $i" 
    gets $ob(shm) istr 
    set what [lindex $istr 0] 
    set ob(last_rshm_failed) "no" 
    if {[string equal $what "?"]} { 
     set ob(last_rshm_failed) "yes" 
     puts stderr $istr 
     return "0.0" 
    } 
    set what [lindex $istr 3] 
    return $what 
} 

プログラムの残りの部分を見てから、私は、最初の2つのif文と結論しています他の場所でエラーをチェックしており、エラーがトリガーされた場合にプロシージャを終了するように設計されています。

プログラムのどこかで、関数が呼び出されることを(興味のある)場所は形式である:rshm ft_xdev

print文を使用して、私はft_xdevがshm_puts「グラムのft_xdev 0」としてプロシージャに渡すことがわかりました。

私を投げている行が行です:

ISTR $ OB(SHM)を取得します$ OB(SHM)への呼び出しが別のファイル(元々はバイナリプログラムが、読みやすいバージョンがCになっています...)、しかしこのファイルを見ると、 "istr"と呼ばれるものへの参照はありません。

誰かが、この行が他のファイルから何を得ているかに私を助けてくれるでしょうか?必要に応じて、プログラムからより多くのコードを提供することができます。

+2

迷惑メールにしないでください!質問にはC関連のものはありません。 – Olaf

答えて

0

コード:

gets $ob(shm) istr 

が(少なくともオープンリーディングのためのものであるチャンネルハンドルでなければならない)ob(shm)変数の内容と変数に名前を付けるために使用される文字列istrを(通過しますこの場合)をgetsコマンドに入力します。 istrは、そうでないと明示されていないため、この場合はローカル変数になります。

getsコマンドは、2つの引数が指定されたときにチャネルからテキストの行を読み込み(最初のarg)、その行を変数に書き出します(2番目のarg)。その結果、ファイルの終わりのような回復可能なエラー条件があった場合は、または-1の文字数が結果として得られます。あなたは結果を無視している。 (重大なエラーは例外になります。)これはすべてthe manual page for getsに記載されています。

TL; DR:$ob(shm)チャネルとistrに格納するからテキストの行を読み込み。

+0

Cの 'gets()'呼び出しとは異なり、Tclの 'gets'コマンドは、バッファオーバーランの影響を受けないようにメモリ管理を行う方法を知っています。ノンブロッキングIOが有効になっている場合、この領域の問題をタックするためのオプションが増えています。しかし、そのためのコードのパターンは少し異なります。私はあなたが非ブロックIOを使用していないと確信しています... –

+0

助けてくれてありがとう!以前のプログラムでは、 'ob(shm)'はshm( "共有メモリ"の略)という名前のファイルを読み込み用に開くこととして定義されていました。しかし、ファイルには(数行以上の)コードがたくさんあるので、istrにプロシージャが格納しているものが混乱していると思います。それとも、スクリプト全体を変数に保存しているのでしょうか?どの時点で、次の行がインデックスを作成しているリストは何ですか? – rkepp12

+0

@ rkepp12の場合、プログラムがob(shm)から読み込んでいるすべての場所を把握する必要があります。私は 'shm_puts'が何をするのか不思議です。 –

0

この手順では、空でない場合$istr[lindex $istr 3])の第三のインデックスを返しますか、事前チェックに失敗しません。 $istr

内容がオープンされたファイルチャネル$ob(shm)の次の行をつかんから得られる(チャネルがすでに開いていると$ob(shm_puts_exist_in_progress)が存在しない場合)。どのような方法で

shm_puts "g $where $i"た場合の影響の$ OBを、それが$istrに影響を与える可能性があるので、手順shm_putsを含めることが重要であろうが、私はshm_putsの内容が$istrに関連していない疑いがあります。

最後に$istrが? $istrの内容をstderrに表示するこの手順を中止します。つまり、ファイルの行が?で始まっていれば?、手順は打ち切られる。

すべてのプロシージャアボート(つまりIFチェック)は$istrの内容を保持しません。ローカル変数ではないため、$ istrの内容をチェックする必要があります。

関連する問題