• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konwersja double to char C++

Object Storage Arubacloud
0 głosów
1,365 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez Mavimix Dyskutant (8,390 p.)
Jak przekonwertować zmienną double na zmienną char? Chcę wykonać obliczenia (z użyciem dobule) za pomocą programu na pc i wysłać je do mikrokontrolera (żeby wysłać dane muszę je mieć w char).
komentarz 14 sierpnia 2019 przez Patrycjerz Mędrzec (192,320 p.)
Konwersja w jakim sensie? Chodzi ci o stworzenie ciągu bajtów, które po transmisji można znowu połączyć w liczbę zmiennoprzecinkową, czy rzutowanie wartości do liczby całkowitej z utratą części ułamkowej?
komentarz 14 sierpnia 2019 przez Mavimix Dyskutant (8,390 p.)
O to żeby po transmisji znowu mieć double
komentarz 14 sierpnia 2019 przez j23 Mędrzec (194,920 p.)
Jeśli są to pojedyncze wartości, nie jakieś duże ilości, to przekazuj je w postaci tekstowej, bo sposób kodowania może się różnić i takie zwykłe przesłanie w postaci binarnej może nie zadziałać.
komentarz 14 sierpnia 2019 przez Maciej Złotorowicz Gaduła (4,230 p.)
edycja 14 sierpnia 2019 przez Maciej Złotorowicz
reinterpret_cast

wtedy

 

double D = 3.14;
const char* C = reinterpret_cast<const char*>(&D);
//rozmiar tablicy C to sizeof(D)

Jest to najbezpieczniejszy, najwygodniejszy i nowoczesny sposób
Więcej info https://en.cppreference.com/w/cpp/language/reinterpret_cast
ew jak nie działa tak jak sobie życzysz sprawdź https://en.cppreference.com/w/cpp/language/static_cast

komentarz 14 sierpnia 2019 przez Mavimix Dyskutant (8,390 p.)
Po próbie kompilacji pisze mi, że nie zadeklarowano funkcji reinterpret_cast
komentarz 14 sierpnia 2019 przez Maciej Złotorowicz Gaduła (4,230 p.)
żeby tego użyć musisz mieć conajmniej c++11, umiesz zmienić wersje C++? W ustawieniach kompilatora jest.
komentarz 14 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

reinterpret_cast to nie jest feature z C++11.

komentarz 14 sierpnia 2019 przez Maciej Złotorowicz Gaduła (4,230 p.)
To z czego?
komentarz 14 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
Nic, to po prostu wyrażenie C++.
komentarz 14 sierpnia 2019 przez Maciej Złotorowicz Gaduła (4,230 p.)
No nie wiedziałem. Masz mnie.
komentarz 14 sierpnia 2019 przez Mavimix Dyskutant (8,390 p.)
Niestety wciąż to nie działa
komentarz 14 sierpnia 2019 przez j23 Mędrzec (194,920 p.)

Ale co nie działa? reinterpret_cast czy przesłana binarnie wartość double?

2 odpowiedzi

0 głosów
odpowiedź 14 sierpnia 2019 przez JAKUBW Nałogowiec (33,470 p.)

No ogólnie double na char to troszkę nie jest możliwe, bo double ma 8 bajtów a char tylko 1, ale myślę, że na tablicę charów będzię OK. Przykładowy kod:

// Example program
#include <iostream>

int main()
{
    double myValue = 12.3023;
    std::cout << "Jako double przed konwersja: " << myValue << std::endl;
    
    char buffer[sizeof(double)];
    double* temp1 = (double*)&buffer;
    *temp1 = myValue;
    // tutaj możesz wysłać buffer gdzieś
    
    // tutaj mamy tablicę znaków z zakodowanym doublem
    std::cout << "Jako bajty (DEC): ";
    for (std::size_t i = 0; i < sizeof(double); ++i)
        std::cout << (int) buffer[i] << ' ';
    std::cout << std::endl;
    
    // dekodowanie na double
    double* temp2 = (double*)&buffer;
    double decodedValue = *temp2;
    
    std::cout << "Jako double po zdekodowaniu: " << decodedValue << std::endl;
}

Działający przykład: cpp.sh/64e2w

Można to zrobić krócej, ale pokazują się ostrzeżenia, można też zastąpić casty w stylu C na reinterpret_cast.

0 głosów
odpowiedź 14 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)

Wystarczy proste rzutowanie.

void wyslij(const char* bufor, int dlugosc) {
    // kod wysyłający dane do kontrolera
}

void funkcja(double liczba) {
    double * wskaznik_double = &liczba;
    char * wskaznik_char = (char*)wskaznik_double;
    wyslij(wskaznik_char, sizeof(double));
}
 

Upewnij się tylko, że kontroler ma tą samą kolejność bitów. Jeżeli nie to będziesz musiał wysłać dane w odwrotnej kolejności.
 

komentarz 14 sierpnia 2019 przez Mavimix Dyskutant (8,390 p.)
Tego już próbowałem, niestety nie działa
komentarz 14 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
To znaczy co się dzieje?
Najlepiej zacznij od początku.
Jaki mikrokontroler programujesz?
W jaki sposób się z nim komunikujesz?
W jaki sposób sprawdzasz czy działa?
komentarz 19 sierpnia 2019 przez Mavimix Dyskutant (8,390 p.)
1. ATmega8

2. RS232 (przejściówka PL2303)

3. Robię zmienną dobuble, próbuje ją konwertować, a wynik wypisać na pc
komentarz 19 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
Wydaje mi się, że zmienna double na atmega8 ma długość 4 bajtów (informacja z internetu).
W takim razie może uda ci się ją wczytać do floata na komputerze. Nie wiem czy float i double na atmega mają taką samą mantisę. Warto spróbować.
Jeżeli ciągle będziesz dostawał zły wynik to wygeneruj kilka liczb napisz jakie dane otrzymałeś na komputerze (w hex bajt po bajcie).

Podobne pytania

0 głosów
0 odpowiedzi 300 wizyt
0 głosów
2 odpowiedzi 1,425 wizyt
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 8 stycznia 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...