Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
2-1154552866
susergey
2006-08-03 01:07
2006.08.20
Абракадабра в TMemo


1-1152100482
Elen
2006-07-05 15:54
2006.08.20
Проблема с запуском программы вызывающей СОМ-объект


2-1154090438
vain
2006-07-28 16:40
2006.08.20
Ссылки в программе


15-1153798751
vajo
2006-07-25 07:39
2006.08.20
AMD и ATI объявили о слиянии


3-1150442109
RomanH
2006-06-16 11:15
2006.08.20
Функция Trim в InterBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский