|
|
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
Доброй ночи! Обнаружилось странное поведение SetLength. Странность в том, что при увеличении размера существующей строки в ней может появится мусор. Вот тут пишут: http://www.delphibasics.ru/SetLength.php авторЕсли строка короче, то она отсекается. Если она длиннее, то добавленные символы не будут проинициализированы. Это может дать странный эффект - смотрите первый пример. У меня проявляется в IBX'ах. Они забирают строку из буфера базы, дальше делают такой финт, увеличивая длину Result (она изначально получается меньше из-за конвертации UTF8 > Unicode): Код: pascal 1. 2. и на выходе AsString можно получить немного мусора в конце строки. После разбирательств, выяснилось, что SetLength вызывает _NewUnicodeString, который вызывает GetMem, который не заполняет память нулями. На выходе может получится (и получается) мусор. Проблеме больше подвержен 64х битный режим. Сталкивался ли кто-то с таким поведением? У меня Delphi XE6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 23:56:14 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaonСталкивался ли кто-то с таким поведением? Дока же: For a long string variable, SetLength reallocates the string referenced by S to the given length. Existing characters in the string are preserved, but the content of newly allocated space is undefined . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 00:04:44 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, замечательно :) и что делать? IBX'ы править? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 00:12:20 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
Обратитесь к разработчику. (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 00:53:14 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
Разработчик известно что посоветует :) Обновиться до последней версии, конечно небесплатно. Поступил проще - поправил сырцы IBX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 08:13:55 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaonДоброй ночи! Обнаружилось странное поведение SetLength. Странность в том, что при увеличении размера существующей строки в ней может появится мусор. А чем, по-твоему, правильная реализация SetLength должна была заполнять ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 09:54:36 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
schi, Так как это строка, то могла бы заполняться пробелами. По-твоему лучше возвращать мусор из памяти? Медленнее, конечно, зато надёжнее. Как вариант - в опции, то есть - в параметры. Видишь - сами напарываются на свои же 'особенности'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 09:59:19 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaon, подозреваю, что по плану этот SetLength стоит там для varchar - укоротить строку из исходного буфера. Соответственно, предполагалось только уменьшение длины, и поэтому FillChar там нет. В случае же фиксированной длины поля получается незапланированное увеличение длины строки этим SetLength, если строка изначально была меньшего размера из-за UTF-8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 10:11:25 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaonschi, Так как это строка, то могла бы заполняться пробелами. По-твоему лучше возвращать мусор из памяти? Медленнее, конечно, зато надёжнее. Как вариант - в опции, то есть - в параметры. Видишь - сами напарываются на свои же 'особенности'. По-моему, тот, кто вызывает SetLength должен сам заботиться о заполнении. Если он не заботится, то какой смысл в пробелах или нулях ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 15:30:22 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaonзамечательно :) и что делать? IBX'ы править? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 15:57:49 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaon, а не используешь ли ты в базе поля типа varchar(...)? Ну, строковые поля фиксированной длины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 16:03:13 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaonТак как это строка, то могла бы заполняться пробелами. Чем ПРОБЕЛ лучше другого символа ? Зачем использовать SetLength, который просто устанавливает длину переменной, не заботясь об инициализвции ? Сделайте конкейт нужого количества ПРОБЕЛОВ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 16:50:00 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
DimaBr, То есть возвращать всегда неинициализированные кусок памяти лучше? Зачем писать заведомые потенциальные баги? В случае неинициализированных локальных переменных хотя бы предупреждения есть. авторЕсли он не заботится, то какой смысл в пробелах или нулях Ну а почему динамические массивы нулями заполняются? Давайте тогда, для общности, и их мусором забивать :) Чем именно строки провинились? Код: pascal 1. 2. 3. Ничего, не свалилась корона :) авторЧем ПРОБЕЛ лучше другого символа ? Так не вопрос - можно было бы в SetLength передавать символ заполнения, по умолчанию - например - пробел, если передают '' - то работает как сейчас, если что-то другое - то другим заполняется. Если есть что-то более подходящее, чем пробел. Случаи всякие бывают. Мне пробел удобнее всего был бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 19:15:23 |
|
||
|
Странное поведение SetLength
|
|||
|---|---|---|---|
|
#18+
makhaon, так сделано. Люминь. Какой смысл спорить по поводу целесообразности деталей реализации чужого проекта? Проект чужой, он уже реализован, повлиять на процесс реализации ты не сможешь никак. Заведи себе файлик MyUtils.pas, и вноси в него правильные с твоей т.зр. рутины, да в своих проектах юзай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2017, 19:55:21 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2042238]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
14ms |
get first new msg: |
8ms |
get forum data: |
4ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 414ms |

| 0 / 0 |
