![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Так, кажется, это не всем очевидно. Тогда поясню.
Нуль-терминированность строк в Delphi документирована и поэтому её использовать можно. Но не так, как это делаешь ты. Проблема в том, что ты указываешь функции буфер больше, чем у тебя есть. Например, пусть в GetWindowCaption передали не валидный описатель (окно удалилось в аккурат в момент между получением описателя и вызовом GetWindowCaption для этого описателя). Тогда твой вариант первой строчкой установит длину результата в 0, т.е. Result будет равен nil. Поскольку на ошибки ты не проверяшь, то будет выполняться вторая строчка. Тут проблема сидит ещё до вызова функции. С включенным range checking у тебя выбьет исключение при вычислении Result[1]. С выключенным range checking функция вызовется с указателем = nil и длинной = 1. Это означает, что ты наврёшь функции (ты сказал, что у тебя есть 1 символ в буфере, а на самом деле буфера вообще нет). И если вдруг функция захочет обнулить буфер до начала всех работ, то ты схлопочешь Access Violation. У моего варианта указанных проблем нет. Хотя обработку ошибок добавить не помешает.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#12 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
и бросать исключения. минимум должна быть на ошибку и нулевой капш. я любил этот код тем что он не изменяет длины строки в итоге.(если конечно кэпшн не стал короче) Код:
хотя, разве приведение к PChar не даст nil в случае пустой строки?(длина 0) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#13 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]() Цитата:
Цитата:
Код:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
![]() |
![]() |
![]() |
#14 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#15 |
Регистрация: 27.11.2011
Сообщений: 9
|
![]()
Спасибо всем за развёрнутый ответ!
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как правильно возвращать созданный в функции объект? | rpy3uH | Общие вопросы C/C++ | 4 | 10.11.2011 16:19 |
Не знаю как правильно сделать вызов функции | Homutova_Julia | Помощь студентам | 14 | 07.06.2011 23:45 |
Как правильно вставить строки? | Kostinok | Microsoft Office Excel | 6 | 28.05.2010 19:23 |
скрипт для приёма заказов на печать фото, через Интернет | nickhop | Фриланс | 1 | 14.02.2010 18:11 |
как правильно прописать адрес в функции? (формула) | coldis | Microsoft Office Excel | 3 | 18.02.2009 09:47 |