-4
#include <iostream>
#include <time.h>
using namespace std;

void my_func();
int main()
{
    float start_time = clock();
    cout << "Starting time of clock: " << start_time;
    cout << endl << endl;

    for (int i = 0; i < 100000; i++)
    {
        my_func();
    }

    float end_time = clock();
    cout << "Ending time of clock: " << end_time;
    cout << endl << endl;
}

void my_func()
{
    int my_array[5][5];
}

添字のみを使用して、2 次元配列の要素を多数参照するプログラムを作成する必要があります。これは実際には 2 部構成のプロジェクトですが、私は最初の部分だけを正しく作成することに関心があります。2 番目の部分ではポインターを使用できますが、今のところ、"添え字" (インデックス?) のみを対象としています。進め方について何かアドバイスはありますか?

Volkan İlbeyli のおかげで、最初のパートを無事に完了できました。私は今、2番目の部分に進んでいます:

ポインターとポインター演算を使用して、2 次元配列の要素を多数参照するプログラムを作成する必要があります。これが私がこれまでに持っているものです:

#include <iostream>
#include <time.h>
using namespace std;

void my_func();

int main()
{

    float start = clock();

    for (int i = 0; i < 100000; i ++)
    {   
        my_func();
    }

    float end = clock();
    cout << "Ending time of clock: " << (end - start) / ((double)CLOCKS_PER_SEC);
}

void my_func()
{
    int my_array[10][10];

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            *(my_array+i+j);
        }
    }
}

私は最初の部分を完了し、現在次の部分に取り組んでいます。何か見逃していないか知りたいだけです。コードは正常に機能し、プログラムも正常に機能します。ポインターは私の強みではなく、インターネットで答えを見つけるのに多くの時間がかかりました. ポインターと「ポインター演算」に関する技術的な観点を求めています。

4

1 に答える 1

1

さて、あなたが試みているタスクの目的や意味が理解できなかったとしても、私が間違っていなければ、インデックスを使用して 2D 配列の要素に到達するように求められます。

あなたのコードを考えると、あなたは要素にアクセスしmy_func()ません。サイズが 5x5 の 2D 配列を使用することのみを宣言します。要素にアクセスするには、(私が思うに) あなたのケースでは配列を参照するには、forループとインデックスを使用して配列の要素にアクセスする必要があります。

あなたの場合、私はこのように行くべきです:

void my_func()
{                                   //assuming that the usage of
    int my_array[1500][500] = {0};  //square matrice is not mandatory

    for(int i=0; i<1500 ; i++){
        for(int j=0; j<500 ; j++){
            my_array[i][j]; //no operation is done, only accessing the element
        }
    }

    return;
}

for ループをスワップして、配列に垂直にアクセスすることもできます。つまり、最初の列、次に 2 番目、3 番目の列を通過します...これにより、インデックスによる 2D 配列の参照が遅くなります。SO に関するこの投稿を参照してくださいfor ループを交換すると速度が低下する理由、つまり、行 - 列の順序を列 - 行に変更します。

また、特定のイベントの重要な時間測定に関心がある場合は、クロックの開始時と終了時にそのイベントのみを含める必要があることに注意してください。コードには、 、 を呼び出す時間も含めます。また、coutendl呼び出し時間は、を参照する配列my_func()とは関係ありません。また、2D 配列へのアクセスにはあまり多くのコードが必要ないため、関数の時間を測定したいと思います。時間がかかりすぎる場合は、関数を呼び出し、内部でタイミング変数を宣言し、開始時刻を絶対に出力せず、操作を繰り返すループの前に時間を開始し、ループが終了した後に停止します。この投稿を見ることができますmain()時間がどのように測定され、印刷されるかについてのアイデアを得るために (秒やミリ秒などを考慮する必要がある場合)。

于 2013-04-20T09:45:31.263 に答える