Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.22;
Скачать: CL | DM;

Вниз

SizeOf   Найти похожие ветки 

 
Gu   (2011-12-29 21:04) [0]

В некоторые апишные функции передается буфер и его длинна (двумя параметрами). А почему нельзя в подобных процедурах узнать размер буфера и надо чтобы он передавался отдельно? Или размер можно узнать и сделано так из-за какихто особенностей?

Например 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)?


 
Сергей М. ©   (2011-12-29 21:10) [1]

Ты хоть  чуть-чуть представляешь что такое SizeOf(), на каком этапе и как оно работает ?)


 
Dimka Maslov ©   (2011-12-29 21:14) [2]

А потому-что размером буфера определяется состав данных, который может различаться в зависимости от компилятора и операционной системы.


 
Rouse_ ©   (2011-12-29 21:14) [3]


> А почему нельзя в подобных процедурах узнать размер буфера
> и надо чтобы он передавался отдельно?

Потому что по указателю на область памяти в общем случае нельзя получить ее размер.


 
Gu   (2011-12-29 21:24) [4]

ясно


 
Юрий Зотов ©   (2011-12-29 22:43) [5]


> Gu   (29.12.11 21:24) [4]

Есть адрес: город T, улица S, дом B, квартира R. Вы можете сказать, сколько в этой квартире квадратных метров?


 
Dennis I. Komarov ©   (2011-12-29 23:50) [6]


> Есть адрес: город T, улица S, дом B, квартира R. Вы можете
> сказать, сколько в этой квартире квадратных метров?

Могу :)
N


 
Rouse_ ©   (2011-12-29 23:55) [7]


> Юрий Зотов ©   (29.12.11 22:43) [5]
>
>
> > Gu   (29.12.11 21:24) [4]
>
> Есть адрес: город T, улица S, дом B, квартира R. Вы можете
> сказать, сколько в этой квартире квадратных метров?

С такими параметрами однозначно смогу: 42 квадратных метра, попробуй опровергнуть :)


 
Юрий Зотов ©   (2011-12-30 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. Попробуй опровергнуть.


 
Rouse_ ©   (2011-12-30 00:06) [9]


> Юрий Зотов ©   (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 балтики ;) то я победил :)


 
DVM ©   (2011-12-30 00:09) [10]


> Gu   (29.12.11 21:04) 
> В некоторые апишные функции передается буфер и его длинна
> (двумя параметрами). А почему нельзя в подобных процедурах
> узнать размер буфера и надо чтобы он передавался отдельно?
>  Или размер можно узнать и сделано так из-за какихто особенностей?
>

Если передается буфер ДЛЯ ЗАПОЛНЕНИЯ то тебе уже ответили выше.

Есть функции в которые передается указатель на УЖЕ ЗАПОЛНЕННЫЙ буфер, причем заполненный по определенным правилам, например, чтобы в конце его был 0. Часто это функции для обработки строк. Но такие функции не особенно безопасны, так как всегда есть шанс, что ей передадут нечто, не завершающееся нулем и что будет дальше можно лишь гадать. Поэтому та же MS в последние годы ввела варианты функций в которых обязательно должна указываться длина передаваемого буфера.


 
Ega23 ©   (2011-12-30 00:42) [11]


>  Поэтому та же 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 поля, всё остальное игнорируем. Если больше - заполняем больше.
Таким образом предыдущая версия функции будет работать нормально.



Страницы: 1 вся ветка

Текущий архив: 2012.04.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
15-1324457180
Mysql_error
2011-12-21 12:46
2012.04.22
Настроить коннет к mysql с разных компьютеров


2-1325185725
Plast
2011-12-29 23:08
2012.04.22
Конвертировать String в GUID?


3-1274783943
Phoenix
2010-05-25 14:39
2012.04.22
Помогите составить запрос...


8-1225884531
sloosar
2008-11-05 14:28
2012.04.22
TLabel


15-1324326603
Юрий
2011-12-20 00:30
2012.04.22
С днем рождения ! 20 декабря 2011 вторник