0

Tcl/tk の初心者で、手順で配列にアクセスする際に問題に直面しています

以下は私の問題文です

proc myproc {args} {
  set aaa ""
  set bbb ""
  set ccc ""

  foreach "field value" $args { 
    set $field $value
  }

  # assigning input args values to an array a   
  set a(3:0) $aaa
  set a(6:4) $bbb
  set a(25:7) $ccc

  #do some computation on input arguments may be addition
  #
  #
  #

  # now the result am trying to fetch into another array b

  set  $b(word0) $x
  set  $b(word1) $y
  set  $b(word2) $z
  set  $b(word3) $u

  return [array get b]
}

ここで、引数を myproc に渡し、アクセスする必要がある配列を返す必要があります。

set args_1 "g 1 h 4 k 6"

以下の構文を試してみましたが、エラーが発生しました。

array set a [myproc[array get $args_1]]

誰かがこの問題を解決するのを手伝ってくれますか

プロシージャ myproc の入力として文字列を指定しようとしています

後でその入力値を使用して計算を試みます。

後ですべての計算が文字列値のセットを取得した後、以下のように配列に割り当てられます

set  $b(word0) $x
set  $b(word1) $y
set  $b(word2) $z
set  $b(word3) $u

bこの配列をリターンとして送信したい。

例:

proc myproc {} {  
    set  $b(word0) $x
    set  $b(word1) $y
    set  $b(word2) $z
    set  $b(word3) $u

    return [array get b]
}

以下のように配列 b にアクセスしようとしました

array set a [myproc[array get b]]

それは機能しました:)関数の呼び出しで新しい配列を作成できました。

ただし、文字列引数を myproc に渡し、配列として返す必要があります

4

1 に答える 1

1

その機能は私には問題ないようです。もっと良い書き方があるかもしれませんが、基本的にはそのままでOKです。

ただし、その関数を呼び出す方法にはいくつかの問題があります。

まず、配列とリストを混同しています。Tcl では、配列はキーと値のペアのコレクションです。他の言語では、これを「ハッシュ」または「マップ」と呼びます。リストとは、名前のとおり、値のリストです。他の言語では、これを「配列」または「リスト」と呼びます。

だから、最初に:

tcl     other languages
---     ---------------
array = hash
list  = array

「配列」という名前が選ばれたのは、キーと値のペアのコレクションの概念がコンピューター サイエンスで「連想配列」として知られているためです。これは、C や Java などの言語で値のリストを意味する「配列」という言葉が使用される前の用語です。

したがって、ここでリストを宣言しています。

set args_1 "g 1 h 4 k 6"

そして、配列としてアクセスしようとしています:

array get $args_1

$args_1これは配列ではないというエラーをスローするはずです。これは実際に真実です。

したがって、単純にリスト変数に置き換えます。

$args_1

これにより、次のことがわかります。

array set a [myproc$args_1]

これにより、基本的に関数myproc g 1 h 4 k 6が存在しないことを示す別のエラーがスローされるはずです。はい、tcl では、関数名に空白を含めることは有効です。例えば:

proc "an example" {} {return "an example"}

それは有効なコードです。そして、あなたはそれを次のように呼びます:

set x ["an example"]

したがって、tcl が "myproc g 1 h 4 k 6" という関数を見つけられないのは当然のことです。

これが意味することは、tcl では空白が重要であるということです。あなたはできません:

set x [y[z]]

これはおそらく構文エラーです。そのはず:

set x [y [z]]
#       ^
#       |______ whitespace was missing

したがって、コードは次のようになります。

array set a [myproc $args_1]
于 2013-07-19T07:48:39.727 に答える