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

Вниз

Заполнение буфера   Найти похожие ветки 

 
Destroyer ©   (2006-07-21 17:58) [0]

Надо заполнить буфер произвольными числами. Делаю так:
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;
Произвольное число записывается в первый элемент. А надо заполнить весь буфер произвольными. Может есть функция установки позиуии записи, или еще как?


 
DrPass ©   (2006-07-21 18:00) [1]

for i:=1 to SizeOf(buf) do
buf[i]:=Random(256);


 
Loginov Dmitry ©   (2006-07-21 20:09) [2]

> Надо заполнить буфер произвольными числами


var
 Buf: PByteArray;
begin
 GetMem(Buf);

...

Все. Буфер заполнен произвольными числами.


 
KilkennyCat ©   (2006-07-21 21:32) [3]

> [2] Loginov Dmitry ©   (21.07.06 20:09)


негарантированно.


 
Loginov Dmitry ©   (2006-07-21 21:38) [4]

> негарантированно.


Ну если в общем случае, то в буфере могут быть совершенно произвольные "числа"


 
KilkennyCat ©   (2006-07-21 21:52) [5]

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


 
Ketmar ©   (2006-07-21 22:33) [6]

почему "сглючить"? если подходить формально, то там будут именно произвольные значения. нигде же не сказано, что хочется именно псевдослучайных?

зыж да, я буквоед. %-)

ззыж GetMem(buf, bufSize). %-)


 
XeON ©   (2006-07-21 23:44) [7]

А исключения сделать не судьба? Try Except? Если сглючил - тады алгорытм №2! И т.д... :)


 
KilkennyCat ©   (2006-07-21 23:51) [8]

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


там будет ОДНО ЗНАЧЕНИЕ.


> А исключения сделать не судьба?


А оно будет вызвано?

Я имел ввиду, что вариант [2] может попасть на чистую, или заполненную одним значением область памяти.


 
Ketmar ©   (2006-07-21 23:59) [9]

>KilkennyCat ©   (21.07.06 23:51) [8]
пусть себе попадает. это тоже произвольные, хоть и одинаковые значения. "нес па?" (ц)


 
KilkennyCat ©   (2006-07-22 00:03) [10]

> [9] Ketmar ©   (21.07.06 23:59)

ну-ну...


 
DrPass ©   (2006-07-22 01:33) [11]

Смотрите на телеэкранах новый суперблокбастер "Буквоед-2: The Return of Буквоед"


 
Loginov Dmitry ©   (2006-07-22 08:28) [12]

> ззыж GetMem(buf, bufSize).


Забыл :(


> А исключения сделать не судьба? Try Except? Если сглючил
> - тады алгорытм №2!


Зачем их делать? Они сами возникнут при жестокой необходимости ;)


> там будет ОДНО ЗНАЧЕНИЕ.


Да вы что? И какое же, может и это знаете?


> Я имел ввиду, что вариант [2] может попасть на чистую, или
> заполненную одним значением область памяти.


Вариант 2 вообще не рабочий. Без указания размера буфера функцию GetMem не следует использовать.


> ну-ну...


ну-ну...


 
KilkennyCat ©   (2006-07-22 08:42) [13]

> Да вы что? И какое же, может и это знаете?


Откуда мне знать что там было? FF FF FF или 00 00 00 00... или еще что-то...


> Вариант 2 вообще не рабочий. Без указания размера буфера
> функцию GetMem не следует использовать.


Мне сие не важно. Я не разбирал непосредственно исполнение, я обсуждал саму идею использование "мусора" в памяти, как заполнитель произвольными значениями. А поставили ли Вы точку с запятой, или размер буфера не указали, это, извините, не моего ума дело.


 
Loginov Dmitry ©   (2006-07-22 08:49) [14]

> я обсуждал саму идею использование "мусора" в памяти, как
> заполнитель произвольными значениями


Так а в чем проблема? Если числа должны иметь порядковый тип, то все нормально. В [0] же не было сказано, что буфер должен быть заполнен случайными числами, а с GetMem произвольность гарантируется, так как Х.З. что там в результате окажется.


 
KilkennyCat ©   (2006-07-22 08:54) [15]

> В [0] же не было сказано, что буфер должен быть заполнен
> случайными числами


Согласен. Предположение о "случайных" можно сделать исходя из приведенного кода и телепатии :), сто имелось ввиду под "произвольными".


> с GetMem произвольность гарантируется, так как Х.З. что
> там в результате окажется.


С точки зрения "буквоедства", да, согласен. Но мы же не "буквоеды" :))


 
Loginov Dmitry ©   (2006-07-22 09:58) [16]

Однако мы нафлудили :))

Если по сабжу, то:
 for I := Low(Buf) to High(Buf) do
   Buf[I] := Random(High(Byte));


 
Ketmar ©   (2006-07-22 10:33) [17]

>Loginov Dmitry ©   (22.07.06 09:58) [16]
так это... в [1] решение уже дано, потому можно было флудить смело. %-)

хотя решение [16] более общее, конечно. %-)


 
Loginov Dmitry ©   (2006-07-22 14:08) [18]

> хотя решение [16] более общее, конечно


Ну типа да. SizeOf дает размер массива в байтах, и для элементов, отличных от Byte не подходит. (Это я счас проверил, а когда писал [17], почему-то думал, что SizeOf возвратит 1).


 
Virgo_Style ©   (2006-07-22 17:09) [19]

Прочитав переписку, задался вопросом - а как можно было бы выделить буфер, чтобы он не был заполнен (произвольными) числами?)
Ежели он не строковый и не оcharованный?)


 
Шпиён   (2006-07-22 17:14) [20]


> 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.


 
Zeqfreed ©   (2006-07-22 17:21) [21]

Или GlobalAlloc с флагом GMEM_ZEROINIT (кажется так).


 
Virgo_Style ©   (2006-07-22 22:03) [22]

Шпиён   (22.07.06 17:14) [20]
Zeqfreed ©   (22.07.06 17:21) [21]

см. [9] :-)


 
Zeqfreed ©   (2006-07-22 22:06) [23]

> [22] Virgo_Style ©   (22.07.06 22:03)

Не понял, зачем мне туда смотреть. Я отвечал на [19]. GlobalAlloc(GMEM_ZEROINIT, …) выделит область памяти и заполнит её нулями, т.е. область, не заполненную произвольными числами.


 
Destroyer ©   (2006-07-27 22:35) [24]

Спасибо за информацию. Заполнить всяким мусором буфер можно так
for i:=1 to SizeOf(buf) do
buf[i]:=Random(256);

Но если это приходится делать в цикле не одну сотню раз, и если буфер большой, то, видимо, для увеличения скорости проще взять:
var
Buf: PByteArray;
begin
GetMem(buf, bufSize);



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

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

Наверх




Память: 0.53 MB
Время: 0.049 c
3-1150216421
bruha
2006-06-13 20:33
2006.08.20
вопрос по реализации Master-Detail, lookup -> calculated field


15-1153891887
Ega23
2006-07-26 09:31
2006.08.20
С Днём рождения! 26 июля


2-1154244683
vain
2006-07-30 11:31
2006.08.20
«Дескриптор»


15-1153073622
NAS
2006-07-16 22:13
2006.08.20
Оплачу програмку


11-1131365399
DmiSb
2005-11-07 15:09
2006.08.20
Еще раз про немодальную форму из DLL