0

私は C/C++ でポインターを勉強しています。この問題を学習する小さなプロジェクトとして、行列を操作する単純なアプリケーションを開発しようとしています。ポインターと動的割り当てを使用しているこの方法が正しいか、それとも間違っているかを尋ねたいと思います。ありがとう :)

#include <stdlib.h>
#include <stdio.h>

int numberRows;
int numberCollumns;
void getSize()
{
   printf("Write down size of matrix in format Rows Collumns: ");
   scanf("%i %i", &numberRows, &numberCollumns);
}

void getMatrix(int *m[])
{
   int x = 0;
   int y = 0;
   while(x<numberRows)
   {
      while(y<numberCollumns)
      {
      scanf("%i", &m[x][y]);
      y++;        
      }
   x++;
   y = 0;
   }
}

void writeMatrix(int *m[])
{
   int x = 0;
   int y = 0;
   while(x<numberRows)
   {
      while(y<numberCollumns)
      {
      printf("%i ", m[x][y]);
      y++;        
      }
   printf("\n");
   x++;
   y = 0;
   }
}

int main()
{
   getSize();
   int **matrix;
   matrix = (int**)malloc(numberRows*sizeof(int*));
   int x = 0;
   while(x < numberCollumns)
   {
      matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
      x++;
   }
   getMatrix(matrix);
   printf("\n\nMatrix: \n");
   writeMatrix(matrix);


   return 0;
}
4

2 に答える 2

0

Jesse Good が指摘したように、構造は loop overnumberRowsではなく、numberCollumns( PS 'column' に L が 1 つだけ) あることを除いて、問題ないように見えます。

誤解を招く変数名の選択があると思います。マトリックスは としてレイアウトされてmatrix[rows][columns]いますが、 を使用してインデックスを付けます[x][y]。従来、xは横方向のインデックスで、y縦方向です。を使用xして行 (垂直ディメンション) を選択すると、いつか混乱するでしょう。これらの使用を逆にするか、数学者が行うことを行います ( と を使用iしますj)。

2D マトリックス自体に関しては、キャッシュの局所性と効率性の理由から、行ごとに個別に割り当てることは避けます。私は先日質問に答え、これについていくつかの考えを提供しました: 配列の代わりにポインターを使用する

最後に、これは単なる一般的なスタイルです...for行/列を反復処理するだけの場合は、ループを使用しないでください。はるかに読みやすく、事故の可能性が低くなります (「おっと、カウンターをリセットまたはインクリメントするのを忘れていました」)。

そうそう、これが純粋な C の場合は、malloc呼び出しの結果をキャストしないでください。

于 2012-10-16T23:16:28.047 に答える
0

問題が見つかりました:

while(x < numberCollumns)
{
   matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
   x++;
}

ループ条件が間違っています。行数と列数が一致しない場合はどうなりますか? また、対応する への呼び出しも見当たりませんfree

コード スタイルに関しては、while ループは for ループのようによく見えます。

for(int x = 0; x < numberRows; ++x)
{
    matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
}

サイドノート

コードは純粋な C です ( からの戻り値のキャストを除いてmalloc)。C++ コードはかなり異なって見えます。

于 2012-10-16T23:09:07.863 に答える