2011-12-26 12 views
1

私はCとC++の新人です。私はJava言語で配列と多次元配列のみを扱っています。 私はいくつかのコードを移行しようとしていると私は、これらの線が何を意味するか知っておく必要があります。これらのコード行は何をするのですか?

int rows = 100; 
int columns = 10; 
int i,j; 
double *example = new double[rows*columns]; 
File fileEx = fopen("exampleText.txt","r"); 
for(i=0;i<rows;i++) 
    for(j=0;j<columns;j++){ 
     fscanf(fileEx, "%lf", example+columns*i+j); 
     //printf("%f ", *(example+columns*i+j)); 
    } 

どうもありがとうございました...ヘルプは大歓迎です!

+1

具体的にどのラインを理解できませんか? –

+6

もし私があなただったら、Cで良い本を手に入れよう。 –

答えて

4

double値を一度に1つずつの2次元配列を読んでいます。

example + columns*i + jは、各反復で配列の右側の要素へのポインタを生成しています。

アレイは1次元配列として割り当てられ、プログラムは、計算、それが配列の要素にアクセスするたびに使用して添字を行うことになるだろう、と述べました。

コードでは、FileFILEの入力ミスですか?)が正常に開かれていることを確認する必要があります。 fscanf()が各繰り返しで成功するかどうかを確認することは悪い考えではありません。

+0

ああ、私は見る!ポインタを見たのは初めてだったので、単純な乗算ではなく、coloumns * iとrows *カラムが何らかのポインタ関数であると思った。ありがとうございました!...何らかの理由で、私はこのコンピュータ上で正解としてこれを選ぶことはできないようです...私は家に帰るとこれを正しいと確認します...もう一度ありがとう! – user947659

1

このコードは、ファイル内の1D配列として表される2D配列を読み取ります。

double *example = new double[rows*columns]; 

この行は、実際には配列のメモリ内に領域を割り当てます。基本的には、exampleはあなたのメモリの配列のベースアドレスを参照します。 example + 4のようなことをすることで、あなたの配列のアドレス+ 32バイトにアクセスします。実際、合計は配列の型に適用されます。ここでは、各セルの8バイト(ダブルのサイズ)なので、+4は4 * 8 = 32バイトを意味します。

あなたはint型(4バイト)の配列を持っているとしたら、4あなたは4 * 4バイト= 16のバイトとしてアドレス+ 16のバイトにアクセスしている意味だろう。最も簡単な言葉で

、各セルは、実際に(その8バイト)ダブルを保持しているので、あなただけの配列に4番目のセルになるだろうexample + 4行うことによって、それはexample[3]を足すようになる、とあなたが最初のスキップaddress + 32行って、 3要素。それを知っ

fscanf(fileEx, "%lf", example+columns*i+j); 

は、この行は単にあなたは、あなたが他の言語にするだろうように、セルcolumns * i + jで現在の文字を置くことを意味します。

関連する問題