0

私は関数を渡しています:

fillArrays(arrays);

現在、arrays は 2 次元配列です。配列を次のように宣言しました。

int **arrays = new int*[NUM_OF_ARRAYS];
    arrays[0] = new int[128];
    arrays[1] = new int[512];
    arrays[2] = new int[2048];
    arrays[3] = new int[8192];
    arrays[4] = new int[32768];
    arrays[5] = new int[131072];
    arrays[6] = new int[524288];
    arrays[7] = new int[2097152];

次の関数に配列を正しく渡していますか?

void fillArrays(int **arrays) {
    const int NUM_OF_ARRAYS = 8;
    for(int i = 0;i < NUM_OF_ARRAYS;i++) {
        switch(i) {
        case 0:
            for(int j = 0;j < 128;j++)
                arrays[i][j] = 1 + rand() % 2000;
            break;
        case 1:
            for(int j = 0;j < 512;j++)
                arrays[i][j] = 1 + rand() % 5000;
            break;
        case 2:
            for(int j = 0;j < 2048;j++)
                arrays[i][j] = 1 + rand() % 10000;
            break;
        case 3:
            for(int j = 0;j< 8192;j++)
                arrays[i][j] = 1 + rand() % 30000;
            break;
        case 4:
            for(int j = 0;j < 32768;j++)
                arrays[i][j] = 1 + rand() % 100000;
            break;
        case 5:
            for(int j = 0;j < 131072;j++)
                arrays[i][j] = 1 + rand() % 200000;
            break;
        case 6:
            for(int j = 0;j < 524288;j++)
                arrays[i][j] = 1 + rand() % 1000000;
            break;
        case 7:
            for(int j = 0;j < 2097152;j++)
                arrays[i][j] = 1 + rand() % 30000000;
            break;
        }
    }
}

さらに情報が必要な場合はお知らせください。ありがとうございます。

4

4 に答える 4

3

私は別のアプローチを取り、包括的な答えを出そうとします。おそらく、より明確になるでしょう。関数は、で宣言されたパラメーターの正確な型に適合する任意の変数を取ります。C++ の基本的な配列は、単なる定数ポインターです (先頭を指し、残りのスペース サイズを保持します)。ポインターを使用したメモリ割り当てによる配列の配列の格納は、C++ で生成された 2D 配列とまったく同じではありません (datatype arrays[const][const]と で生成されるアセンブリ コード**arrays = new datatype[const]は異なります)。ポインターへのポインターと 2D C++ で生成された配列を区別できるため、これを知っておくことは重要です。

物事を単純にするために、パラメータをポインタへのポインタとして正確に扱います。それがあなたのケースである関数に渡すものである場合、正しい変数を正しいパラメーターに渡しています。関数内でそのパラメータを処理する方法によって、2D 配列として処理するかどうかが決まります

ポインターへのポインターが2D配列として扱われる理由に疑問があるように見えるので、私はこのように答えています。もしそうなら、あなたは疑うのが正しいです。2D 配列は、変数が保持しているものの単なる解釈ですが、変数は依然としてポインターへのポインターであり、他のポインター変数と同じように扱います (メモリーの割り当てと割り当て解除、パラメーターとしての受け渡し、処理など)。 ..)。

それを構造体(クラス)などに置き換えることについて:C++を単に平均として使用して、動的な多次元配列を作成することにより、メモリ割り当てとポインティングをよりよく理解するために、そのようにしていると思います。もしそうなら、私の答えはあなたのニーズによく合っていると思います. それ以外の場合は、より抽象化され、メモリ割り当てを自動的に処理する代替手段があります (C++ の場合は、STL コンテナーを検索してください)。自分のやり方で行うことで、「舞台裏」で何が起こっているかについての理解を深めることができます。これは、現代または将来のプログラムでの使用よりも、計算科学においてより重要な知識です。

何が起こっているのかを理解することで、同様の状況に対処できるような答えが得られたことを願っています。これは、一般的に、これらの場合の不適切な構文の真の原因です。英語は私の母国語ではありません。意味の誤用の可能性があることを事前にお詫び申し上げます。

于 2012-09-19T10:48:46.670 に答える
1

配列の受け渡しに問題はないと思います。しかし、私がもっと心配しているのは、変数のスコープと寿命です。配列要素は、関数内でアクセスできる必要があります。

于 2012-09-19T09:29:08.987 に答える
0

ここでは、何が機能し、何が機能しないかを示します。

  1. 配列の受け渡しは正常に機能します。

  2. forまた、ブロック内のループswitchを中括弧で囲む必要があります{..}

完全なコード リスト:

#include <iostream>
using namespace std ;

const int NUM_OF_ARRAYS = 8;
int **arrays = new int*[NUM_OF_ARRAYS];
void fillArrays(int **arrays);


int main(void)
{

   arrays[0] = new int[128];
    arrays[1] = new int[512];
    arrays[2] = new int[2048];
    arrays[3] = new int[8192];
    arrays[4] = new int[32768];
    arrays[5] = new int[131072];
    arrays[6] = new int[524288];
    arrays[7] = new int[2097152];


   fillArrays(arrays);


  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}


void fillArrays(int **arrays) 
{
    const int NUM_OF_ARRAYS = 8;
    for(int i = 0;i < NUM_OF_ARRAYS;i++) 
    {
        switch(i) 
        {
        case 0:
            {
            for(int j = 0;j < 128;j++)
            {
                arrays[i][j] = 1 + rand() % 2000;
                cout<<arrays[i][j]<<"\n";}
            }
            break;

        case 1:
            {
            for(int j = 0;j < 512;j++)
                arrays[i][j] = 1 + rand() % 5000;
            }
            break;

        case 2:
            {
            for(int j = 0;j < 2048;j++)
                arrays[i][j] = 1 + rand() % 10000;
            }
            break;

        case 3:
            {
            for(int j = 0;j< 8192;j++)
                arrays[i][j] = 1 + rand() % 30000;
            }
            break;

        case 4:
            {
            for(int j = 0;j < 32768;j++)
                arrays[i][j] = 1 + rand() % 100000;
            }
            break;

        case 5:
            {
            for(int j = 0;j < 131072;j++)
                arrays[i][j] = 1 + rand() % 200000;
            }
            break;

        case 6:
            {
            for(int j = 0;j < 524288;j++)
                arrays[i][j] = 1 + rand() % 1000000;
            }
            break;

        case 7:
            {
            for(int j = 0;j < 2097152;j++)
                arrays[i][j] = 1 + rand() % 30000000;
            }
            break;

        }
    }
}
于 2012-09-19T09:54:25.967 に答える
0

配列を渡す方法は問題ありませんが、関数を大幅に短縮できます。これらの値のみが必要な場合は、次のように簡単に実行できます。

void fillArrays(int **arrays) {

    int divisors[8] = {2000,5000,10000,30000,100000,200000,1000000,30000000};
    int bounds[8] = {128,512,2048,8192,32768,131072,524288,2097152};

    for( int i = 1; i < 7; i++ )
    {
        for(int j = 0; j < bounds[i]; j++ )
            arrays[i][j] = 1 + rand() % divisors[i];
    }
}
于 2012-09-19T09:38:49.743 に答える