Форум: "Начинающим";
Текущий архив: 2012.04.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c