2

私は単純な Lisp スタイルのプリプロセッサ言語に取り組んでいます。API では、ユーザーが任意の次元とサイズの配列を、言語を使用して操作できるプリプロセッサに渡すことができるようにしたいと考えています。現在、私はタイプの列挙型を持っています。

typedef enum LISP_TYPE
{
  LT_UINT,
  LT_FLOAT,
  LT_ARRAY
  ...,
  ...
} _LISP_TYPE;

配列を格納し、それらにアクセスするための効率的で使いやすい方法を見つけるのに苦労しています。特に配列に使用する別の構造があります。

typedef struct _lisp_array
{
  LISP_TYPE type;
  unsigned int length;
  void* data;

} lisp_array;

プリプロセッサが LT_ARRAY 型のリスト アトムを参照すると、そのvoid*(Lisp 用語では cdr) を上記の構造に変換します。私が問題を抱えているのは、多次元配列にアクセスする方法を考え出すことです。配列をトラバースするステップ値を計算することを考えましたが、渡されたすべての配列が連続して割り当てられることを保証できますか?

どんな助けでも大歓迎です。

4

3 に答える 3

0

それは、あなたがそれをどれだけLisp風にしたいかによるでしょう。Lisp には、あなたが考えている多次元配列の厳密な定義はありません。すべてがアトムかリストのどちらかです。最も近いものは、配列の配列です。

((1 2 3) (4) (5 6))

ただし、サブ配列は同じ長さではないことに注意してください。しかし、それらがそうである必要がないのは本質的におかしなことであり、問​​題を強制する方法はないと思います...

厳密に「長方形」の配列が必要な場合、これは明らかに機能しませんが、小刻みな余裕がある場合は、これを実装する方法です。これは、きれいできれいな構造です (詳細については、ウィキペディアのページを参照してください)。 )。

乾杯!

于 2011-01-26T02:46:23.913 に答える
0

あなたはインタプリタを書いているので、表現を決定し、配列を連続させるかどうかはあなた次第です。つまり、連続させる必要があるかどうかです。連続させると、たとえば次のようにして要素にアクセスできます(ゼロベースのインデックス a、b、c ... および次元サイズ sa、sb、sc ... を想定)。

(a*sb + b) * sc + c   ... (row major order)
(c * sb + b) * sa + a ... (column major order)

もちろん、配列を表す方法は他にもあります。配列へのポインターの配列などを使用することもできます。それぞれに長所と短所があります。ユースケースの詳細がなくても、配列の境界が固定されていて、配列がスパースであると予想されない場合は、通常、連続したバッファーが合理的なアプローチです。

于 2011-01-24T17:32:56.070 に答える
0

C 組み込み (一次元および多次元) 配列は、行優先モードでメモリの 1 つの連続した領域に格納されることが保証されています。ただし、これはあなたの質問に答えないかもしれません。_lisp_array::dataメンバーが指すデータ構造の予想されるレイアウトは何ですか?

于 2011-01-24T17:25:32.997 に答える