Текущий архив: 2013.12.08;
Скачать: CL | DM;
Вниз
указание Out параметра зануляет переменную? Найти похожие ветки
← →
EuSet (2013-06-12 16:41) [40]
> Понятно, что передавать указатель в космос некорректно.
> Это и написано.
а как ты в дельфи сможешь передать строку с указателем в космос? Объявление string автоматически "создает" валидную структуру. Поэтому еще раз - какие проблемы с финализацией?
> можно передать указатель на структуру с согласованными данными.
> Но в этом случае мы не получим отсутствие данных, как хотелось
> бы получить для out-параметра.
так мы и в текущей реализации не получаем отсутствие данных. Переменная out типа string вполне себе на входе функции является строкой. Пустой, валидной строкой.
Фактически, всем переданным переменным типа "string" как "out"-параметр считай перед исполнением тела функции делаетсяs := ""
> Когда передаем out-параметр, то тем самым мы передаем пустую
> коробку из-под ксерокса )
> А когда var-параметр, то на дне лежит сотня рублей на пиво.
это ты описал как бы хорошо, если бы так было. Реально же без ухищрений в дельфи нельзя объявить переменную типа string с невалидной структурой. Она автоматом просто инициализируется. Поэтому вызывающий код передает вполне конкретную строку. Почему в случае с "out" эта строка обязательно должна быть переназначена на пустую строку - я не понял.
С учетом того, что для числовых значений этого, например, не происходит. Если строка приводится к дефолтному значению для строк (пустая строка), почему Integer не приводится к дефолтному значению (ноль)?
← →
Sha © (2013-06-12 17:04) [41]> а как ты в дельфи сможешь передать строку с указателем в космос?
Запросто.
Но речь не обо мне, а о компиляторе. Любая грязь на стеке или в регистре может указывать в космос.
> так мы и в текущей реализации не получаем отсутствие данных.
Разумеется. Но мы к этому стремимся )
Если сделать так, как ты предлагаешь, то разницы между var и out не будет, т.к. сейчас компилятор не выдает предупреждений при чтении или неприсваивании зачения out-параметра.
Тогда у тебя возникнет вопрос, зачем вообще нужен out?
> Почему в случае с "out" эта строка обязательно должна быть
> переназначена на пустую строку - я не понял.
Считай, что по определению.
> почему Integer не приводится к дефолтному значению (ноль)?
Потому, что для меня дефолтное значение (-MaxInt-1)
← →
брат Птибурдукова (2013-06-12 18:06) [42]
> Почему в случае с "out" эта строка обязательно должна быть
> переназначена на пустую строку - я не понял.
Не то чтоб должна, но кодить "иф аут-параметр зен заполним_мусором элс создадим_пустую" никто не будет. Подготовительная работа в любом случае должна быть проведена, и проще и логичней всего — инициализировать строку как пустую.
← →
EuSet (2013-06-13 10:36) [43]
> Тогда у тебя возникнет вопрос, зачем вообще нужен out?
так я и говорю, что надо было просто контролировать считывание с этой переменной и запрещать сие действие.
Это и кажется мне логичным.
← →
Плохиш © (2013-06-13 11:38) [44]
> Это и кажется мне логичным.
Ваша логика как-то создателей средств разработки ну ни сколько не интересует.
← →
EuSet (2013-06-13 13:41) [45]
> Не то чтоб должна, но кодить "иф аут-параметр зен заполним_мусором
> элс создадим_пустую" никто не будет. Подготовительная работа
> в любом случае должна быть проведена, и проще и логичней
> всего — инициализировать строку как пустую.
да, обсуждали выше. Но тогда также логично и инициализировать integer нулем строго в соответствии с тем, что ты написал.
← →
Inovet © (2013-06-13 13:44) [46]> [45] EuSet (13.06.13 13:41)
Инициализировать нулём - тоже лишнее.
← →
Sha © (2013-06-13 14:35) [47]> EuSet (13.06.13 13:41) [45]
Когда передается integer, то смысл состоит не в передаче значения (0,3,5 или еще что-то там), а в передаче места, куда это значение поместят в будущем.
Грубо говоря, если ты купил рекламное место, тебе пофиг, что там до тебя было написано "здесь может быть ваша реклама", "рекламное место сдается" или что еще. Оно твое, и ты там напишешь все, что хочешь. Не напишешь - останется то, что было написано раньше.
Со строками и массивами все немного иначе. Их адрес будет лежать в контейнере, а значение всегда болтается снаружи. Этот хлам как раз и обрубается при инициализации.
← →
ProgRAMmer Dimonych © (2013-06-17 22:41) [48]Реквестирую немного больше подробностей касательно теста из [14]. Что происходит — в общих чертах понял, но не могу связать с соглашением вызова. Даже стек нарисовал на листочке и расписал, чего и куда. Out-параметр первым уходит или что? Delphi 7, ответ: 123S45S6.
← →
ТимоховД (2013-06-18 13:15) [49]Сам использую out, хотя это, скорее, для разработчика документация - показать, что входящее значение не важно.
Лично мне не нравится в out-ах, что компилятор дает обращаться к этим параметрам. ИМХО - это не верно чисто логически, ибо out - чисто для возврата должон быть.
← →
ТимоховД (2013-06-18 13:15) [50]Сам использую out, хотя это, скорее, для разработчика документация - показать, что входящее значение не важно.
Лично мне не нравится в out-ах, что компилятор дает обращаться к этим параметрам. ИМХО - это не верно чисто логически, ибо out - чисто для возврата должон быть.
← →
han_malign (2013-06-18 16:05) [51]семантика out связана в первую очередь с:
HRESULT IUnknown::QueryInterface(
[in] REFIID riid,
[out] void **ppvObject
);
- обратите внимание на void;
и с классическим тестом на внимание(RTFM):HRESULT IEnumVARIANT::Next(
[in] ULONG celt,
[out, size_is(celt), length_is(*pCeltFetched)] VARIANT *rgVar,
[out] ULONG *pCeltFetched
);
- для которого в MSDN приводится классическая реализация:STDMETHODIMP
CEnumVariant::Next(ULONG cElements, VARIANT * pvar, ULONG * pcElementFetched)
{
HRESULT hr;
ULONG l;
long l1;
ULONG l2;
if (pcElementFetched != NULL)
*pcElementFetched = 0;
if (pvar == NULL)
return E_INVALIDARG;
for (l=0; l<cElements; l++)
VariantInit(&pvar[l]);
// Retrieve the next cElements elements.
// m_lLBound+m_cElements = # of elements in the m_psa collection.
for (l1=m_lCurrent, l2=0; l1<(long)(m_lLBound+m_cElements) &&
l2<cElements; l1++, l2++)
{
hr = SafeArrayGetElement(m_psa, &l1, &pvar[l2]);
if (FAILED(hr))
goto error;
}
// Set count of elements retrieved.
if (pcElementFetched != NULL)
*pcElementFetched = l2;
m_lCurrent = l1;
return (l2 < cElements) ? S_FALSE : NOERROR;
error:
for (l=0; l<cElements; l++)
VariantClear(&pvar[l]);
return hr;
}
- обратите внимание на VariantInit...
Страницы: 1 2 вся ветка
Текущий архив: 2013.12.08;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.01 c