2017-03-27 12 views
-3

私はポインタとCの一般的な点でかなり新しいです。Cポインタ2次元上へ移動

void moveUpToTop(int num, int dim, int index) { 
    int i,j; 
    double *temp = w[index]; 
    double *zero = w[0]; 
    for(i = index; i > 0; i--) { 
     double *ptrA = w[i]; 
     double *ptrB = w[i - 1]; 
     for(j = 0; j < dim; j++) { 
      *(ptrA + j) = *(ptrB + j); 
     } 
    } 

    for(j = 0; j < dim; j++) { 
     *(zero + j) = *(temp + j); 
    } 
} 

これを2次元配列wとすると、double ** wと定義されます。ポインターを使用して配列の先頭にインデックス "インデックス"を持つ配列値を移動したいのですが、これは私たちがしなければならない課題です。

まず、アレイの場所の1つを保存しています。次に、すべての配列の場所を1つ上に移動します。 私は何が間違っていますか?

私には、ソート機能を設計するために次のコードがあります。

double **w; 
int main (void) { 
    int dim, num; 
    int i, j; 

    scanf ("%d %d", &dim, &num); 
    w = calloc (num, sizeof (double *)); 
    for (i = 0; i < num; i++) { 
     w[i] = calloc (dim + 1, sizeof (double)); 

     int sum = 0; 
     for (j = 0; j < dim; j++) { 
      scanf ("%le", &w[i][j]); 
      sum += w[i][j] * w[i][j]; 
     } 
     w[i][dim] = sqrt(sum); 
    } 

    sort(num, dim); 
    for(i = 0; i < num; i++) { 
     for(j = 0; j < dim; j++) { 
      printf("%e ", w[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

'double **'は2次元配列を定義しません。ポインタへのポインタです。それは配列のように振る舞います。 – StoryTeller

+0

'double **'は2次元配列ではなく、1つを指すことはできません。必要に応じて2D配列を使用します。 [ask]を読んで、[mcve]を提供してください。 – Olaf

+0

「配列の先頭までインデックス "インデックスを持つ配列値を移動する"とはどういう意味ですか? – user2357112

答えて

0

問題は、元のデータにポインタを保存してもデータ自体を保存しないことです。

double *temp = w[index]; // Here you save the pointer 

いますが、データを上書きする最初のループで:

for(i = index; i > 0; i--) { 
    double *ptrA = w[i];   // Same as w[index] in first loop 
    double *ptrB = w[i - 1]; 
    for(j = 0; j < dim; j++) { 
     *(ptrA + j) = *(ptrB + j); // The data pointed to by w[index] is overwritten 
            // in the first loop 

ので、このコードは何もコピーされたインデックスの元のデータではありません。この問題を解決するには

for(j = 0; j < dim; j++) { 
    *(zero + j) = *(temp + j); // Data at index have been overwritten 
           // so this doesn't do what you want 
} 

、それは十分ではありませんindex(つまりdouble *temp = w[index];)へのポインタを保存します。代わりにdouble *temp = w[index];が指すすべてのデータを保存する必要があります。

だから、mallocコピーを保持するためにいくつかのデータが必要です。その後、forループ内のデータをコピーし、コピーしたデータをzeroに復元するときに使用します。

ところで、あなたに与えられたコードは非常に醜い構造を使用していることにも注意してください。余分な倍を節約するためにdim + 1を割り当てています。したがって、あなたの移動関数は、dimの代わりにdim + 1を使用する必要があります。

関連する問題