9

ABAPフィールドシンボルとデータ参照をCのポインタと比較すると、次のことがわかります:-

Cで、デフォルト値が「5」の変数「var」タイプ「integer」を宣言するとします。

変数「var」はメモリ内のどこかに格納され、この変数を保持するメモリアドレスは「1000」であると言います。

ここで、ポインター「ptr」を定義し、このポインターを変数に割り当てます。

したがって、「ptr」は「1000」になり、「*ptr」は5になります。

上記の状況をABAPで比較してみましょう。

ここでは、フィールドシンボル「FS」を宣言し、それを変数「var」に割り当てます。

さて、私の質問は「FS」が何を保持するのかということです。私はこれをインターネットで厳密に検索しましたが、多くのABAPコンサルタントが、FSが変数のアドレス(つまり1000)を保持しているという意見を持っていることがわかりました。しかし、それは間違っています。デバッグ中に、fsが保持するのは5つだけであることがわかりました。したがって、fs(ABAPの場合)は* ptr(Cの場合)と同等です。私の理解が間違っている場合は訂正してください。

次に、データ参照「dref」と別のフィールドシンボル「fsym」を宣言し、データ参照を作成した後、同じものをフィールドシンボルに割り当てます。これで、このフィールドシンボルに対して操作を実行できます。したがって、データ参照とフィールドシンボルの違いは次のとおりです:-

フィールドシンボルの場合、最初に変数を宣言し、それをフィールドシンボルに割り当てます。

データ参照の場合、最初にデータ参照を作成し、次にそれをフィールドシンボルに割り当てます。

では、データ参照の用途は何ですか?フィールドシンボルでも実現できるのと同じ機能。

4

4 に答える 4

18

フィールドシンボルはポインタによく似ていますが、逆参照形式でのみアクセスできるものです。つまり、内部的には、割り当てられた変数のメモリアドレスを保持しますが、メモリアドレスを表示することはできず、ポイントする変数に格納されているデータのみを表示できます。これは、内部テーブル行を指すフィールドシンボルの内容を変更すると、その行で直接変更が行われることがわかるため、証明できます。

データ参照は、C(ptr ++、ptr--など)のようにメモリアドレスをインクリメントまたはデクリメントできないことを除いて、単純なポインタのように機能します。2つのデータ参照を比較して、それらがメモリ内のまったく同じ場所を指しているかどうかを確認できるため、フィールドシンボルとは異なります。2つのフィールドシンボルを比較すると、単純な値の比較になります。もう1つの違いは、CREATE DATAコマンドを使用してデータ参照を作成することにより、メモリを動的に割り当てることができることです。フィールドシンボルは、すでに割り当てられている変数にのみ割り当てることができます。

于 2012-09-13T12:34:57.427 に答える
4

データ参照とフィールドシンボルは非常によく似ており、よく似た方法で使用されますが(他の回答を参照)、根本的に異なります。

データ参照は、文字列や整数のように、値を格納する変数です。それらはメモリとコンテンツの固定サイズを持っています。唯一の違いは、これらの参照が他のデータオブジェクトへのポインタであるということです。つまり、コンテンツには特別な意味があります。それらはどこも指すことができず、逆参照することができ、他のルーチンに渡すことができ、ポインター(GET REFERENCE)またはそれが指す値のいずれかを操作することができます。特別なことは何もありません。実際には、お気に入りのプログラミング言語から知っているポインタだけです。

フィールドシンボルは「実際の」変数ではありません。ドキュメントには次のように記載されています

フィールド用のスペースを物理的に予約しません

フィールドシンボルは、実際にはABAPVMのローカルシンボルテーブルの巧妙な操作にすぎません。これを説明しようと思います-これは非常に単純化されたモデルであることに注意してください。3つの変数を宣言するとします。

DATA: my_char TYPE c,
      my_int  TYPE i,
      my_ref  TYPE REF TO i.

次に、シンボルテーブルには、特に次のようなエントリが含まれます。

name       type  size addr
------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461

(参照変数の実際のサイズについてはわかりません。)

これらのエントリは、値を含むアドレスのみを指します。これらの変数の範囲によっては、まったく異なるメモリ領域に存在する可能性がありますが、現時点ではそれは問題ではありません。重要なポイントは次のとおりです。

  • 変数用にメモリを予約する必要があります(これは、参照用であっても自動的に行われます)。
  • 参照は、他のすべての変数と同じように機能します。

これにフィールドシンボルを追加しましょう:

FIELD-SYMBOLS: <my_fs> TYPE any.

その場合、シンボルは次のようになります。

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *        

フィールドシンボルは、初期状態(未割り当て)で作成されます。どこも指していません。この状態で使用すると、短いダンプが発生します。重要な点は、他の変数のように「ヒープ」メモリに支えられていないということです。しましょう

ASSIGN my_char TO <my_fs>.

この場合も、シンボルは次のようになります。

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *                   MY_CHAR

これで、にアクセスする<my_fs>と、ランタイムシステムはそれをフィールドシンボルとして認識し、シンボルテーブルで現在のターゲットを検索し、すべての操作をの実際の場所にリダイレクトしますmy_char。一方、コマンドを発行する場合

GET REFERENCE OF my_int INTO my_ref.

シンボルテーブルは変更されませんが、「ヒープアドレス」0x123461に「アドレス」0x123457があります。my_char = 'X'またはのような値の割り当てmy_int = 42 * 2

これは、非常に単純化されたバージョンでは、変更パラメーターとしてフィールドシンボルを渡し、サブルーチン内でそれらを再割り当てできるようにすることができない理由です。それらは他の変数と同じようには存在せず、それらが追加されたシンボルテーブルの範囲外では意味がありません。

于 2012-09-13T16:28:25.793 に答える
1

ABAPでずっと長く使用されているフィールドシンボルを使用すると、フィールドの名前を事前に知らなくても、実行時にフィールドの値を操作および渡すことができます。このユースケースを考えてみましょう。20個のフィールドを持つ構造があり、各フィールドを名前で参照してフィールドシンボルに割り当て、特定のフィールドの値などを変更できます。

TYPE REF TO DATAABAPに比較的新しく追加されたデータ参照( )を使用すると、「CREATE DATA」ステートメントを使用して、タイプを事前に知らなくても、実行時にデータをインスタンス化できます。

の使用例についてはCREATE DATA、次のSAPヘルプページを参照してください。たとえば、を使用して参照オブジェクトへの参照(つまり、ABAPオブジェクト参照)を取得する方法を示しますCREATE DATA。これは、フィールドシンボルでは実行できませんでした:http://help.sap.com/abapdocu_70/en/ABAPCREATE_DATA_REFERENCE .htm

于 2012-09-13T10:01:39.693 に答える
0

フィールドシンボルは、フィールドのシンボルです。それを変数に割り当てると、その変数のエイリアスになります。

参照とフィールドシンボルの主な違いは、参照がCREATEDATAまたはCREATEOBJECTによって作成された匿名データを指すことができることです。フィールドシンボルは、常に既存の変数に割り当てる必要があります。

于 2012-09-13T10:03:47.763 に答える