2017-11-29 5 views
0

現在、関数を使用して数式を実行するプログラムをcで作成しています。読み取られる可能性のあるデータは、0を除く2つの精度浮動小数点数が最大100万です。配列に読み込まれた数値の数を数えようとするとエラーが発生しますが、何らかの理由でデフォルト値毎回私はプログラムを実行します。したがって、たとえば、値を入力しないと、264,1つの値265,2つの値266などが得られます。私は正確な合計を得るためにカウントから264を引くことができると思うが、なぜこれが起こっているのか、264がどこから来るのかを知りたい。私は以下のコードを添付しました。ありがとうございました。カウント関数は常に少なくとも264を返します。C

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

#define N 1000000 

int count_num(double numbers[]); 
double sum(double numbers[]); 
double max(double numbers[]); 
double min(double numbers[]); 
double ar_mean(double numbers[]); 
double har_mean(double numbers[]); 
double variance(double numbers[]); 

int main(void) 
{ 
    double numbers[N]; 
    int i =0; 

    while(scanf("%lf.2",&numbers[i])!=EOF&&i<N) 
    { 
     i++; 
    } 

    int count=count_num(numbers); 
    printf("Count: %d\n", count); 
} 

int count_num(double numbers[]) 
{ 
    int count=0; 
    for(int i=0;i<N;i++) 
    { 
     if((numbers[i]!=0)&&(numbers[i]!=0.0)) 
     { 
      count++; 
     } 
    } 

    return count; 
} 
+0

2つの問題がありますが、主なものは、Cが値をデフォルトに初期化しない(つまり、2倍の配列が0の配列に初期化されない)ということです。それでもまだなぜあなたが* 264を得るのかを説明するべきではありません... –

+1

まず、 'count_num'では、常に' N'サイズの配列全体を調べています。配列は意味があります。残りは予期しないゴミです。そのゴミを分析して数える点は何ですか? – AnT

+0

スタックに3.8 MBの配列を置くことは私には賢明ではないようです。 –

答えて

2

コメント者、情報交換者、AnTの両方が正しく、未初期化された配列が問題の原因です。未知の値が含まれています。あなたはもう1

double numbers[N] = {0.0};

0.0にすべての要素をループして設定することによって、または構築物のいずれかを使用して、配列を初期化する必要があります:2011 5.1.2.2:あなたの main機能は、ISO/IECによると9899に intを返すが、持っていません.1。

+0

ありがとう! {0.0}を追加して、私のプログラムはスムーズに動いています。 –

+0

'main'は' return'ステートメントを持つ必要はありません。それは特別です。 –

+0

@EricPostpischil明確にするために引用を追加しました。このルールには例外があります(例:J.2、J.3.2、J.5.2)が、文書化する必要があります(J.3)。そのようなメモがなければデフォルトを取らなければなりません。 – deamentiaemundi

関連する問題