![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SizeOf
Gu © (2011-12-29 21:04:00)В некоторые апишные функции передается буфер и его длинна (двумя параметрами). А почему нельзя в подобных процедурах узнать размер буфера и надо чтобы он передавался отдельно? Или размер можно узнать и сделано так из-за какихто особенностей?
Например StrFormatByteSizeW(dw:Int;pszBuf:PChar;cchBuf:Cardinal):PChar; StdCall; External shlwapi32 Name 'StrFormatByteSizeW';
Function MyFileSize2Str(Fs:Int):Str;
Var Buf:Array[0..cGuMaxPath] Of Char;
Begin
Result:='';if Fs<0 then Exit;Result:=StrFormatByteSizeW(fs,buf,SizeOf(buf));
End;
если в StrFormatByteSizeW они бы запросили SizeOf(buf)?
Ega23 (2011-12-30 00:42:00) [1]
> Поэтому та же MS в последние годы ввела варианты функций
> в которых обязательно должна указываться длина передаваемого
> буфера.
Это ещё ради версионности сделано.
TSomeRecord = record
Field1: Integer;
Field2: DWord;
Field3: Pointer;
end;
TSomeRecord2 = record
Field1: Integer;
Field2: DWord;
Field3: Pointer;
Field4: Ещё какая-то хрень;
end;
function FillSomeRecord(Buff: Pointer; Size: DWord): Boolean;
Через Size можем понять, что нам передали. Если Size=12, то заполняем по данному адресу 3 поля, всё остальное игнорируем. Если больше - заполняем больше.
Таким образом предыдущая версия функции будет работать нормально.
DVM (2011-12-30 00:09:00) [2]
> Gu (29.12.11 21:04)
> В некоторые апишные функции передается буфер и его длинна
> (двумя параметрами). А почему нельзя в подобных процедурах
> узнать размер буфера и надо чтобы он передавался отдельно?
> Или размер можно узнать и сделано так из-за какихто особенностей?
>
Если передается буфер ДЛЯ ЗАПОЛНЕНИЯ то тебе уже ответили выше.
Есть функции в которые передается указатель на УЖЕ ЗАПОЛНЕННЫЙ буфер, причем заполненный по определенным правилам, например, чтобы в конце его был 0. Часто это функции для обработки строк. Но такие функции не особенно безопасны, так как всегда есть шанс, что ей передадут нечто, не завершающееся нулем и что будет дальше можно лишь гадать. Поэтому та же MS в последние годы ввела варианты функций в которых обязательно должна указываться длина передаваемого буфера.
Rouse_ (2011-12-30 00:06:00) [3]
> Юрий Зотов © (30.12.11 00:00) [8]
>
> > Dennis I. Komarov © (29.12.11 23:50) [6]
> Низачот. Если город T, улица S, дом B, а квартира R, то
> правильный ответ - SqM.
>
> > Rouse_ © (29.12.11 23:55) [7]
> Низачот. Правильный ответ - 42,4. Попробуй опровергнуть.
>
Опровергаю: мерить квадраты в 12 ночи можно, но это будет давать погрешность :) Ну а с учетом что ты меряешь не с моими значениями 4 переменных, та еще с погрешностью (ну скажем 0.5 балтики ;) то я победил :)
Юрий Зотов (2011-12-30 00:00:00) [4]> Dennis I. Komarov © (29.12.11 23:50) [6]
Низачот. Если город T, улица S, дом B, а квартира R, то правильный ответ - SqM.
> Rouse_ © (29.12.11 23:55) [7]
Низачот. Правильный ответ - 42,4. Попробуй опровергнуть.
Rouse_ (2011-12-29 23:55:00) [5]
> Юрий Зотов © (29.12.11 22:43) [5]
>
>
> > Gu (29.12.11 21:24) [4]
>
> Есть адрес: город T, улица S, дом B, квартира R. Вы можете
> сказать, сколько в этой квартире квадратных метров?
С такими параметрами однозначно смогу: 42 квадратных метра, попробуй опровергнуть :)
Dennis I. Komarov (2011-12-29 23:50:00) [6]
> Есть адрес: город T, улица S, дом B, квартира R. Вы можете
> сказать, сколько в этой квартире квадратных метров?
Могу :)
N
Юрий Зотов (2011-12-29 22:43:00) [7]
> Gu (29.12.11 21:24) [4]
Есть адрес: город T, улица S, дом B, квартира R. Вы можете сказать, сколько в этой квартире квадратных метров?
Gu (2011-12-29 21:24:00) [8]ясно
Dimka Maslov (2011-12-29 21:14:00) [9]А потому-что размером буфера определяется состав данных, который может различаться в зависимости от компилятора и операционной системы.
Rouse_ (2011-12-29 21:14:00) [10]
> А почему нельзя в подобных процедурах узнать размер буфера
> и надо чтобы он передавался отдельно?
Потому что по указателю на область памяти в общем случае нельзя получить ее размер.
Сергей М. (2011-12-29 21:10:00) [11]Ты хоть чуть-чуть представляешь что такое SizeOf(), на каком этапе и как оно работает ?)