2017-12-30 38 views
3

関数に配列を送信しようとすると、エラーが発生します。配列を関数の引数として正しく渡すには?

これは私のminunitテストプログラムです:

#include "minunit.h" 
#include "calc.h" 
#include <stdio.h> 

int tests_run = 0; 

static char * test_Repetitve() { 
    mu_assert("error in test_Repetitive, Repetitive != 7", HistogramArray({1,2,3,4,5,6,7})== 7); 
    return 0; 
} 

static char * all_tests() { 
     mu_run_test(test_Repetitive); 
    return 0; 
} 

int main(int argc, char **argv) { 
    char *result = all_tests(); 
    if (result != 0) { 
     printf("%s\n", result); 
    } 
    else { 
     printf("ALL TESTS PASSED\n"); 
    } 
    printf("Tests run: %d\n", tests_run); 

    return result != 0; 
} 

mu_assert("error in test_Repetitive, Repetitive != 7", HistogramArray({1,2,3,4,5,6,7})== 7); 

であり、それがこの機能に行くと、私は問題を抱えている行:基本的に

int HistogramArray(int one[]) 
{ 
    int arrchk[TWENTY+ONE] = { ZERO }, i, j,counter=0;//arrchk is an array that counts how many times the number appears. 
    for (i = ZERO; i<N; i++) 
     arrchk[one[i]]++; 
    for (i = ZERO; i<TWENTY+ONE; i++) 
    { 
     if (arrchk[i] != ZERO) 
         { 
         printf("the number is %d ", i);//printing the histogram. 
          counter++; 
         } 
     for (j = ZERO; j<arrchk[i]; j++) 
     { 
      printf("*"); 

     } 
     if (arrchk[i] != ZERO)printf("\n"); 
    } 
return counter; 

私はヒストグラム機能でカウンタが7であるかどうかを確認する必要があります。

+2

'{1,2,3,4,5,6,7}'は配列ではなく、中括弧で囲まれた初期化子です。それ自体では、タイプはありません。 – StoryTeller

+1

[画像](https://en.wikipedia.org/wiki/Collage)が表示されません。 –

+0

私は問題を再現できるように[mcve]を投稿してください。 – user3629249

答えて

5

問題は構文HistogramArray({1,2,3,4,5,6,7})です。ここでは{1,2,3,4,5,6,7}はそれ自身の配列ではありません。これは、初期化子のブレース拡大リストです。 HistogramArray()関数は、引数として配列を要求します。

ただし、配列のようにそれを使用するcompound literal

HistogramArray((int []){1,2,3,4,5,6,7}) 

の構文でそれを使用することができます。

引用C11、章§6.5.2.5、

イニシャライザのbraceenclosed リストが続く括弧タイプ名から成る後置表現は、リテラルの化合物です。それは初期化子リストによって値が与えられる無名のオブジェクトを提供します。

タイプ名が不明なサイズの配列を指定している場合、サイズは6.7.9で指定され 初期化子リストによって決定され、複合リテラルのタイプのものですアレイタイプは です。 [...]

したがって、これは、中括弧で囲まれたリストの要素で初期化された無名配列を提供します。

+0

@AlexKreinis厳密に言うと、これは配列を関数の引数*として渡すのではなく、*配列のリテラル*を書くことです。配列は関数に渡すことはできません。 tbisの場合、関数に渡されるのは配列ではなくポインタです。それでもあなたのためには機能しますが、理想的には違いを知るべきです。 –

関連する問題