2011-01-24 22 views
2

私はシンプルなlispスタイルのプリプロセッサ言語を研究しています。 APIでは、言語を使用して操作できるプリプロセッサに任意の寸法とサイズの配列を渡すことができるようにしたいと考えています。 現在、私は型の列挙型を持っています。多次元配列をC言語で格納する

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; 

プリプロセッサ参照

は、上記の構造にその void*(Lispの用語でCDR)に変換され、タイプLT_ARRAY付きリスト原子です。私が問題を抱えているところでは、多次元配列にアクセスする方法を考え出すことです。私は、配列を横断するためにステップ値を計算することを考えましたが、渡されたすべての配列が連続的に割り当てられることを保証できますか?

何か助けていただければ幸いです。

+0

単純にC++テンプレートを使用できませんか? – ch0kee

答えて

0

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

+0

期待されるレイアウトは_lisp_array :: typeによって異なります。これがFLOAT、CHAR、INTまたは他の型の場合、データはこれらの型の配列になります。タイプがARRAYの場合は、複数の次元を示す必要があります。これは私が立ち往生しているところです、どうすればいいですか? btw私は動的に割り当てられた配列だけでなく、静的な連続した配列を期待しています。 – jmgunn87

+0

配列タイプ(表示していない)の場合、予想されるレイアウトは何ですか? –

+0

私が言ったように、私はそれを遠くに持っていません。私は別のlisp_arrayポインタを考えていた。 – jmgunn87

0

あなたはインタプリタを書いているので、表現を決めることと、配列を連続させることです。つまり、連続している必要がある場合です。あり

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

:あなたはそれが連続し、あなたが例えば、によって要素にアクセスすることができます行った場合(ゼロベースのインデックス、B、C ...と寸法サイズのSA、SB、SCを...と仮定した場合)もちろん配列を表現する他の方法もあります。配列へのポインタ配列などを使うことができます。それぞれには長所と短所があります。ユースケースについての具体的な説明がなく、配列の境界が固定されていて、配列が疎であるとは予想されない場合、通常、連続したバッファが合理的なアプローチです。

0

これは本当にそれを作りたいと思った方法に依存します。 Lispはあなたが考えている多次元配列の厳密な定義を持っていません - すべては原子かリストです。最も近いのは配列の配列です:

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

ただし、サブ配列の長さは同じではありません。しかし、それは本質的に、彼らがする必要はありませんが、私は問題を強制する方法はないと思います...

厳密に "長方形の"配列が必要な場合は、明らかに動作しませんあなたがウィグルルームを持っているなら、これは私がそれを実装する方法です - それは素敵で清潔な構造です(詳細はWikipedia pageを参照してください)。

乾杯!

関連する問題