Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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(), на каком этапе и как оно работает ?)


Наверх

Титульная страница Поиск, карта сайта Написать письмо