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

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

Заполнение буфера [D7, WinXP]


Страницы:   1 2

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]

Ага. Это как переменная, на которую компилятор ругается "может быть неинициализирована". В общем случае работает, но может и сглючить. Нафига алгоритм, который может сглючить?


Страницы:   1 2

Наверх

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