2011-06-03 15 views
5

Tengo esta función:Función funciona bien, pero devuelve la basura

float calc_nnc(struct ImageWindow *window1, struct ImageWindow *window2) { 
    /* More code */ 
    double numerator = (double) sum_a_x_b; 
    double divisor = (sqrt(sum_a) * sqrt(sum_b)); 
    double result = numerator/divisor; 
    float resultf = (float) result; 

    printf("numerator: %lf, divisor: %lf, result: %lf, resultf: %f\n", 
     numerator, divisor, result, resultf); 

    return resultf; 
} 

Los printf imprime los resultados que cabe esperar para ver:

axb = 1383, a = 1776, b = 4959
numerador: 1383.000000, divisor: 2967.690011, resultado: 0.466019, resultf: 0,466019

Sin embargo, cuando trato de imprimir el resultado de calc_nnc en otra función:

float nnc_likeness; 
unsigned int x, y; 

for (y = 0; y <= y_max; y++) { 
    for (x = 0; x <= x_max; x++) { 
     set_image_window(&window_big, big, x, y, width, height); 
     nnc_likeness = calc_nnc(&window_small, &window_big); 
     printf("likeness: %f\n", nnc_likeness); 
    } 
} 

recibo de basura:

semejanza; 1055824384,000000

Es decir, veo a los valores correctos calc_nnc es la computación, pero justo después de que veo un valor dañado para nnc_likeness.

¿Alguna idea de lo que está pasando? ¡Gracias!

+0

¿Estás seguro de que tienes el prototipo correcto para 'calc_nnc' en el contexto donde lo llamas? Podría ser que su compilador esté asumiendo un tipo de retorno de 'int' y eso está volviendo loco al sistema. ¿Tienes todas tus advertencias habilitadas? –

+1

De hecho, se ve exactamente como eso es lo que está sucediendo, escribiendo una respuesta ahora. –

+0

El prototipo en el encabezado es el mismo. Puse '-Wall' y obtuvo una idea interesante. –

Respuesta

8

Probablemente no tenga un prototipo para calc_nnc en el contexto donde lo llame, por lo que su compilador cree que su tipo de devolución es int (según la especificación). Un programa de prueba rápida:

#include <stdio.h> 

union u { 
    float f; 
    int i; 
}; 

int main(int argc, char **argv) 
{ 
    union u a; 
    union u b; 

    a.f = 0.466019; 
    b.i = 1055824384; 

    printf("%d %f\n", a.i, a.f); 
    printf("%d %f\n", b.i, b.f); 

    return 0; 
} 

da este resultado:

1055824395 0.466019 
1055824384 0.466019 

Incluir un prototipo correcto que le dice a su código que vuelve calc_nncfloat y usted estará listo. Activar más advertencias detectará este problema también.

+1

Sí, gracias Carl! Fue exactamente eso. Me olvidé de incluir el archivo de encabezado. Soy bastante nuevo para C y este me tiene. Gracias por tu muy buena explicación. –

+1

@Albus: no hay problema. ¡Buena suerte! –

Cuestiones relacionadas