1

Тема: Приведення типів

Як змінну типу double перетворити або записати в масив символів(статичний чи динамічний не має значення)? Я чув про оператор reinterpret_cast, але я не знаю як він працює і чи взагалі його можна використовувати в моєму випадку. Підкажіть хто знає як вирішити цю проблему.

2

Re: Приведення типів

А можете пояснити, що саме ви маєте на увазі під "перетворити у масив символів"? От є число double 0.1. Що має бути в масиві символів? Символи "0.1"? Групи по 8 бітів з бітового представлення числа?
https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/IEEE_754_Double_Floating_Point_Format.svg/2880px-IEEE_754_Double_Floating_Point_Format.svg.png
Щось інше?

3

Re: Приведення типів

Так. Мають бути символи "0.1"

4

Re: Приведення типів

Знаю функцію itoa, але вона переводить тільки цілі числа

5

Re: Приведення типів

Використовуйте sprintf. Або stringstream, якщо це C++.

Подякували: Mirek70981

6 Востаннє редагувалося wander (26.11.2020 00:59:21)

Re: Приведення типів

std::snprintf
або
std::to_string
Але якщо саме в plain char array, то вам більше перший варіант.
А, і так, є ще моднявий std::to_chars, який приїхав разом з С++17, але він ще досі в GCC/Clang маркований як Partially done.

Подякували: koala, leofun012

7

Re: Приведення типів

Якщо я напишу так:

double i = 49.1;
char zone[50];
sprintf(zone, "%f\n", i);
cout << zone;

То мені тоді виведе 49.100000. А треба щоб вивело 49.1

8 Востаннє редагувалося wander (26.11.2020 01:15:01)

Re: Приведення типів

double value = 4442.1;
int size = std::snprintf(nullptr, 0, "%.1f", value);  // взагалі, було б ще добре провіряти чи size не <0
                                                      // але то вже таке ...
std::vector<char> buffer(size + 1);
std::snprintf(buffer.data(), buffer.size(), "%.1f", value);
std::cout << size << " " << buffer.data();
Подякували: Mirek70981

9 Востаннє редагувалося Mirek7098 (26.11.2020 01:37:54)

Re: Приведення типів

Мені контейнери в даній програмі використовувати не можна, тому прошу вас написати цей код використовуючи звичайний масив

10 Востаннє редагувалося koala (26.11.2020 01:43:34)

Re: Приведення типів

Mirek7098 написав:

А треба щоб вивело 49.1

Mirek7098 написав:

Мені контейнери в даній програмі використовувати не можна

Ні, не треба. Принаймні, ви досі ані слова не написали про те, що вам треба якийсь конкретний формат, окрім того, що текстовий. Гра "відгадайте, що мені треба, а я вам скажу, воно це чи ні", вам, може, й цікава, але довго з вами в це тут не гратимуть. Повністю напишіть завдання - тоді, можливо, вам допоможуть.

Подякували: leofun011

11

Re: Приведення типів

Мені потрібно записати число типу double в масив сhar zona[50]

12 Востаннє редагувалося Mirek7098 (26.11.2020 01:52:22)

Re: Приведення типів

А якщо конкретніше, то ц е останнє що мені потрібно доробити в моїй прозі з 495 рядків коду. А якщо ще конкретніше, то я перевантажую оператор +, який додає об'єкти мого класу, в якому останні 2 поля ініціалізовані як сішний масив символів, але користувачем вводяться числа, які я в функції перегрузки маю перевести в double, знайти їх суму, а потім цю суму знову перевести в сішний масив символів і т.д.

13 Востаннє редагувалося wander (26.11.2020 01:53:34)

Re: Приведення типів

Mirek7098 написав:

Мені контейнери в даній програмі використовувати не можна, тому прошу вас написати цей код використовуючи звичайний масив

Що означає не можна? Чому?..
Ем, гаразд, якщо у вас є якісь вимоги, то озвучуйте їх, будь ласка, одразу. Це не ми з вас маємо витягувати, нам це не потрібно.
Зрештою, схоже, якісь базові навички С++ у вас є, то у чому проблема вам самим переробити мій код?
Єдина поправка, що ось так

int size = std::snprintf(nullptr, 0, "%.1f", value);  // взагалі, було б ще добре провіряти чи size не <0
                                                      // але то вже таке ...
char buffer[size]; // << ill-formed

не робіть, це недопустимо в С++.

14

Re: Приведення типів

wander написав:
Mirek7098 написав:

Мені контейнери в даній програмі використовувати не можна, тому прошу вас написати цей код використовуючи звичайний масив

Що означає не можна? Чому?..
Ем, гаразд, якщо у вас є якісь вимоги, то озвучуйте їх, будь ласка, одразу. Це не ми з вас маємо витягувати, нам це не потрібно.
Зрештою, схоже, якісь базові навички С++ у вас є, то у чому проблема вам самим переробити мій код?
Єдина поправка, що ось так

int size = std::snprintf(nullptr, 0, "%.1f", value);  // взагалі, було б ще добре провіряти чи size не <0
                                                      // але то вже таке ...
char buffer[size]; // << ill-formed

не робіть, це недопустимо в С++.

Я не маю жодних вимог ні до кого з користувачів цього форуму, лише прохання, а щодо інформації то вибачте що не надав її вчасно. Для довідки: я ніколи не використовував ні sprintf, ні scanf, ні printf і взагалі не розумію що "%.1f" це таке.

15 Востаннє редагувалося koala (26.11.2020 02:00:19)

Re: Приведення типів

Я не бачу за вашим описом, чому вам не підходить "49.100000". Як на мене, ідеально підходить. У double перетворюється, а більше ні для чого воно вам за описом не потрібно.
Ви можете сформулювати, від початку і до кінця, ваше питання, щоб було вказано обмеження? Бо так ви нариваєтеся на чергову відповідь, яка вам знову чомусь не підійде - а ми нариваємося на ваше "ні, там ще одна умова". І я краще не даватиму вам порад, поки ви цього не зробите.

16

Re: Приведення типів

koala написав:

Я не бачу за вашим описом, чому вам не підходить "49.100000". Як на мене, ідеально підходить.
Ви можете сформулювати, від початку і до кінця, ваше питання?

Ну я ці дані бути виводити в таблиці, під полем "площа землі" і наврядчи користувачу сподобаються лишні 5 нулів після коми

17 Востаннє редагувалося Mirek7098 (26.11.2020 02:06:45)

Re: Приведення типів

double i = 49.1;
char zone[50];
sprintf(zone, "%f\n", i);
cout << zone;

Мені просто треба щоби цей кусок коду виводив мені 49.1, а саме щоби виводився сішний масив символів в який я записав значення змінної "i" типу даних double

18 Востаннє редагувалося wander (26.11.2020 02:04:47)

Re: Приведення типів

Mirek7098 написав:

Я не маю жодних вимог ні до кого з користувачів цього форуму, лише прохання

Я про вимоги вашої "проблеми". Ви ж сказали контейнери не можна, отже є якісь вимоги, очевидно, до завдання, яке ви виконуєте.

Mirek7098 написав:

і взагалі не розумію що "%.1f" це таке

За моїм першим посиланням є відповіді на більшість ваших питань, тре лиш відкрити та почитати.

19

Re: Приведення типів

Я гадаю, що ваш метод додавання - з перетворенням туди-сюди і всіма помилками при округленні - йому сподобається ще менше.

20

Re: Приведення типів

Factory operator+(const Factory&a, const Factory&b)
{   
    char nname[100], owner[100], zone[100], robots[100];
    strcat(nname, a.name);
    strcat(nname, b.name);
    strcat(owner, a.ownership);
    strcat(owner, b.ownership);
    double c = atof(a.workers);
    double d = atof(b.workers);   
    double i = c + d;
    sprintf(zone, "%i\n", i);
    return Factory(nname, owner, zone, robots);
}