2010-01-22 11 views
5

¿Puedo hacer algo como esto? esto funcionara?¿Puedo devolver el doble * en la función?

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

y luego en principal:

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

a y b son vectores con el mismo número de elementos, n es el número de elementos.

+0

¿Puedo hacer esto también en main? Asignar la matriz: 'double * resoult = vec_subtraction (a, b, n);' – Devel

+0

Para el registro, la forma habitual de hacer cálculos vectorizados como esto es pasar un puntero a donde se almacenan los resultados (es decir, ' void vec_subtraction (char * a, char * b, doble * c, int n); '). Esto permite que el que llama reutilice los búferes y, a veces, use el mismo búfer tanto para el resultado como para una entrada. Tuvimos un proyecto que tuvo fallas extrañas porque 'malloc()' era demasiado no determinista en el tiempo de ejecución. –

Respuesta

11

Sí, puede, pero necesita asignar memoria para result en alguna parte.

Básicamente, puede asignar la memoria en el interior vec_subtraction o en el exterior vec_subtraction, si asigna fuera, puede hacerlo estática o dinámicamente.

Si usted va a destinar el interior:

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

y en el principal:

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

No se olvide de free el resultado de la llamada a vec_subtraction algún tiempo después.


Si usted va a destinar fuera de lo necesario para pasar un puntero a la memoria:

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

en el principal:

// 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

También 'doble vec [n];' en C99 y posterior. –

2

Usted puede, pero usted don' Parece que está asignando cualquier memoria para el vector de resultados.

0

Funcionaría si asigna ninguna memoria para los resultados:

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

Y ahora se convierte en la responsabilidad de la persona que llama para liberar esa memoria.

La persona que llama también puede pasar la matriz doble para completar los resultados, en cuyo caso puede optar por no utilizar una matriz asignada dinámicamente.

3

No es así. Debe asignar memoria en la pila antes de llamar a la función o en el montón desde dentro de la función.

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

    ... 

    return result; 
} 

Luego, el resto funcionaría. Sin embargo, debes recordar liberar la memoria.

La otra opción es:

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


     ... 

} 

Luego, en principal:

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

que sin duda puede devolver un doble * de una función. Solo asegúrate de que el puntero aún apunta a un objeto válido. p.ej.no haga esto:

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. 
} 

Esto estaría bien aunque:

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

En su función vec_subtraction que tienen una variable sin inicializar en el doble resultado *. Si desea que esto le devuelva algo significativo, debe asignar memoria a la matriz, p.

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

Entonces usted tiene que recordar para liberarla cuando haya terminado:

free(vec); 

Sin embargo, la buena práctica (al menos cuando yo era un C-codificador) fue a alloc la memoria y la memoria libre en el mismo ámbito, donde sea posible, por supuesto. Entonces realmente deberías pasar tu matriz a tu función vec_subtraction. Tendrá que cambiar la firma de su función para:

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

llamar así:

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

excusa mi pseudo-c, pero esperamos que pueda hacerse una idea.

¡Buena suerte!

1

Puede hacer algo como este, siempre y cuando no sea demasiado se le parezca. Específicamente, necesita asegurarse de que está manejando las vidas de toda la memoria razonablemente.

Muchos otros han señalado que necesita asignar espacio para su resultado, por lo que no entraré en esa parte. Sin embargo, hay algunos otros puntos en los que pensar.

En este momento, ha definido a y b como punteros a char, pero está haciendo que su función devuelva un puntero al doble. Eso es inofensivo, pero probablemente inútil y derrochador. Lo que es peor es que está pasando esos dobles al printf con la conversión "% d", por lo que trata de tratar como enteros en lugar de dobles (imprimiría un doble con "% f"). El resultado en este caso es un comportamiento indefinido.

Cuestiones relacionadas