2010-01-22 8 views
5

Kann ich so etwas tun? Ob das funktioniert?Kann ich Double * in Funktion zurückgeben?

double *vec_subtraction (char *a, char *b, int n) 
{ 
    double *result; 
    int i; 

    for(i=0; i<n; i++) 
     result[i] = a[i]-b[i]; 

    return result; 
} 

und dann in Haupt:

double *vec=vec_substraction(a, b, n); 
for(i=1; i<n; i++)   
    printf("%d", vec[i]); 

a und b sind Vektoren mit der gleichen Anzahl von Elementen, n ist die Anzahl der Elemente.

+0

Kann ich das auch in main machen? Weisen Sie das Array zu: 'double * resoullt = vec_subtraction (a, b, n);' – Devel

+0

Für den Datensatz, die übliche Weise, Vektorrechnung wie folgt zu tun, ist, einen Zeiger dorthin zu übertragen, wo die Ergebnisse gespeichert sind (dh ' void vec_subtraction (char * a, Zeichen * b, double * c, int n); '). Dies ermöglicht dem Aufrufer, Puffer wiederzuverwenden und manchmal denselben Puffer sowohl für das Ergebnis als auch für eine Eingabe zu verwenden. Wir hatten ein Projekt mit seltsamen Fehlern, weil 'malloc()' in der Ausführungszeit zu wenig deterministisch war. –

Antwort

11

Ja, Sie können, aber Sie müssen Speicher für result irgendwo zuweisen.

Grundsätzlich können Sie entweder den Speicher innerhalb vec_subtraction oder außerhalb vec_subtraction zuweisen, wenn Sie außerhalb zuweisen, können Sie dies statisch oder dynamisch tun.

Wenn Sie vorhaben, nach innen vergeben:

double *vec_subtraction (char *a, char *b, int n) { 
    double *result = malloc(sizeof(double)*n); 
    int i; 
    for(i=0; i<n; i++) 
     result[i] = a[i]-b[i]; 

    return result; 
} 

und in Haupt:

double *vec; 
// ... 
vec = vec_subtraction(a, b, n); 
// ... 
free(vec); 

nicht zu free das Ergebnis des Aufrufs zu vec_subtraction irgendwann später vergessen.


Wenn Sie vorhaben, zuzuteilen außerhalb Sie in einem Zeiger auf den Speicher übergeben müssen:

void vec_subtraction (char *a, char *b, int n, double *result) { 
    int i; 
    for(i=0; i<n; i++) 
     result[i] = a[i]-b[i]; 
} 

in Haupt:

// choose one of: 
// double *vec = malloc(sizeof(double)*n); 
// double vec[10]; // where 10= n. 
vec_subtraction(a, b, n, vec); 

// if you used *vec = malloc... remember to call free(vec). 
+0

Auch 'Doppelvec [n];' in C99 und später. –

2

können Sie, aber Sie don‘ t scheint einen Speicher für den Ergebnisvektor zuzuweisen.

0

Es würde funktionieren, wenn Sie einen Speicher für die Ergebnisse zugeordnet:

result = malloc(sizeof(*result) * n); 

Und jetzt wird es in der Verantwortung des Anrufers, dass der Speicher freizugeben.

Der Aufrufer kann auch das doppelte Array übergeben, das mit Ergebnissen gefüllt werden soll. In diesem Fall können Sie ein dynamisch zugewiesenes Array nicht verwenden.

3

Nicht so. Sie müssen Speicher entweder auf dem Stapel zuweisen, bevor Sie die Funktion aufrufen, oder auf dem Heap innerhalb der Funktion.

double *vec_subtraction(...) { 
    double *result = malloc(sizeof(double)*n); 

    ... 

    return result; 
} 

Dann würde der Rest funktionieren. Sie müssen jedoch daran denken, den Speicher freizugeben.

Die andere Option ist:

void vec_subtraction(..., double *result) { 


     ... 

} 

Dann in Haupt:

double result[n]; 
vec_subtraction(..., result); 
2

Sie können natürlich auch eine doppelte * aus einer Funktion zurückgeben. Stellen Sie nur sicher, dass der Zeiger immer noch auf ein gültiges Objekt zeigt. z.B.dies nicht tun:

double *vec_subtraction (char *a, char *b, int n) { 
double result[n]; 
int i; 

for(i=0; i<n; i++) 
    result[i] = a[i]-b[i]; 

    return &result[0]; //error,the local array will be gone when the function returns. 
} 

Dies würde jedoch in Ordnung sein:

double *vec_subtraction (char *a, char *b, int n) { 
double *result = malloc(sizeof(double)*n); 
int i; 
if(result == NULL) 
    return NULL; 

for(i=0; i<n; i++) 
    result[i] = a[i]-b[i]; 

    return result; //remember to free() the returned pointer when done. 
} 
1

In Ihrer Funktion vec_subtraction Sie in double * Ergebnis eine uninitialised Variable haben. Wenn Sie möchten, dass etwas Bedeutungsvolles zurückgegeben wird, müssen Sie dem Array etwas Speicher zuweisen, z.

result = malloc(sizeof(double) * n); 

Dann müssen Sie daran denken, es zu befreien, wenn Sie fertig sind:

free(vec); 

jedoch gute Praxis (zumindest, wenn ich ein C-Coder war) war und den freien Speicherplatz Alloc im gleichen Umfang, wenn möglich natürlich. Also solltest du dein Array wirklich an deine vec_subtraction Funktion übergeben. Sie müssen Ihre Funktion Unterschrift ändern:

vec_subtraction (char *a, char *b, int n, double *result) 

es so nennen:

double vec[n]; 
... 
vec_subtraction (a, b, n, &result); 

Excuse my pseudo-c, aber hoffentlich bekommen Sie die Idee.

Viel Glück!

1

Sie können etwas tun wie dies, solange es nicht zu viel wie es ist. Insbesondere müssen Sie sicherstellen, dass Sie die Lebensdauer des gesamten Speichers vernünftig handhaben.

Einige andere haben darauf hingewiesen, dass Sie Platz für Ihr Ergebnis reservieren müssen, also werde ich nicht in diesen Teil kommen. Es gibt jedoch ein paar andere Punkte, über die man nachdenken sollte.

Im Augenblick haben Sie a und b als Zeiger auf char definiert, aber Ihre Funktion gibt einen Zeiger auf double zurück. Das ist harmlos, aber wahrscheinlich sinnlos und verschwenderisch. Was noch viel schlimmer ist, ist, dass Sie diese Doubles dann mit der "% d" -Konvertierung an printf weitergeben, also versucht man, die Ganzzahlen als Doppelwerte zu behandeln (Sie würden ein Doppel mit "% f" drucken). Das Ergebnis ist in diesem Fall ein nicht definiertes Verhalten.

Verwandte Themen