|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||
Почему std::cout выводит только 1 символ?23.12.2019, 12:00. Показов 4643. Ответов 27
Метки нет (Все метки)
Привет
![]() Почему выводит только 1 символ?
0
|
||||||
| 23.12.2019, 12:00 | |
|
Ответы с готовыми решениями:
27
Почему gcc ругается на std::cout? |
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,223
|
||
| 23.12.2019, 12:05 | ||
Сообщение было отмечено hoggy как решение
Решениеconst char *. Ваш указатель типа volatile char* невозможно преобразовать к const char * - из-за volatile. Поэтому оператор вывода строки здесь неприменим. Вместо него здесь срабатывает другой подходящий оператор: оператор для вывода значений типа bool.Так что у вас на самом деле нет никакого "выводит только 1 символ". Ни одного из ваших символов этот код не выводит вообще. Он выводит значение true, которое по умолчанию выводится как 1. Вы можете поменять строку на "abc", но выводиться все равно будет 1.
5
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 12:35 | |
|
TheCalligrapher,
А какая связь между volatile и bool? На каком основании происходит подобное преобразование?
0
|
|
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||
| 23.12.2019, 13:03 [ТС] | |||||||
0
|
|||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 23.12.2019, 15:03 | ||
char volatile * связь не с bool, а с тем, что стандартная перегрузка для char const * не подходит, потому что cv-квалификаторы не могут сниматься неявно.http://eel.is/c++draft/conv.bool#1
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 15:13 | |
|
DrOffset,
Спасибо, я почитал об это на SO, но до конца не понял почему это так. В bool можно, а в const char* нельзя, почему? Нашёл информацию что чтение из адреса объектов которые определены как volatile через указатель который не является volatile это UB. Вот думаю может по этой причине неявный каст не проходит... Если причина в этом, то возникает ещё один вопрос, почему подобное чтение должно приводить к UB?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 23.12.2019, 15:16 | ||
const char * нельзя в char *, volatile, как и const, неявно не снимаются.
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 15:28 | |
|
DrOffset,
Ага, это по правилам так. только вот логика этого правила к сожалению мне не понятна ![]() Когда преобразование из const char* в char* тут логика понятна т.к исходный объект менять нельзя (например, в случае строкового литерала), это ок. Но какие проблемы может создать преобразование указателя с квалификатором volatile в указатель подобного типа но без volatile?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 23.12.2019, 15:35 | ||
|
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 23.12.2019, 15:48 | ||
Добавлено через 13 минут DrOffset, Спасибо что старался, но до меня все равно не дошло )) По сути volatile это барьер для оптимизации, и если передать этот адрес в оператор вывода для чтения как это происходит для обычных строк то проблем быть не должно, контекст ведь поменяется. Там где мы сформировали volatile переменную будет барьер, а в операторе вывода просто вывод данных (тоже проблем нет). А если бы в операторе была бы запись, то полагаю тоже не было бы проблем. Просто в барьерном контексте считались бы обновлённые данные. Где и что тут может нарушиться я не понял ;( надеюсь смог передать свою мысль
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||||||
| 23.12.2019, 16:22 | |||||||||||||
|
Добавлено через 15 минут ![]() volatile - это в первую очередь отказ компилятора от любых предположений насчет этой памяти. Одно и таких предположений - это неизменность извне, как следствие - кеширование: Вот пример:
А эта функция:
Понятно, что сам по себе этот код не имеет особого смысла, однако он демонстрирует разницу и в некоторых задачах эта разница существенна (т.е. когда нам нужно каждый раз получать самое актуальное значение, которое есть по указателю).
2
|
|||||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 16:41 | |
|
DrOffset,
Думаю я понял. Во втором случае значение по адресу p внутри функции mul может быть прочитано всего 1 раз несмотря на то что у нас два чтения. но где то в другом потоке значение p может быть изменено и по идее второе чтение должно дать результат отличный от первого чтения. Но второго чтения не будет ибо данные закешированы. О таком кейсе я не подумал (в голове крутился пример только с одним чтением поэтому я не видел проблем). Кстати раз уж разговор о volatile, скажи плиз на что он влияет когда указывается для метода (там где noexcept)? Аргументы/поля/локальные переменные/что-то другое?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 23.12.2019, 16:43 | |
|
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 16:53 | |
|
DrOffset,
Спасибо. А какой в этом смысл? Поля могут быть закешированы как в предыдущем примере? И говоря про this имеется ввиду обращение к полям с явным использованием this или для обращений без явного использования this volatile тоже будет действовать?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 23.12.2019, 16:59 | |
|
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 17:08 | |
|
DrOffset,
Спасибо. Если ты ещё поведаешь суть const volatile вместе то было бы круто ) Один говорит что данные могут быть изменены а другой что не могут быть изменены. Я нахожу это противоречивым ))
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 23.12.2019, 17:14 | ||
|
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 17:29 | |
|
DrOffset,
Интересно. Но разве можно поменять значения вне программы? Если да, то как (хотя бы в общих чертах)? Полагаю это может пригодится в каких то implementation-defined фичах
0
|
|
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||||
| 23.12.2019, 17:31 [ТС] | ||||||||
|
Вы привели пример ситуации, когда ни волатильность, ни кэширование никак не влияют ни на логику работы самой функции, ни на итоговую логику вообще всей остальной программы. Можно просто считать, что компилятор сумел улучшить код функции так хорошо, что она начала работать со скоростью света, и значения попросту не успевают изменяться.
0
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.12.2019, 17:52 | |
|
eva2326,
По факту если на момент второго чтения значение на которое указывает p будет другим (отличным от первого чтения), то этот код не даст корректный результат (без volatile) А мой вопрос DrOffset у был немного другой ) Добавлено через 16 минут DrOffset, Нашёл пример. const volatile вместе может использоваться например для доступа к разделяемой памяти в режиме чтения При этом для других процессов эта разделяемая память может быть вполне модифицируемой
0
|
|
| 23.12.2019, 17:52 | |
|
Помогаю со студенческими работами здесь
20
Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Cout 16х выводит почему?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|