![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заполнение буфера [D7, WinXP]
Destroyer © (2006-07-21 17:58:00)Надо заполнить буфер произвольными числами. Делаю так:
var
buf : array[1..4096] of Byte;
Rand_dig: integer;
for i:=0 to SizeOf(buf) do
begin
Rand_dig:=Random(1000);
FillChar(buf, 1, Rand_dig);
end;
Произвольное число записывается в первый элемент. А надо заполнить весь буфер произвольными. Может есть функция установки позиуии записи, или еще как?
Destroyer (2006-07-27 22:35:00) [1]Спасибо за информацию. Заполнить всяким мусором буфер можно так
for i:=1 to SizeOf(buf) do
buf[i]:=Random(256);
Но если это приходится делать в цикле не одну сотню раз, и если буфер большой, то, видимо, для увеличения скорости проще взять:
var
Buf: PByteArray;
begin
GetMem(buf, bufSize);
Zeqfreed (2006-07-22 22:06:00) [2]> [22] Virgo_Style © (22.07.06 22:03)
Не понял, зачем мне туда смотреть. Я отвечал на [19]. GlobalAlloc(GMEM_ZEROINIT, …) выделит область памяти и заполнит её нулями, т.е. область, не заполненную произвольными числами.
Virgo_Style (2006-07-22 22:03:00) [3]Шпиён (22.07.06 17:14) [20]
Zeqfreed © (22.07.06 17:21) [21]
см. [9] :-)
Zeqfreed (2006-07-22 17:21:00) [4]Или
GlobalAllocс флагом GMEM_ZEROINIT (кажется так).
Шпиён (2006-07-22 17:14:00) [5]
> Virgo_Style © (22.07.06 17:09) [19]
> Прочитав переписку, задался вопросом - а как можно было
> бы выделить буфер, чтобы он не был заполнен (произвольными)
> числами?)
Нарпимер, так:
function AllocMem(Size: Cardinal): Pointer;
AllocMem allocates a block of the given size on the heap. Each byte in the allocated buffer is set to zero.
Virgo_Style (2006-07-22 17:09:00) [6]Прочитав переписку, задался вопросом - а как можно было бы выделить буфер, чтобы он не был заполнен (произвольными) числами?)
Ежели он не строковый и не оcharованный?)
Loginov Dmitry (2006-07-22 14:08:00) [7]> хотя решение [16] более общее, конечно
Ну типа да. SizeOf дает размер массива в байтах, и для элементов, отличных от Byte не подходит. (Это я счас проверил, а когда писал [17], почему-то думал, что SizeOf возвратит 1).
Ketmar (2006-07-22 10:33:00) [8]>Loginov Dmitry © (22.07.06 09:58) [16]
так это... в [1] решение уже дано, потому можно было флудить смело. %-)
хотя решение [16] более общее, конечно. %-)
Loginov Dmitry (2006-07-22 09:58:00) [9]Однако мы нафлудили :))
Если по сабжу, то:
for I := Low(Buf) to High(Buf) do
Buf[I] := Random(High(Byte));
KilkennyCat (2006-07-22 08:54:00) [10]> В [0] же не было сказано, что буфер должен быть заполнен
> случайными числами
Согласен. Предположение о "случайных" можно сделать исходя из приведенного кода и телепатии :), сто имелось ввиду под "произвольными".
> с GetMem произвольность гарантируется, так как Х.З. что
> там в результате окажется.
С точки зрения "буквоедства", да, согласен. Но мы же не "буквоеды" :))
Loginov Dmitry (2006-07-22 08:49:00) [11]> я обсуждал саму идею использование "мусора" в памяти, как
> заполнитель произвольными значениями
Так а в чем проблема? Если числа должны иметь порядковый тип, то все нормально. В [0] же не было сказано, что буфер должен быть заполнен случайными числами, а с GetMem произвольность гарантируется, так как Х.З. что там в результате окажется.
KilkennyCat (2006-07-22 08:42:00) [12]> Да вы что? И какое же, может и это знаете?
Откуда мне знать что там было? FF FF FF или 00 00 00 00... или еще что-то...
> Вариант 2 вообще не рабочий. Без указания размера буфера
> функцию GetMem не следует использовать.
Мне сие не важно. Я не разбирал непосредственно исполнение, я обсуждал саму идею использование "мусора" в памяти, как заполнитель произвольными значениями. А поставили ли Вы точку с запятой, или размер буфера не указали, это, извините, не моего ума дело.
Loginov Dmitry (2006-07-22 08:28:00) [13]> ззыж GetMem(buf, bufSize).
Забыл :(
> А исключения сделать не судьба? Try Except? Если сглючил
> - тады алгорытм №2!
Зачем их делать? Они сами возникнут при жестокой необходимости ;)
> там будет ОДНО ЗНАЧЕНИЕ.
Да вы что? И какое же, может и это знаете?
> Я имел ввиду, что вариант [2] может попасть на чистую, или
> заполненную одним значением область памяти.
Вариант 2 вообще не рабочий. Без указания размера буфера функцию GetMem не следует использовать.
> ну-ну...
ну-ну...
DrPass (2006-07-22 01:33:00) [14]Смотрите на телеэкранах новый суперблокбастер "Буквоед-2: The Return of Буквоед"
KilkennyCat (2006-07-22 00:03:00) [15]> [9] Ketmar © (21.07.06 23:59)
ну-ну...
Ketmar (2006-07-21 23:59:00) [16]>KilkennyCat © (21.07.06 23:51) [8]
пусть себе попадает. это тоже произвольные, хоть и одинаковые значения. "нес па?" (ц)
KilkennyCat (2006-07-21 23:51:00) [17]> если подходить формально, то там будут именно произвольные
> значения
там будет ОДНО ЗНАЧЕНИЕ.
> А исключения сделать не судьба?
А оно будет вызвано?
Я имел ввиду, что вариант [2] может попасть на чистую, или заполненную одним значением область памяти.
XeON (2006-07-21 23:44:00) [18]А исключения сделать не судьба? Try Except? Если сглючил - тады алгорытм №2! И т.д... :)
Ketmar (2006-07-21 22:33:00) [19]почему "сглючить"? если подходить формально, то там будут именно произвольные значения. нигде же не сказано, что хочется именно псевдослучайных?
зыж да, я буквоед. %-)
ззыж GetMem(buf, bufSize). %-)
KilkennyCat (2006-07-21 21:52:00) [20]Ага. Это как переменная, на которую компилятор ругается "может быть неинициализирована". В общем случае работает, но может и сглючить. Нафига алгоритм, который может сглючить?