2017-12-30 22 views
3

Wenn ich versuche, ein Array in die Funktion zu senden, erhalte ich einen Fehler.Wie wird ein Array als Funktionsargument übergeben?

Das ist mein minunit Testprogramm:

#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; 
} 

Die Linie, die ich Problem mit

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

ist und es geht in dieser Funktion:

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; 

ich im Grunde muss überprüft werden, ob der Zähler in der Histogrammfunktion 7 ist, irgendwelche Vorschläge?

+2

'{1,2,3,4,5,6,7}' ist kein Array, es ist ein geschweifter Initialisierer. An sich hat es keinen Typ. – StoryTeller

+1

Ich sehe keine [Bilder] (https://en.wikipedia.org/wiki/Collage) ;-) –

+0

posten Sie bitte ein [mcve], damit wir das Problem reproduzieren können. – user3629249

Antwort

5

Das Problem ist mit der Syntax HistogramArray({1,2,3,4,5,6,7}), hier {1,2,3,4,5,6,7} ist kein Array für sich, es ist eine Klammer-Liste der Initialisierer. Die HistogramArray() Funktion erwartet ein Array als Argument.

Sie können jedoch, verwenden Sie es mit einer Syntax von compound literal

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

es wie ein Array zu verwenden.

Zitiert C11, Kapitel §6.5.2.5,

A Postfix-Expression, die von einer braceenclosed Liste von Initialisierungen, gefolgt von einem geklammerten Typnamen besteht, ist eine Verbindung Literal. Es stellt ein unbenanntes Objekt bereit, dessen Wert von der Initialisierungsliste angegeben wird.

und

Wenn der Typname ein Array von unbekannter Größe angibt, wird die Größe durch die Initialisiererliste bestimmt, wie in 6.7.9 angegeben, und die Art der Verbindung ist, dass der wörtlichen Der abgeschlossene Array-Typ. [...]

So bietet dies Ihnen mit einem unbenannten Array, das mit den Elementen in der geschweiften Klammer Liste initialisiert wird.

+0

@AlexKreinis Streng genommen ist dies nicht * ein Array als Funktion Argument übergeben *, das ist * ein Array Literal schreiben *. Arrays können nicht an Funktionen übergeben werden. Was in diesem Fall an die Funktion übergeben wird, ist ein Zeiger, kein Array. Es wird immer noch für Sie arbeiten, aber idealerweise sollten Sie den Unterschied kennen. –

Verwandte Themen