2011-01-31 12 views
1

C++/javaでは多くの投稿を見ましたが、Cでは何も見つかりませんでした。実行時にタイプXの配列に動的にメモリを割り当てることは可能ですか?例えば、擬似に、私のプログラムで動的にCのTYPEの配列を作成します

switch(data_type) 
    case1:float, create a new array of floats to use in the rest of the program 
    case2:int, create new array of ints to use in the rest of the program 
    case3:unsigned, .... 
    // etc. 

Iは、実行時にテキストヘッダファイルからのデータのタイプを決定し、その後のI /操作データを格納するための適切な配列を作成する必要があります。 Cに何らかのジェネリックタイプがありますか?

EDIT:どのアレイを作成するかを動的に作成して決定する必要があります。

おかげで、あなたは合計サイズを計算すると仮定すると、 csand

+0

質問のフォーマットについてお詫び申し上げます。何かが間違っていた。 – csand

+0

mallocをキャストする必要はなく、暗黙的な変換も 'void *'からの/への変換ではありません。 – user562374

答えて

5

は、配列から必要なバイト、で、あなただけのその多くのメモリを割り当てることができ、正しいポインタ型に割り当てます。

例:

int *array1 = (int *)data_ptr; 

または

float *array2 = (float *)data_ptr; 

注:

void * data_ptr = malloc(data_sz); 

、あなたはあなたが好きなタイプのポインタに割り当てることができますmalloc関数は、ヒープ上にメモリを割り当て、自動的に解放されることはありません。ある時点で割り当てたメモリを解放してください。

UPDATE

enum { 
    DATA_TYPE_INT, 
    DATA_TYPE_FLOAT, 
    ... 
}; 

typedef struct { 
    int data_type; 
    union { 
     float * float_ptr; 
     int * int_ptr; 
     ... 
    } data_ptr; 
} data; 

これはあなたがポインタを格納し、使用しなければならないポインタの種類を伝えることが可能かもしれませんが、それはまだデータに応じた動作を分岐する必要がないという問題を残しタイプ。コンパイラが代入などのためにデータ型を知っていなければならないため、難しいでしょう。

+0

Void *、完全に忘れてしまった。私はこれが私の問題を解決すると思います。答えたすべての人に乾杯。 – csand

+0

残念ながら、これは私を助けませんでした。私の問題は依然として変数の決定/スコープにあります。void *を使用して新しい配列をキャストできたことは事実です。しかし、私のプログラムはどのような配列を使うのか分かりますか? "int * array1"または "float * array2"を宣言したら、その配列を使用するプログラムが必要です。スイッチ内でarray1とarray2を宣言するか、ブロックがスコープ内にカプセル化されているかどうかを宣言します。私が必要としているのは、一般的な配列空間の宣言 - >データ型の決定 - 適切なデータ型の配列の使用。 – csand

+0

私は、文字列ごとに異なる配列型を持っている点を除き、全く同じコードの8つの異なるブロックを文字通りに持つことを避けようとしています。 – csand

0

Cは静的に型付けされており、実行時の型情報がないので、Cでこれを行うのは苦労します。 Cコードのすべての行は、どの型を扱っているのかを正確に知る必要があります。

しかし、Cには、静的型だけが異なる新しい関数を(特に)定義することができる、気の利いた、酷使されたマクロプリプロセッサが付属しています。たとえば:

#define FOO_FUNCTION(t) t foo_function_##t(t a, t b) { return a + b; } 

FOO_FUNCTION(int) 
FOO_FUNCTION(float) 

これは、あなたの名前と型署名以外の同一の2つの機能、foo_function_intとfoo_function_floatを取得します。 Cプリプロセッサに慣れていないなら、それにはいろいろな面白さがあるので注意してください。プログラムの塊をマクロとして書き直す前にそれを読んでください。

あなたのプログラムがどのように見えるかわからないと、私はこのアプローチがあなたにとってどれほど実現可能かはわかりませんが、しばしばマクロプリプロセッサはジェネリックプログラミングをサポートする言語を使っているように見せかけることができます。

関連する問題