116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|||||||||||
1 | |||||||||||
Шаблонная функция вывода переменной в строку17.04.2016, 13:20. Показов 2084. Ответов 15
Метки нет Все метки)
(
можно ли оживить конструкцию:
Кликните здесь для просмотра всего текста
тут, видимо проблема вызвана функцией sprintf(). она не желает получать переменную заранее не определенного типа. могу переписать шаблонную функцию: Кликните здесь для просмотра всего текста
но очень не хочется сталкиваться с геморроем IEEE 754 и несколько перегруженных функций делать тоже не хочется (хотя гораздо быстрее и проще) есть ли шанс?
0
|
|
17.04.2016, 13:20 | |
Ответы с готовыми решениями:
15
Шаблонная функция вывода для любого stl контейнера Функция для вывода в строку Вывод переменной из php в строку ввода/вывода на форме Html Шаблонная функция |
Модератор
![]() 12626 / 10124 / 6097
Регистрация: 18.12.2011
Сообщений: 27,157
|
||||||
17.04.2016, 13:46 | 2 | |||||
![]() Решение
Что-то я не пойму, зачем городить шаблонную функцию, если есть потоковый вывод в строку
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 14:03 [ТС] | 3 |
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
|
17.04.2016, 14:06 | 4 |
Проблема здесь в том, что ты память под строку, которую отдаешь sprintf для записи, не выделил. У тебя просто указатель, причем мусорный.
UB же. Чтобы правильно выделять память под строковое представление числа можно определять количество десятичных разрядов в числе с помощью std::numeric_limits<T>::digits10 + 2-4 сивола под + ,- ,. и \0 . Указатель на память локального массива возвращать тоже нельзя, а динамически распределенная память будет нуждаться во внешнем удалении. Используй std::string. А вообще конечно этот код разве что только для экспериментов сгодится.
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 14:17 [ТС] | 5 |
об этом я тоже думал, поэтому выделял и все равно не помогло.
Добавлено через 1 минуту это и были эксперименты
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
||||||
17.04.2016, 14:19 | 6 | |||||
Очевидно как-то не так выделял.
Кликните здесь для просмотра всего текста
http://rextester.com/YNUV10755
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 14:19 [ТС] | 7 |
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
|
17.04.2016, 14:30 | 8 |
Serg_o_Grey, В том коде все равно не все гладко.
Нужно заменить, sprintf на snprintf для контроля выхода за границы, добавить default: (поведение по-умолчанию) в switch и для неучтенных типов. Еще нужно учитывать, что этот код непортируемый, т.к. завязан на реализацию type_info в Visual Studio. Проблемы при переходе на x64 тоже будут наблюдаться, т.к. в printf необходимо будет скорректировать параметры форматирования для некоторых типов, а этого сейчас нет. Правильная реализация разрастется очень сильно. В общем, я тебе по технической части подсказал, но вообще лучше этот код не использовать.
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 14:36 [ТС] | 9 |
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
|
17.04.2016, 14:38 | 10 |
Я про массив на стеке.
Ты же понимаешь, что он "помрет" по выходу из функции?
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 14:57 [ТС] | 11 |
помрет не массив а указатель на память, который я спас выведя его из функции.
единственный вопрос, не перезапишет ли какая-нибудь другая функция информацию (или часть информации) в этом массиве
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
|
17.04.2016, 15:03 | 12 |
С точки зрения языка помрет именно массив.
Если, допустим, это массив каких-то объектов класса, то у них у всех будут вызваны деструкторы, а это формальная смерть объекта. У char конечно никаких деструкторов нет, но с точки зрения объектов они уже перестают существовать все равно. Другое дело, что память для объектов некоторое время еще будет доступна в нетронутом виде, пока кто-нибудь не воспользуется ей. Но обращаться к ней через указатель (или, допустим, ссылку), который ты "спас", ты не имеешь права.
1
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
|
17.04.2016, 15:08 [ТС] | 13 |
так что, мне в функцию указатель на внешний участок памяти передавать нужно, чтобы на этот участок информация записывалась?
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
|
17.04.2016, 15:26 | 14 |
Да, это классический подход в С: передавать указатель на внешний буфер и его размер.
Но в целом конечно все зависит от ситуации. В некоторых случаях могут быть приемлемы и другие способы, например возвращать динамически аллоцированный буфер или использование статической переменной.
0
|
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
|
||||||
17.04.2016, 16:21 [ТС] | 15 | |||||
на форуме видел уже кучу примеров, типа:
Добавлено через 4 минуты теперь переучиваться нужно DrOffset, спасибо за своевременную "затрещину" Добавлено через 41 минуту DrOffset, еще вопрос я передаю в функцию "мусорный"указатель (char *msg). внутри функции определяю необходимый размер, выделяю память для этого указателя, записываю туда все что хотел и завершаю выполнение функции и работаю с полученным массивом такой порядок допустим? Добавлено через 4 минуты а не, все разобрался. не допустим. стек ведь
0
|
16466 / 8966 / 2198
Регистрация: 30.01.2014
Сообщений: 15,567
|
||||||
17.04.2016, 17:26 | 16 | |||||
![]() Решение
Да. Конструктор копии класса std::string следит за этим.
Массивы же по значению не копируются. Т.е. из функции можно вернуть только указатель\ссылку на массив, и, в случае если массив локальный, это приведет к некорректному доступу к уже "мертвой" памяти. Для того, чтобы реализовать разные стратегии копирования используют владеющие классы (например std::string владеет свои внутренним буфером для строки и следит за тем, чтобы он корректно копировался) или какие-нибудь обертки. Например, для обычных массивов можно использовать обертку в виде структуры. Сейчас это есть в стандарте, называется std::array. С ним код выше мог бы выглядеть так:
1
|
17.04.2016, 17:26 | |
Помогаю со студенческими работами здесь
16
Шаблонная функция Шаблонная функция Шаблонная функция Шаблонная функция Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |