3

私は本当に C プログラミング言語の初心者で、ポインターの学習を始めました...ポインターの操作に問題があります。私がやりたいことは、グローバル変数 (ポインターのみ) を使用せずに、2 つの関数を使用してマトリックスを読み書きすることです...したがって、これを作成することに成功しませんでした。私はポインターについて多くのことを検索し、それらをどのように使用できるかを理解しようとしていますが、そのマトリックスを読み書きすることができません何が間違っていますか...お願い、お願い、助けてください2DArray とポインタに関するリンク)...ありがとう!

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

void readM(int (*x)[100][100], int *row, int *column)
{
int i,j;
printf("Row no: ");
scanf("%d",row);
printf("Column no: ");
scanf("%d",column);
printf("Matrix elemnts: \n");    
for(i=0;i<(*row);i++)
{
    for(j=0;j<(*column);j++)
    {
        printf("[%d][%d]=",i,j);
        scanf("%d",x[i][j]);
    }
}
}

void writeM(int (*x)[][100], int *row, int *column)
{
int i,j;
printf("\nMatrix is: \n");
for(i=0;i<(*row);i++){
    for (j=0;j<(*column);j++){
    printf("%d",(*x)[i][j]);
    }
    printf("\n");
    }
}

int main()
{

char choice;
int a[100][100],m,n;
do
{
   printf("\nChose an option\n\n"
      "1) read matrix \n"
      "2) write matrix\n"
      "3) display matrix in spiral\n"
      "4) return max and min\n"
      ///...etc
   scanf("%c", &choice);
   while (choice<'0'|| choice>'4')
         {
            printf("\nInvalid option! Chose again! \n\n");
            scanf("%c",&choice);
         }
   switch (choice)
   {
        case '0': exit(0);
        case '1': readM(&a,&m,&n); break;
        case '2': writeM(&a,&m,&n);break; /// ... etc
} while (choice !=5);
getch();
}
4

2 に答える 2

2

おそらく複数の間違いがあるでしょう

単一のchar変数に対して%sでscanfを使用します。scanfには独自の問題があるため、charを入力する場合は、%cを使用します(さらに良いのは、getcまたはgetcharを使用することです)。または、char配列を%sに渡します。ただし、文字列と文字を比較することはできません。

choice<'0'

また、scanfの前の「\n」を削除します。printfでは、\ nバッファをフラッシュし、次の行に移動します。scanfの場合、%cまたは%sの後に追加することは(ターミネータを示しているので)まだ意味がありますが、その前ではありません。

ここには関数ポインタはありません。これらは、関数をパラメーターとして渡すために使用されます。デフォルトで参照によって渡される配列を渡すだけです。だから単に使用する

int x[100][100] or int x[][100]

関数定義のパラメータで、xを次のような配列として扱います。

x[a][b] rather than *x[a][b]

また、mainから配列を渡す場合は、参照自体によって渡される配列の名前である「a」を渡すだけです。配列のアドレスを渡すことは無意味です。

于 2012-11-03T20:08:07.520 に答える
2

もう1つの問題は、配列を読み取るときに、最初にポインター(* x)をたどり、次に配列オフセット[i] [j]を追加することです。これにより、まだ持っていないメモリ位置に移動する可能性があります。へのアクセス。渡すのはポインタの配列であるため最初に数値の場所(x [i] [j])を調べてから、ポインタをたどります。

編集:前のユーザーは、私がここで行った2番目のアドバイスを反映するように回答を更新したので、それを消去しました。

于 2012-11-03T20:19:10.560 に答える