2017-07-03 7 views
1

配列を意味するpointerを作成します。配列のサイズと型(int、double、stringなど)は、関数と値によっても決まります。私はvoid**で試しましたが、私はsegment errorを得ました。関数内に可変型とサイズ配列を割り当てる(C++)

char f(void** return_list){ 

    /*...*/ 

    /*If need integer array*/ 
    int int_input=1;   // for example 
    int argument_number=2;  // for example 

    return_variable=new void*[argument_number]; 
    for(int j=0;j<=argument_number;j++){ 
     return_variable[j]=new void*; 
     *(int*)return_variable[j]=int_input; 
    } 

    /*If need boolean array*/ 
    /*...*/ 

return 0; 
} 

int main(int ARGC,char* ARGS[]){ 

char c=0; void** ret_list; 
c=f(ret_list); 
if(!c){std::cout<<*(int*)ret_list[0]<<"\n";} 

return 0;} 

注: 私は、配列/ポインタで機能f()を返すことができません。私はchar/integerで返す必要があります。

+5

をあなたのコードは私が滞在の不幸を持っていたホテルのいくつかのより多くの星を持っているテンプレートを使用します。 – Ron

+0

'argument number' - >宣言されていない識別子 – 21koizyd

+0

@ 21koizyd:' int argument_number'を追加しました。ありがとうございました。 –

答えて

0

あなたは私はあなたが

void* return_variable = ::operator new[](argument_number); 

または単純な使用のテンプレートを使用するか、より専門テンプレートを指定schouldと思うようなものを作りたい場合。

2

実行時に決定されたサイズの配列を作成し、特定の値(C++を使用しているため)に初期化する関数が必要な場合は、テンプレートを使用することをお勧めします。

次のようなものが動作するはずです:

template<typename TYPE> 
TYPE* f(const TYPE input, const size_t SIZE) { 
    TYPE* ret = new TYPE[SIZE]; 
    std::fill(ret,ret+SIZE,input); 
    return ret; 
} 

あなたは、次のメインのようにそれを使用することができます。

int main() 
{ 
    int size = 10; 
    int initval = 2; 

    int* p = f<int>(initval, 10); 
    for (size_t i = 0; i < size; i++) 
     cout << p[i] << " "; 
    cout << endl; 

    initval *= 2; 
    size *= 2; 
    double* q = f<double>(initval, size); 
    for (size_t i = 0; i < size; i++) 
     cout << q[i] + 0.5f << " "; 

    delete[] p; 
    delete[] q; 
} 

サイズ10とサイズの配列のintの配列を作成します20タイプdoubleで、標準出力に出力します。

2 2 2 2 2 2 2 2 2 2 
4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 

プラスあなたはC++を使用しているので、また、生のポインタを使用して検討してください。代わりにunique_ptrまたはshared_ptrを使用してください。

+0

おそらくpまたはdをパラメータとして渡すことができます。これは、質問ごとにどのように行われたかを示すためにcharまたはintをretunrできますが、C++では+1です。 – doctorlove

2

ここには2種類の機能があります。 1つは、のポインタのポインタを配列に割り当てて、あなたの興味のあるデータ型へのポインタを割り当てます。私はあなたがそれをこのように意図したと思う。あなたはそこに3つ星のホテルが必要です:-)。これは一種の「C」スタイルです。後でこのすべてを削除することには特に注意が必要です。

第二は、C++スタイルでテンプレートを使用し、ちょうどあなたが興味を持っているタイプの配列割り当てます。

#include <iostream> 
using namespace std; 

void allocateArrayC(void ***array, int size) { 
    *array = new void *[size]; 
    for (int i = 0; i < size; i++) 
    (*array)[i] = new int(i); 
} 

template<class T> 
void allocateArrayCPP(T **array, int size) { 
    *array = new T[size]; 
    for (int i = 0; i < size; i++) 
    (*array)[i] = i; 
} 

int main() { 
    void **arrayC; 
    allocateArrayC(&arrayC, 10); 
    for (int i = 0; i < 10; i++) 
    cout << *(int*)arrayC[i] << endl; 

    int *arrayCpp; 
    allocateArrayCPP(&arrayCpp, 10); 
    for (int i = 0; i < 10; i++) 
    cout << arrayCpp[i] << endl; 

} 
+0

ところで、 '(void **&array)'や '(T *&array)'のように、 'array [i] = ...'を使うことができます。と 'allocateArray(配列、...)' – Serge

関連する問題