aksen |
» 2015-03-03 22:00:26 Jest jeszcze inne rozwiązanie. Zrobić to bez konwersji do int. sprintf( buffer, "%.0f", f ); //ważne: "%.0f" - tak zamienisz float na string z pominięciem miejsc po przecinku #include <stdio.h> #include <stdlib.h>
int main() { float f = 54.373657 * 1000000; char buffer[ 28 ]; sprintf( buffer, "%.0f", f ); printf( "%s\n", buffer ); system( "pause" ); return 0; }
|
|
4th_hokage Temat założony przez niniejszego użytkownika |
» 2015-03-03 22:41:30 #aksnet To nie jest rozwiązanie mojego problemu, no ja muszę mieć to po drodze w int, bo przesyłam tą zmienną między mikrokontrolerami. Droga tej zmiennej jest taka: GPS(float)->mikrokontroler_A(int)->mikrokontroler_B(char)->LCD Zauważyłem, że ten kod który umieściłem wyżej działa i wyświetla to co chcę do momentu gdy mnożę razy 100, dla mnożnika 1000 i więcej zaczynają się bzdury... Ale ponieważ komunikacja pomiędzy mikrokontrolerami pozwala mi na przesłanie 8 bitów w jednej ramce to nawet dobrze się składa. Zrobiłem takie coś: uint8_t tran[ 4 ]; fLatitude = nmea.getLatitude(); tran[ 3 ] = static_cast < int >( fLatitude ); fLatitude =( fLatitude - tran[ 3 ] ) * 100; tran[ 2 ] = static_cast < int >( fLatitude ); fLatitude =( fLatitude - tran[ 2 ] ) * 100; tran[ 1 ] = static_cast < int >( fLatitude ); fLatitude =( fLatitude - tran[ 1 ] ) * 100; tran[ 0 ] =( fLatitude );
Zapisuje mi to floata 54.373657, w tablicy uint8_t tran[4] = {57,36,37,54}. Wyślę te liczby w czterech ramkach danych i złoże w drugim mikrokontrolerze z powrotem w szerokość geograficzną. Okazało się to trudniejsze niż się spodziewałem i dalej nie wiem czemu tak się dzieje, ale jakoś sobie poradzę z tym co mam. |
|
aksen |
» 2015-03-03 23:01:05 najpewniej rację miała #Monika90 i masz 16 bitowy int -> 16 bitowy int to: −32 768 do +32 767 przemnożenie 54.373657 przez 1000 (lub więcej) wychodzi już poza zakres. Może twój kompilator obsługuje jakiś odpowiednik long int? Jakiego kompilatora używasz, jakiej wersji i pod jaki procesor? PS. Przy 16 bitowym int wychodzi podobny wynik jak u ciebie (-21223): (Dev C++) #include <stdio.h> #include <stdlib.h>
int main() { float f = 54.373657; char buffer[ 28 ]; short int i; i = static_cast < int >( f * 1000000 ); sprintf( buffer, "%d", i ); printf( "%s\n", buffer ); system( "pause" ); return 0; }
|
|
kynol |
» 2015-03-06 00:02:06 Uzyj zmiennej unsigned long long int i bedzie sie bujac, nie bedzie ci pokazywac smieci, pokazuje ci bledne dane, poniewaz ta wymnozona liczba przez 1000 wychodzi poza maksymalny zakres zmiennej int U mnie przy 32 bitowym int wynik i tak jest poprawny, zakladajac ze twoja wartosc bitowa inta jest mniejsza, skorzystaj z unsigned long long int i wszystko bedzie dzialac jak nalezy :) W ponizszym kodzie normalnie zamienilo mi liczbe float na liczbe int #include <iostream>
using namespace std;
int main() { float zmienna = 54.373657; unsigned long long int i = static_cast < unsigned long long int >( zmienna * 1000000 ); cout << i << endl; return 0; }
|
|
aksen |
» 2015-03-06 01:57:58 do #kynol nie czytasz tego co pisali poprzednicy i wymyślasz koło na nowo :) |
|
kynol |
» 2015-03-06 14:28:29 Czyli problem polega na wyswietleniu liczby float zamienionej na int w tablicy char? |
|
Monika90 |
» 2015-03-06 14:58:23 unsigned long long int i = static_cast < int >( zmienna * 1000000 );
|
To nic nie da, bo i tak rzutujesz do int. |
|
kynol |
» 2015-03-06 16:35:24 @up ops, moje niedopatrzenie :)
natomiast jesli ja mialbym liczbe float zamieniona na int zapisac do tablicy char to najpierw float zamienilbym na int, pozniej ta liczbe int zamienilbym na string, napisal funkcje ktora liczylaby znaki w tym stringu i jesli policzyloby dwa znaki to te dwa znaki przypisalbym do nowej tablicy stringow, po takim przypisaniu znakow do tablicy stringow, usuwalbym te dwa skopiowane znaki z glownego stringa i tak az do konca, w przypadku gdyby zostal juz tylko 1 znak w glownym stringu + znak (NULL) dodalbym je tak samo do tablicy stringow, pozniej ta tablice stringow zamienilbym na tablice intow, a pozniej ta tablice intow na tablice char :P
W tym tkwil problem ? |
|
1 « 2 » |