2

テキスト ファイルの fscanf に成功し、配列 E2N1 に保存しました。これをポインターとして関数に渡そうとしていますが、機能していません。E2N1[0][0] を呼び出そうとすると、E2N は配列でもポインターでもないと言われます。私はこれに関する解決策をずっと探していました。(申し訳ありませんが、E2N は E2N1 を意味していました) fscanf を次のように使用します。

int E2N1[noz.rowE2N][Q.N];

FILE* f = fopen("E2N.txt", "r");
for(i=0; i<noz.rowE2N; i++){
    for (j=0; j<Q.N; j++){
        fscanf(f,"%d",&E2N1[i][j]);

    }
    fscanf(f,"\n");

}
fclose(f);

また、E2N1 を関数に渡すことができません。

どうぞよろしくお願いいたします。

機能は次のとおりです。

double *dudtF = stiffness(&U, &massM, &noz, &newV, &E2N1, &I2E, &B2E, &PP, &QQ);

関数ヘッダーを次のように記述します。

double *stiffness(double *U, double *massM, MESH *meshN, double *V1, int *E2N1, int *I2E, int *B2E, ordApprox *pp, ordApprox *qq)

V1、I2E、B2E は 3 つのアレイであり、E2N1 でやろうとしているのと同じようにしようとしています。

4

4 に答える 4

0

配列の面白いところは、配列が実際にポインターとして機能することです。

配列がある場合、char a[3]変数は と同等です。char* p配列がある場合char b[3][4]、変数bは と同等char** qです。つまり、メソッド内の処理を変更して、参照から参照への参照 (および場合によっては参照への参照) を整数に変更することを検討する必要があります。

Google を試してみてください...これが私が得た結果です。

http://www.dailyfreecode.com/code/illustrate-2d-array-int-pointers-929.aspx

http://www.cs.cmu.edu/~ab/15-123S09/lectures/Lecture%2006%20-%20%20Pointer%20to%20a%20pointer.pdf

于 2013-04-03T04:42:25.520 に答える
0

as を渡す必要はありません。配列名自体がポインターに変換されるため、 noとして&E2N1渡すだけです。E2N1&

double *dudtF = stiffness(&U, &massM, &noz, &newV, E2N1, &I2E, &B2E, &PP, &QQ);

int **また、それを2 次元配列として取得する必要があります。

double *stiffness(double *U, double *massM, MESH *meshN, double *V1, int **E2N1, int *I2E, int *B2E, ordApprox *pp, ordApprox *qq)
于 2013-04-03T04:43:02.043 に答える
0

これは、ある関数から別の関数に行列を転送する方法の例です...

void foo (int **a_matrix)
{
int value = a_matrix[9][8];
a_matrix[9][8] = 15;
}

void main ()
{
#define ROWS 10
#define COLUMNS 10

int **matrix = 0;
matrix = new int *[ROWS] ;
for( int i = 0 ; i < ROWS ; i++ )
matrix[i] = new int[COLUMNS];

matrix[9][8] = 5;

int z = matrix[9][8] ;

foo (matrix);

z = matrix[9][8] ;
}
于 2013-04-03T04:52:11.943 に答える
0

次のように、ポイント参照によって関数に渡された多次元配列を参照することはできません。

int iVals[10][10];
foo(iVals);

void foo(int** pvals)
{
    // accessing the array as follows will cause an access violation
    cout << pvals[0][1]; // access violation or unpredictable results
}

たとえば、関数プロトタイプで配列に 2 番目の次元を指定する必要があります。

foo(int ivals[][10])
{
    cout << ivals[0][1];  // works fine
}

寸法がわからない場合は、次の原則に従うことをお勧めします。

void foo(int *p, int r, int c)
{
    for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            printf("%d\n", p[i*c+j]);
        }
    }
}

int c[6][6];

// pointer to the first element
foo(&c[0][0], 6, 6);

// cast
foo((int*)c, 6, 6);

// dereferencing
foo(c[0], 6, 6);

// dereferencing
foo(*c, 6, 6);

これが役立つことを願っています。

または、SAFEARRAY を使用することもできます - http://limbioliong.wordpress.com/2011/06/22/passing-multi-dimensional-managed-array-to-c-part-2/を参照してください。

于 2013-04-03T05:10:17.097 に答える