Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Господа! Что такого криминального в такой конструкции: Код: plaintext 1. 2. Строка просто обрезается! Почему?! При этом: Код: plaintext 1. 2. 3. - всё нормально. Мистико? P.S. Builder 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 01:01 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйP.S. Builder 6. Слишком новая версия, ещё не успели баги исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 02:04 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, почитай про динамическое выделение памяти и все из рода "Мистико" уйдут сами собой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 06:46 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), тут же нету динамического выделения памяти в первом случае берётся указатель на родную строку во втором случае сначала строка копируется в новый объект, потом берётся указатель с неё. странно, что компилятор не ругается на char*, должен хотеть const char*, иначе ub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 08:02 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Предположу, что Edit1->Text возвращает временный объект (удаляется в конце выражения, т.е. встретив ";"). Тогда во втором случае он сохраняется в str, а в первом удаляется. Поэтому во втором случае ch указывает на память объекта str, а в первом на память удаленного объекта, т.е. на случайную область памяти. То, что там "Edit" - совпадение. Обрезаться строке не с чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 10:21 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйГоспода! Что такого криминального в такой конструкции: Код: plaintext 1. 2. Строка просто обрезается! Почему?! При этом: Код: plaintext 1. 2. 3. - всё нормально. Мистико? P.S. Builder 6. понятие точки следования тебе знакомо? я не уверен, что дело именно в этом, но по крайней мере может быть в ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 10:23 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, Edit1->Text.c_str(); Здесь выражение Edit1->Text возвращает объект AnsiString. Этот объект временный. char *ch = Edit1->Text.c_str(); Тут от него берется указатель на некие его внутренние потроха. После выполнения оператора присваивания char *ch = ... этот временный объект не используется, char *ch указывает на потроха мусора. ShowMessage(ch); Тут используется этот самый указатель на северо-юг. Что тут криминального - судить автору, смотря чего он считает правильным, но компилятор исполняет то что ему предписано исполнить. char* ch это не строка)))), это указатель на саму строку )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 10:27 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
И вправду. Долбаные проперти. Код: plaintext 1. 2. 3. надо так Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 12:37 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный Код: plaintext 1. 2. 3. - всё нормально. Формально говоря, это тоже ненормально, потому что после взятия char *ch = ... сам объект str уже не используется. Возможно, используется дальше по реальному коду откуда было взято, но в приведенном фрагменте - нет. Корректно так: ShowMessage(str); или ShowMessage(str.c_str()); Или сделать фейковую функцию использования void fake_use(void*p){}; AnsiString str = Edit1->Text; char *ch = str.c_str(); ShowMessage(ch); fake_use(&str); Это требование компилятору чтобы он гарантированно держал объект str живым в течении выполнения ShowMessage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 15:28 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яНубикКонкретный Код: plaintext 1. 2. 3. - всё нормально. Формально говоря, это тоже ненормально, потому что после взятия char *ch = ... сам объект str уже не используется. Возможно, используется дальше по реальному коду откуда было взято, но в приведенном фрагменте - нет. Корректно так: ShowMessage(str); или ShowMessage(str.c_str()); Или сделать фейковую функцию использования void fake_use(void*p){}; AnsiString str = Edit1->Text; char *ch = str.c_str(); ShowMessage(ch); fake_use(&str); Это требование компилятору чтобы он гарантированно держал объект str живым в течении выполнения ShowMessage. Во, спасибо, объяснили! А иначе сборщик мусора удалит str раньше окончания code-scope, или кто? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 16:43 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Вася УткинА иначе сборщик мусора удалит str раньше окончания code-scope, или кто? В С++ нет сборщика мусора, в нем компилятор вызывает деструкторы, когда объект либо выходит из области видимости либо когда компилятор видит что он не нужен, но со вторым вариантом ситуация неоднозначна, на усмотрение компилятора. А использованная им память может быть потерта внутренними служебными операциями или другими объектами, или кем-то из других потоков. В принципе, возможен код, который корректно работает но при очередной сборке взял и перестал: { TLockObject lock(resource) операции с лоченым ресурсом } где конструктор ставит и деструктор снимает блокировку. Тут компилятор может как удержать объект lock до конца блока {} так и убить перед первым же оператором после объявления TLockObject lock. В общем, критерий всех тестеров "а у меня работает" еще не критерий корректности для программистов, оно может и перестать работать при очередной компиляции )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 18:35 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яВася УткинА иначе сборщик мусора удалит str раньше окончания code-scope, или кто? В С++ нет сборщика мусора, в нем компилятор вызывает деструкторы, когда объект либо выходит из области видимости либо когда компилятор видит что он не нужен, но со вторым вариантом ситуация неоднозначна, на усмотрение компилятора.... Про второй вариант врешь. Его нет, все там однозначно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 18:39 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яВася УткинА иначе сборщик мусора удалит str раньше окончания code-scope, или кто? В С++ нет сборщика мусора, в нем компилятор вызывает деструкторы, когда объект либо выходит из области видимости либо когда компилятор видит что он не нужен, но со вторым вариантом ситуация неоднозначна, на усмотрение компилятора. А использованная им память может быть потерта внутренними служебными операциями или другими объектами, или кем-то из других потоков. В принципе, возможен код, который корректно работает но при очередной сборке взял и перестал: { TLockObject lock(resource) операции с лоченым ресурсом } где конструктор ставит и деструктор снимает блокировку. Тут компилятор может как удержать объект lock до конца блока {} так и убить перед первым же оператором после объявления TLockObject lock. В общем, критерий всех тестеров "а у меня работает" еще не критерий корректности для программистов, оно может и перестать работать при очередной компиляции )))) Т.е. в C++11 объекты RAII-блокировок std::unique_lock и std::lock_guard не гарантируют, что они будут существовать до конца code-scope, т.е. могут в любой момент быть уничтожены и следующий код не гарантирует потоко-безопасность и правильную работу? Вы пробовали связаться с комитетом по стандартизации C++ и объяснить Страуструпу, что предлагаемый им принцип RAII-в общем не работает? http://en.cppreference.com/w/cpp/thread/lock_guard Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 19:10 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Вася УткинТ.е. в C++11 объекты RAII-блокировок std::unique_lock и std::lock_guard не гарантируют, что они будут существовать до конца code-scope, т.е. могут в любой момент быть уничтожены и следующий код не гарантирует потоко-безопасность и правильную работу? Вы пробовали связаться с комитетом по стандартизации C++ и объяснить Страуструпу, что предлагаемый им принцип RAII-в общем не работает? [/src] Про С++ 11 не в курсе, пользуюсь более старыми компиляторами, на них выскакивали такие неприятности. Логически - да, могут быть уничтожены и не гарантируют. Нет, связываться не пробовал. Со Страуструпом не общался. Да, принцип в общем случае не работает, если компиляторы могут вызвать деструктор раньше чем объект покинет область видимости. Ну, может возьмут и строго отнесутся к времени жизни объектов, и компиляторы поддержат, тогда будет и принцип работать. Проблем-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 21:07 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Siemarglну япропущено... В С++ нет сборщика мусора, в нем компилятор вызывает деструкторы, когда объект либо выходит из области видимости либо когда компилятор видит что он не нужен, но со вторым вариантом ситуация неоднозначна, на усмотрение компилятора.... Про второй вариант врешь. Его нет, все там однозначно. Да я тоже полагался на то, что его в языке нет, и заложился на красивый код, однако между "компилятор может" и "компилятор по стандарту должен" обнаружилась одна большая и неприятная разница, об чем и высказался. Нет, не вру, на самом деле был такой реальный случай ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 21:43 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яSiemarglпропущено... Про второй вариант врешь. Его нет, все там однозначно. Да я тоже полагался на то, что его в языке нет, и заложился на красивый код, однако между "компилятор может" и "компилятор по стандарту должен" обнаружилась одна большая и неприятная разница, об чем и высказался. Нет, не вру, на самом деле был такой реальный случай ))) есть такая частая ошибка - забыть указать переменную, объект создаётся и удаляется тут же но если указать, то вроде как по стандарту вызов деструктора в конце блока видимости должен быть микрософт по этому поводу пишет PS: в реальности, наверное, лучше стараться избегать таких вещей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 22:11 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яSiemarglпропущено... Про второй вариант врешь. Его нет, все там однозначно. Да я тоже полагался на то, что его в языке нет, и заложился на красивый код, однако между "компилятор может" и "компилятор по стандарту должен" обнаружилась одна большая и неприятная разница, об чем и высказался. Нет, не вру, на самом деле был такой реальный случай )))а что за компилятор был? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 00:51 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
egorychну япропущено... Да я тоже полагался на то, что его в языке нет, и заложился на красивый код, однако между "компилятор может" и "компилятор по стандарту должен" обнаружилась одна большая и неприятная разница, об чем и высказался. Нет, не вру, на самом деле был такой реальный случай )))а что за компилятор был? msvc 2005 C++ Builder 5 Оба выдали такие фокусы. То корректно собирают, то с притопами-прихлопами. Пришлось принуждать удерживать объекты. Гимору добавляло то, что это реально были блокировки, многозадачка, и код вроде чистый. Отлаживаться и выискивать проблему было тяжко, но шишку набил прочную )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 08:43 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну я, а на каком ни будь тестовом примере повторялось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 10:47 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну яegorychпропущено... а что за компилятор был? msvc 2005 C++ Builder 5 Оба выдали такие фокусы. То корректно собирают, то с притопами-прихлопами. Пришлось принуждать удерживать объекты. Гимору добавляло то, что это реально были блокировки, многозадачка, и код вроде чистый. Отлаживаться и выискивать проблему было тяжко, но шишку набил прочную ))))В многозадачке трудно отлаживаться - вечно путаешься, в каком потоке твои объекты. Так что я не грешил бы на базовую функциональность компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 12:00 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Siemarglну япропущено... В С++ нет сборщика мусора, в нем компилятор вызывает деструкторы, когда объект либо выходит из области видимости либо когда компилятор видит что он не нужен, но со вторым вариантом ситуация неоднозначна, на усмотрение компилятора.... Про второй вариант врешь. Его нет, все там однозначно. Есть случай продления времени жизни временного объекта инициализацией им константной ссылки на объект. Видимо, это имелось в виду. И это почти что сборщик мусора, но такой мааааленький-маааленький... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 13:02 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)ну я, а на каком ни будь тестовом примере повторялось? Дык именно и купился на то, что красивый код, и на тестах везде работал на ура, потому и использовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 13:35 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
SiemarglВ многозадачке трудно отлаживаться - вечно путаешься, в каком потоке твои объекты. Так что я не грешил бы на базовую функциональность компилятора. Ок, учту, что Siemargl не хочет грешить, потому что путается в многозадачности и многопоточности. А я так и не прочь погрешить на них иной раз, баги же правят в них неспроста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 13:38 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
ну я, В 100% известных мне случаях (а их было множество) когда кто-то писал что нашел баг в компиляторе, это в итоге оказывалось криворукостью программиста. А если еще и нет конкретного примера кода, то тут даже и думать нечего Хотя конечно баги в компиляторах бывают. Но не такие, как неработающий RAII. Например в vs2005 в std::stringstream была утечка памяти. Но это в библиотеке, а не в самом компиляторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 14:10 |
|
||
|
Преобразование AnsiString в char - кто из нас двоих (билдер или я) сошел с ума?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyну я, В 100% известных мне случаях (а их было множество) когда кто-то писал что нашел баг в компиляторе, это в итоге оказывалось криворукостью программиста. А если еще и нет конкретного примера кода, то тут даже и думать нечего Хотя конечно баги в компиляторах бывают. Но не такие, как неработающий RAII. У меня несколько лет был точно такой же эпизод в жизни. Он прошел ))). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 14:43 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39405304&tid=2018272]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
207ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 312ms |

| 0 / 0 |
