2011-07-25 11 views
5

Mam funkcję C, która zwraca typ float.Zwracanie wartości 1.0f daje mi 1065353216

Gdy funkcja zwraca 1.0f, odbiornik widzi 1065353216, a nie 1.0.

Co mam na myśli to, co następuje:

float Function() 
{ 
    return 1.0f; 
} 

float value; 
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value); 

Wyświetla:

1065353216 

Ale nie:

1.0 
+3

Czy jesteś pewien, że jest to kod jesteś kompilacji/testowanie? Podaj więcej kontekstu. –

+4

Co ciekawe, 1065353216 jest reprezentacją całkowitą 1,0 (pojedyncza precyzja IEEE). Może Twój kompilator lub standardowa biblioteka ma błąd, gdzie interpretuje% f jak% d? – GameZelda

+1

Wygląda na to, że '% d' został magicznie zastąpiony przez'% f', więc nic nie wygląda tutaj ... – Simon

Odpowiedz

15

zdefiniować swoją funkcję w jednym pliku źródłowym i wywołać ją z innego nie zapewniając podpis czyni kompilator myśleć, że podpis jest int Function(), co prowadzi do dziwnych rezultatów.

Należy dodać podpis: float Function(); w pliku, w którym znajduje się printf.

Na przykład:

float Function(); 
float value; 
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value); 
+1

Niesamowite, nie pomyślałbym o czymś takim ... Wydaje się, że to dobre domysły :) – Simon

+2

Albo możesz użyć pliku nagłówkowego. –

+0

@James jest ten sam problem, jeśli myślisz o tym: 'Funkcja' zwraca to, co jego zdaniem jest' 1.0f' w jakimś rejestrze (AX, jeśli dobrze pamiętam), wtedy program główny myśli, że jest tam 'int'. Efekt jest podobny do tego, gdy przechodzisz od 'float' do' printf' z ciągiem formatującym "% d". – unkulunkulu

4

dwukrotnie sprawdzić swoją pracę, jak implementacja jest poprawna.

Dowody: http://codepad.org/QlHLEXPl

+6

... "podwójne" to sprawdzić? : D –

+0

.. Naprawdę! Mówiąc bardziej poważnie, niektóre kompilatory/linkery/libs/cokolwiek zezwalają na kompilacje z printf/scanf (i ich warianty), obsługa FP wyłączona, (przydatna na osadzonym h/w z ograniczoną pamięcią RAM). Nie wiem, co się stanie, jeśli taka kompilacja z FP wyłącza połączenia printf z formatem% f float? –

0

Moja kolej odgadnąć problemu:

albo jesteś:

  • edycji kodu źródłowego bez zapisywania go
  • edycji jednego pliku, ale kompilacji i uruchamianie kolejnej edycji i kompilacji jednego pliku ale uruchomiony kolejny jeden
  • robi coś jeszcze bardziej skomplikowany, ale podobną :)
Powiązane problemy