Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: -0.952 c
2-1154035695
Khabibulin
2006-07-28 01:28
2006.08.20
Физический размер ПИКСЕЛЯ


2-1154347870
just a girl
2006-07-31 16:11
2006.08.20
видимость формы


1-1152087970
Mouserx
2006-07-05 12:26
2006.08.20
Возможности компилятора


4-1145959330
Ifrit
2006-04-25 14:02
2006.08.20
Не могу получить текст с ThunderRT6ComboBox..


3-1149861015
stud
2006-06-09 17:50
2006.08.20
продлемы с ADO




   Наверх