2016-04-20 8 views
0

Ich brauche meine Funktion, um ein Array zurückzugeben, das dann in die nächste Funktion gehen wird. Ich weiß aufgrund einiger Forschung, dass ich einen Zeiger verwenden muss, um dies zu erledigen. aber wenn ich diesen Code ausführe, bekomme ich Speicheradressen oder was mir Speicheradressen erscheinen (wenn es nicht die Adresse ist, ist eine riesige Zahl) in meinen Ergebnissen.Funktionen, die Arrays zurückgeben

Das Problem tritt auf, wenn das Array Funktionen ändern muss. Die beiden einzelnen Funktionen laufen dort wie gewünscht gut.

Hier ist mein Code:

int main(void) 
{ 
    int y = 0, x[10]; 
    int *p; 
    y = capturingNumberTimesLoopRuns(); 
    p = PopulateArray(y); 
    searchArray(x); 
} 

int capturingNumberTimesLoopRuns (void) 
{ 
    int y = 0; 
    while (y == 0) 
    { 
     printf("Please enter the quantity of numbers you wish to enter.\n"); 
     printf("Enter a number between 1 and 10: "); 
     scanf("%d", &y); 
     if (y < 1 || y > 10) 
     { 
      printf("Invalid Selection! Please Try Again.\n"); 
      y = 0; 
     } 
    } 
    return y; 
} 

int * PopulateArray(int y) 
{ 
    int i; 
    int x[10]; 
    int a = 1; 
    for (i = 0; i < y; i++) 
    { 
     printf("Please enter number %d: ", a); 
     scanf("%d", &x[i]); 
     a++; 
    } 
    return x; 
} 

void searchArray(int x[]) 
{ 
    int i, a = 0, numberOfTimes = 0, average = 0; 
    for (i = 0; x[i] != 0; i++) 
    { 
     if (x[i] % 3 == 0) 
     { 
      a += x[i]; 
      numberOfTimes += 1; 
     } 
    } 
    average = a/numberOfTimes; 
    printf("%d\n", a); 
    printf("average = %d", average); 
} 
+0

Sie können die Adresse einer Variablen mit automatischem Speicher in einer Funktion nicht zurückgeben, da dieser Speicher bei der Rückkehr aus der Funktion nicht mehr zugewiesen wird. Sie haben zwei Möglichkeiten: (1) Übergeben Sie die Array-Adresse als Argument an die Funktion, oder (2) Lassen Sie die Funktion den Speicher mit 'malloc' belegen und überlässt sie dem Aufrufer, um sie später freizugeben. –

+0

Sie können kein Array in C zurückgeben. – immibis

Antwort

2

Ihre Recherche ist korrekt. Die Vorgehensweise bei Operationen mit einem Array innerhalb einer Funktion besteht darin, einen Zeiger auf das Array an Ihre Funktion zu übergeben. Sie können dann mit dem Array nach Belieben in der Funktion arbeiten, ohne einen Zeiger zurückgeben zu müssen, wenn Ihre Funktion zurückkehrt. (Sie können immer noch einen Zeiger auf das Array für die Bequemlichkeit natürlich zurück)

über einen Zeiger auf Ihre Array übergeben, müssen Sie auch die Größe des Arrays zu übergeben (oder einen globalen verwenden, um die Größe des verfolgen Array - nicht zu bevorzugen, da Sie die Verwendung von Globals vermeiden möchten, es sei denn, dies ist absolut notwendig. Zum Beispiel Ihre populatearray Funktion geschrieben werden könnte wie folgt:

/* pass pointer to array and size to function */ 
int *populatearray (int *x, int sz) 
{ 
    int i, a = 1; 

    for (i = 0; i < sz; i++)  { 
     printf ("Please enter number %2d: ", a++); 
     scanf ("%d", &x[i]); 
    } 

    return x; 
} 

(die Rückkehr hier der Einfachheit halber und ist nicht erforderlich, da das Array in main() deklariert ist)

Auf diese Weise können Sie die dynamische Zuordnung vermeiden, Beibehalten eines Zeigers auf den zugewiesenen Speicherblock und die Verantwortung dafür, diesen Speicher freizugeben, wenn er nicht mehr benötigt wird. Es ist nichts falsch daran, dynamisch Speicher zuzuweisen, aber es ist eine zusätzliche Komplikationsstufe, mit der sich neue C-Programmierer befassen müssen.

Ein kurzes Beispiel Ihre populatearray mit arbeiten konnte wie folgt:

#include <stdio.h> 

enum { MAXI = 10 }; /* avoid 'magic' numbers, use proper constants */ 

int *populatearray (int *x, int y); 
void prnarray (int *x, int sz); 

int main (void) { 

    int x[MAXI] = {0}; 

    populatearray (x, MAXI); 
    prnarray (x, MAXI); 

    return 0; 
} 

/* pass pointer to array and size to function */ 
int *populatearray (int *x, int sz) 
{ 
    int i, a = 1; 

    for (i = 0; i < sz; i++)  { 
     printf ("Please enter number %2d: ", a++); 
     scanf ("%d", &x[i]); 
    } 

    return x; 
} 

/* pass pointer to array and size to function */ 
void prnarray (int *x, int sz) 
{ 
    int i; 
    for (i = 0; i < sz; i++) 
     printf (" x[%2d] : %d\n", i, x[i]); 
} 

Beispiel Verwendung/Output

$ ./bin/array_pass 
Please enter number 1: 10 
Please enter number 2: 20 
Please enter number 3: 30 
Please enter number 4: 40 
Please enter number 5: 50 
Please enter number 6: 60 
Please enter number 7: 70 
Please enter number 8: 80 
Please enter number 9: 90 
Please enter number 10: 100 
x[ 0] : 10 
x[ 1] : 20 
x[ 2] : 30 
x[ 3] : 40 
x[ 4] : 50 
x[ 5] : 60 
x[ 6] : 70 
x[ 7] : 80 
x[ 8] : 90 
x[ 9] : 100 

(Obwohl es nicht ein Fehler, der Standard für C Codierung Stil vermeidet caMelCase Variablen für alle Kleinbuchstaben. Siehe zB NASA - C Style Guide, 1994)

Lassen Sie mich wissen, wenn Sie weitere Fragen haben.

+0

Vielen Dank für die ausführliche Erklärung. Jetzt bin ich zuversichtlich, dass meine Array-Werte sind in Ordnung, und es ist meine searchArray-Funktion, die nach Zahlen durch drei teilbar ist, ist der Grund, warum ich die langen Zahlen als mein Ergebnis bekomme. – jjflyV7

+0

Ich habe sogar behoben, dass jetzt meine for-Schleife keine Größe verwendet, um durch das Array zu iterieren. Aber ich schätze wirklich die Erklärung, die ich mit dem Zeigeraspekt kämpfte, und ich denke, dass das mir dabei ebenso helfen wird, wie ich nur ein Anfänger bin. – jjflyV7

+0

Sie werden es bekommen. C braucht nur Zeit, aber es ist es wert. Denken Sie daran, ein * Zeiger * ist nichts anderes als eine Variable, die die * Adresse-von * etwas anderes als ihren Wert enthält. Z.B. 'int a = 5;' erklärt 'a' mit einem * unmittelbar-Wert * von '5'. Dann deklariert "int * b = & a;" einfach die Variable "b" (ein Zeiger), die die * Adresse-von * 'a' als ihren Wert enthält. In C können Sie nur einen einzelnen Wert als Funktionsparameter übergeben oder zurückgeben. Um also ein Array an eine Funktion zu übergeben, wird die Array-Variable in einen Zeiger (eine Variable, die die Adresse des ersten Elements als Wert enthält) umgewandelt. ':) Viel Glück! –

1

Das Array zerstört wird, wenn die Funktion aufgrund seiner automatischen Speicherung zurückgibt. Versuchen Sie, Speicher dynamisch vom Heapspeicher zuzuweisen (zB malloc()) als:

int * PopulateArray(int y) 
{ 
    int i; 
    int *x = malloc(10*sizeof(int)); 

    int a = 1; 
    for (i = 0; i < y; i++) 
    { 
     printf("Please enter number %d: ", a); 
     scanf("%d", &x[i]); 
     a++; 
    } 
    return x; 
} 
+1

** Verwenden Sie kein explizites 'malloc' Casting! ** – Majora320

+0

Danke, habe gerade erfahren, dass es nicht erforderlich war;) – yaman

Verwandte Themen