2012-02-03 5 views
1

配列や関数を使ったポインタの使い方を示すプログラムを書く必要があります。配列要素を使用する前に初期化する方法は?

#include <stdio.h> 
#include <conio.h> 

#define ROWS 3 
#define COLS 4 

void print(int rows, int cols, int *matrix); 

void main(void) 
{ 
    int a[ROWS*COLS],i; 
    for(i=0;i<ROWS*COLS;i++) 
    { 
     a[i]=i+1; 
    } 
    print(ROWS,COLS,a); 
    getch(); 
} 

void print(int rows, int cols, int *matrix) 
{ 
    int i,j,*p=matrix; 
    for(i=0;i<rows;i++) 
    { 
    for(j=0;j<cols;j++) 
     { 
     printf("%3d",*(p+(i*cols)+j)); 
     } 
     printf("\n"); 
    } 
} 

上記のプログラムは、行と列があらかじめ定義されたマトリックスを印刷します。私は行と列がユーザーによって入力されるようにプログラムを変更したいです。

#include <stdio.h> 
#include <conio.h> 

void print(int rows, int cols, int *matrix); 

void main(void) 
{ 
    int ROWS,COLS,a[ROWS*COLS],i; 
    printf("Enter the number of rows: "); 
    scanf("%d",ROWS); 
    printf("\nEnter the number of columns: "); 
    scanf("%d",COLS); 
    for(i=0;i<ROWS*COLS;i++) 
    { 
     a[i]=i+1; 
    } 
    print(ROWS,COLS,a); 
    getch(); 
} 

void print(int rows, int cols, int *matrix) 
{ 
    int i,j,*p=matrix; 
    for(i=0;i<rows;i++) 
    { 
    for(j=0;j<cols;j++) 
     { 
     printf("%3d",*(p+(i*cols)+j)); 
     } 
     printf("\n"); 
    } 
} 

このプログラムは、変数ROWSとCOLSが宣言される前に使用されているというエラーを出しています。この問題を解決する方法。

+0

この宿題はありますか? –

+0

yeaちょっと...ポインタ、配列、関数を使ってプログラムを書く必要がありました...配列宣言に問題がありました。 –

答えて

5

1つのオプションは、ヒープ上aを割り当てることです:

int main(void) 
{ 
    int rows,cols,*a,i; 
    printf("Enter the number of rows: "); 
    scanf("%d",&rows); 
    printf("\nEnter the number of columns: "); 
    scanf("%d",&cols); 
    a = malloc(rows*cols*sizeof(int)); 
    for(i=0;i<rows*cols;i++) 
    { 
     a[i]=i+1; 
    } 
    print(rows,cols,a); 
    getch(); 
    free(a); 
} 

お知らせも私がしたこと:scanf()呼び出しから欠落していた

  1. を追加しましたアンパサンドを。
  2. 返品タイプをmain()からintに変更しました。あなたのコードは動作しませんでした、なぜあなたのようWhat are the valid signatures for C's main() function?

を参照してください:

伝統的に、Cは配列の境界のための定数式が必要。 ROWSCOLSが定数だったとき、あなたのコードではすべてうまくいっていました。変数に変換すると、avariable-length arrayになりました。問題は、配列のサイズが配列が宣言された位置で計算され、その時点でROWSCOLSの値がまだ分かっていないということでした。 C99では

aダウンの宣言を押して、あなたのコードを修正することが可能である:

int main(void) 
{ 
    int rows,cols,i; 
    printf("Enter the number of rows: "); 
    scanf("%d",&rows); 
    printf("\nEnter the number of columns: "); 
    scanf("%d",&cols); 
    int a[rows*cols]; 
    for(i=0;i<rows*cols;i++) 
    { 
     a[i]=i+1; 
    } 
    print(rows,cols,a); 
    getch(); 
} 
+0

助けてくれてありがとう...そして私のコンパイラはmallocでエラーを出していたので、 'a =(int *)malloc(ROWS * COLS * sizeof(int)); 'を使用しなければならなかった –

+0

@ RaedShahid、おそらくあなたはCのコードをC++としてコンパイルしています。これは良い考えではありません。 –

+0

私はボーランドのC++ –

0

あなたはrowscolsを取得した後、あなたは配列を宣言する必要があります - それ以外の場合は意味がありません。ところで

int rows,cols; 
scanf("%d %d",&rows,&cols); 
int a[rows*cols]; 

、(プログラムが正常に終了した場合0)mainintを返すべき

+0

を使っているので、それは私にとってはうまくいかず、mallocを使わなければならなかったと思います。 –

+0

どのエラーが表示されますか? – asaelr

+0

それはまだ行と列の定数値を求めていました。 –

0
  1. あなたは、動的配列を割り当てる必要がある - malloc
  2. scanf("%d", &ROWS);を使用 - scanf必要です - &に気付きます住所・アドレス。
+0

助けてくれてありがとう:) –

1
printf("Enter the number of rows: "); 
    scanf("%d",&ROWS); 
    printf("\nEnter the number of columns: "); 
    scanf("%d",&COLS); 
+0

私はいつもアンパサンドが足りません:P –

+0

それは今のところうまくいきますか? – George

+0

はい、今動作しています... mallocも必要です。 –

関連する問題