Nie wiem czego używasz ale vscode ma opcję autoformatowania kodu. Jak masz mieć taki bajzel to już lepiej używać automatu. ;d
Budowałem na GCC 6.5 od Bebbo (m68k-amigaos-gcc -mcrt=nix20 -O3 Simple3d.c -o simple3d -lm), parę warningów było. Najpierw mi w ogóle floaty w sprintf nie chciały działać, ale jak dolinkowąłem -lm to ruszyło.
Zrobiłem sobie takie coś i wyświetliłem na ekran:
sprintf(szBfr, "sin(0, 90, 180, 270, 360) = %.1f %.1f %.1f %.1f %.1f", sin(0), sin(PI/2), sin(PI), sin(3*PI/2), sin(2*PI));
I pokazał bzdury. Coś mnie tknęło i zrobiłem tak:
sprintf(szBfr, "sin(0, 90, 180, 270, 360) = %.1f %.1f %.1f %.1f %.1f", sinf(0), sinf(PI/2), sinf(PI), sinf(3*PI/2), sinf(2*PI));
Zamarudził że nie ma math.h i poszło. Pewnie by ruszyło z pierwszym wariantem gdybym zrobił %lf. O co chodzi:
- funkcje sin(), cos() operują na double, zwracają tak też wynik
- funkcja sprintf() i inne tego typu korzystają z mechanizmu C va_args, który nie przechowuje informacji o typach.
- wrzucając do sprintf wartości typu double wrzucasz po prostu ich bajty na stos
- funkcje printf-podobne parsując format string dedukują typ danych i odpowiednio czytają bajty ze stosu
- wrzucając %f mówisz funkcji printf że masz na stosie floata, no to czytał floata. Tylko że na stosie miałeś double'a, więc czytał niepoprawnie.
- rozwiązaniem jest użycie funkcji które operują na floatach (potrzebujesz math.h) albo printowanie jako double (%lf)
dodatkowo, warto nie ignorować warningów w kodzie:
- struct Rastport zamień sobie na RastPort
- nie zwracaj NULL w funkcji która zwraca LONG - NULL jest do wskaźników
- czym budujesz że znajduje funkcję itoa? musiałem sobie na szybko przerobić wywołania pod sprintf
- polecam przy Text() nie polegać na stałej długości stringa tylko wstawiać wartość faktyczną. sprintf() zwraca liczbę wpisanych bajtów do bufora, itoa() chyba nie, ale możesz sobie zawsze z zachowaniem licencji zwędzić
stringDecimalFromULong(), która już będzie takie coś zwracać.
Nie za bardzo chciało mi się dalej wnikać w kod - daj znać czy to był u Ciebie jedyny problem, czy jeszcze coś jest nie tak. ;)
Ostatnia aktualizacja: 27.01.2021 13:32:58 przez teh_KaiN