2016-11-30 5 views
-3

このプログラムでは、コメントの下に何が起こっているのか分かりません。このプログラムの出力は、Enter temperature#0、#1、#2 ..... 30の31反復であり、次にそれらのユーザ入力値を摂氏に変換する必要があります。私の混乱は、関数呼び出し変換(temps)がどのような目的でどのように機能し、どのようにその関数全体がどのように機能するかにあります。Cコーディング:参照混乱によるループ/呼び出しの場合

上記の出力を達成するためにコードがどのように機能するかについての明確化は素晴らしいでしょう。さらに、convert関数で起こっていることを参照することによって呼び出すことができます。もしそうなら、誰かがそこのダイナミクスを説明してください。

ありがとうございます。

#define COUNT 31 
void convert (float heat[]); 
void main() 
{ 
    float temps[COUNT]; 
    int index; 
    /*load the array with values*/ 
    for (index = 0; index < COUNT ; index++) 
    { 
     printf("Enter temperature #%d: ", index); 
     scanf("%f", &temps[index]); 
    } 
    /*pass the array */ 
    convert(temps); 
    for (index = 0; index < COUNT ; index++) 
     printf("%6.2f\n", temps[index]); 
} 

/*******************convert function ************************/ 
void convert (float heat[]) 
{ 
    int index; 
    for (index = 0; index < COUNT; index++) 
    { 
     heat[index] = (5.0/9.0)*(heat[index]-32); 
    } 
} 
+0

関数 'convert'は、配列を変更ように、これは、単純な索引付けすることが行うことができ – reuns

+0

配列を関数に渡すとポインタになります(これは明らかです。ポインタ構文を使用して関数を宣言したいと思います: 'void convert(float * heat)')。参照渡し(Cのポインタによる)は、関数が渡された実際の引数を変更できることを意味し、値渡しは関数が引数のローカルコピーに対して機能することを意味します。 –

答えて

0

機能変換タン配列の最初の要素へのポインタを受信し、その要素を修正します。つまり、配列はコピーされません。ポインタだけが渡されるので、仮パラメータの熱がの中にどれくらいあるかを示す方法はありませんに変換してください。そのため、配列の長さも渡すことをお勧めします。ここで私はそれを行うだろうかです:

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

#define LEN(arr) ((int) (sizeof (arr)/sizeof (arr)[0])) 

void convert(float heat[], int heatLen) 
{ 
    int i; 

    for (i = 0; i < heatLen; i++) { 
     heat[i] = (5.0/9.0) * (heat[i] - 32); 
    } 
} 


int main(void) 
{ 
    float temps[31]; 
    int i, nRead; 

    for (i = 0; i < LEN(temps) ; i++) { 
     printf("Enter temperature #%d: ", i); 
     nRead = scanf("%f", &temps[i]); 
     if (nRead != 1) { 
      fprintf(stderr, "Invalid input\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    convert(temps, LEN(temps)); 

    for (i = 0; i < LEN(temps) ; i++) { 
     printf("%6.2f\n", temps[i]); 
    } 

    return 0; 
} 
0

C.でcall by reference値によって言語のみサポートコールのようなものはありません。

コールが

convert(temps); 

を通過します。 tempsは配列なので、実際にはaddress of the first element in the arrayを渡します。関数については、pointer to floatのように見えます - 関数の引数として使用すると、配列はポインタに崩壊すると言います。

convert関数の内部では、渡されたアドレス値(別名ポインタを使用)を使用して配列の要素の値を変更できます。配列がコピーされないためには、唯一のアドレス(ポインタ)が渡されている。

temps[i] = .....; 

又は

*(temps + i) = ....; 
関連する問題