3

この 2D 配列が同じファイル内の他の関数で使用できるように、new 演算子を使用せずに可変サイズの 2D 配列を関数に割り当てたいと考えています。

    void draw(int i)
    {   size=i;   }

    void assign(char symbol)
    {
        char one[size][size];
        /// ... Assigning values to one  ...
    }
    void display()
    {   /// Displaying values of one[size][size]
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            cout<<one[i][j];
            cout<<endl;
        }
    }

関数の実行順序は描画→代入→表示

この質問は以前に尋ねられた可能性があります。しかし、私の問題は..->サイズの値がわからないため、割り当て関数の外側で配列をグローバルに宣言できません。→「display」関数では「one」配列は対象範囲が「assign」関数に限られているため使えません。

また、new または malloc 演算子も使用したくありません。代替品があれば助かります。

4

6 に答える 6

4

C++ は、C99 などのスタック割り当て可変長配列をサポートしていません。std::vector<T>代わりに使用する必要があります。本当にスタック割り当てを使用したい場合は、使用できますalloca()

于 2012-10-22T19:34:02.463 に答える
2

これを行う方法はありません。配列「one」は、割り当て関数のスタック上の一時的なものです。割り当て関数を離れるたびに破棄されます。

したがって、何らかの方法でメモリを割り当てる必要があります。

一度に「1」の配列のコピーを 1 つしか使用しない場合は、快適な上限に十分な大きさのスペースを使用してグローバル スコープで宣言できます。また、使用するたびに、静的グローバル配列が十分に大きいことを確認してください。

あなたの懸念はパフォーマンスですか?または、メモリ割り当てができないプラットフォームを使用していますか?

その他のオプション: 配列をシステム外で静的に割り当て、それを引数として各関数に渡します。

または、単一の上位レベルの「所有者」関数からすべての関数を呼び出すことができる場合は、「alloca」を使用してスタック上で配列を動的に割り当てることができます。

例えば

system()
{
   char one = alloca( size );
   draw( one, ... );
   assign( one, ...);
   display( one, ... );
}
于 2012-10-22T19:38:52.480 に答える
0

私はC ++が完璧ではありません。実際、私はあなたのような初心者です。しかし、私はあなたがそれを使用してそれを行うことができると思います

"*pointer"

つまり、配列の参照を表示する必要があります。その後、関数の外で使用できます。

于 2012-10-22T19:36:04.693 に答える
0
const int MAX_SIZE = 1000;
char one[MAX_SIZE][MAX_SIZE];
int size = 0; // needs to be smaller than MAX_SIZE

void draw(int i) {
    if(i < MAX_SIZE) size=i; 
}

void assign(char symbol, i, j)
{
    char one[i][j] = symbol;
}

void display()
{
    for(int i=0; i<size; i++) {
        for(int j=0; i<size; j++) {
            cout<<one[i][j];
        }
        cout<<endl;
    }
}
于 2012-10-22T19:37:13.667 に答える
0

関数の外ではなく、ファイル内で配列を定義しようとしましたか?
例えば:

static unsigned int my_array[16][32];
void my_func()
{
    /*...*/
}

int another_func()
{
  /*...*/
}
于 2012-10-22T19:45:45.913 に答える