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

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

хитрый массив [D7]


Страницы:   1 2

race1 ©   (2004-07-28 18:12:00) 

я хочу перевернуть массив наоборот, т.е. [1, 2, 3] превратить в [3, 2, 1]. т.к. это действо встречается часто, задумал я это дело в процедуру вынести

процедура принимает аргументом адрес переменной (байты которой являются элементами массива), и устанавливает адрес локального массива процедуры переданному адресу. т.е.


procedure proc(pnt: Pointer);
type
 TMyArray = Array of Byte;
 PMyArray = ^TMyArray;
var
 MyArrayP: PMyArray;
 MyArray: TMyArray;
begin
 MyArrayP := pnt;
 MyArray := MyArrayP^;
...

но дальше все действия с MyArray'ем приводят к ошибке. а почему?


Arm79   (2004-07-28 23:17:00) [21]

я приводить пример программы не буду, тк аналога у меня нет, я с ходу писать мне не очень хочется, но смысл, как я понял, такой: первый элемент меняется местами с последним, второй с предпоследним и тд. Организуем цикл до тех пор, пока есть изменения и меняем местами i-ый элемент массива с High(наш красивый динамический массив)-i - элементом. Увеличиваем i на 1. Как только менять нечего (например, i>=(High - i)), меняем условие цикла и тем самым его завершаем. Разумеется все очень приблизительно, но алгоритм в правильном направлении.


Fay   (2004-07-28 20:40:00) [22]

А резервного элемента массива не хватает?


olookin   (2004-07-28 20:34:00) [23]

а я в таких случаях делаю резервный массив. Через него произвожу преобразование. Сохраняю в исходный массив. А потом грохаю этот резерв.


Fay   (2004-07-28 20:25:00) [24]


> Правда, что нужно автору вопроса - до сих пор не ясно...

Ага 8)


jack128   (2004-07-28 20:18:00) [25]


> Речь шла о динамических массивах. Читай свой пост - заколбасит
> не по-детски!!!
прочитал..Действительно - дин массивы. Как это я не заметил ;-) Правда, что нужно автору вопроса - до сих пор не ясно...


Fay   (2004-07-28 20:15:00) [26]

Речь шла о динамических массивах. Читай свой пост - заколбасит не по-детски!!!

> procedure proc(p: pointer; len: integer);
> var i: integer;
>    myarray: array of byte;
> begin
>  setlength(myarray, len);
>  for i:=0 to len-1 do
>    myarray[len-1-i] := byte((p+i)^);
>  for i:=0 to len-1 do
>    (p+1)^ := myarray[i];
> end;
>
> а вызывать нужно так:
>
> proc(@array[0], sizeof(array));


jack128   (2004-07-28 20:13:00) [27]


> Выполнили? 4, верно?! 8)

var
 b: array[0..10] of byte;
нет, не угадал ;-)


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


Fay   (2004-07-28 20:01:00) [28]

Выполнили? 4, верно?! 8)


Fay   (2004-07-28 20:01:00) [29]

2Kurtevich   (28.07.04 19:57) [6]

> proc(@array[0], sizeof(array));

Интересная мысль. Знаете фокус? Вы выполняете
ShowMessage(IntToStr(SizeOf(array)))
, а я угадываю результат! Очень круто!


Kurtevich   (2004-07-28 19:57:00) [30]

я бы сделал так:

procedure proc(p: pointer; len: integer);
var i: integer;
   myarray: array of byte;
begin
 setlength(myarray, len);
 for i:=0 to len-1 do
   myarray[len-1-i] := byte((p+i)^);
 for i:=0 to len-1 do
   (p+1)^ := myarray[i];
end;


а вызывать нужно так:

proc(@array[0], sizeof(array));

с этими массивами надо поосторожнее, хрен его знает, что они в дельфе реально из себя представляют?

... хотя все это написано с ходу и может вобще полный бред...


jack128   (2004-07-28 19:36:00) [31]


> Тогда ищем место, где под MyArray выделяется память.
у почему под MyArray нужно выделять память? Это ж дин массив.

> процедура принимает аргументом адрес переменной (байты которой
> являются элементами массива),

совершенно не понял фразу. пример использования процедуры?


Rem   (2004-07-28 19:23:00) [32]

TMyArray = Array of Byte;
...
MyArray: TMyArray;
...
MyArray := MyArrayP^;


Внимательно смотрим на то, что приведено.
Потом еще раз смотрим.
Ищем место, где определяется размер TMyArray.
На находим?
Тогда ищем место, где под MyArray выделяется память.
Не находим?
Пытаемся сделать выводы.


jack128   (2004-07-28 18:58:00) [33]


> я хочу перевернуть массив наоборот, т.е. [1, 2, 3] превратить
> в [3, 2, 1].
массив, какого то определенного типа(Integer там, или char) или массив произвольного, зарание неизвестного типа?


> TMyArray = Array of Byte;
>  PMyArray = ^TMyArray;
PMyArray - указатель на указатель на первый элемент массива - ты это понимаешь?

пример для массива байтов
TDynByteArray = array of byte;

procedure SwapByteArray(var Arr: TDynByteArray);
var
 i: Integer;
 Temp: byte;
begin
 for i := 0 to (Length(Arr) - 1) div 2 do
 begin
   Temp := Arr[i];
   Arr[i] := Arr[Length(Arr) - i - 1];
   Arr[Length(Arr) - i - 1] := Temp;
 end;
end;


race1   (2004-07-28 18:42:00) [34]

всмысле, как без MyArray?

я попробовал так:
MyArray := pnt;
всё заработало; только неправильно размер массива MyArray определяется, но это не беда

а вообще pnt передаётся по ссылке (var pnt: Pointer), затем в качестве массива над данными по адресу pnt делаются изменения, далее переменная, на которую указывает pnt используется дальше в вызвавшей процедуре. насколько это безопасно?


Fay   (2004-07-28 18:28:00) [35]

Всё то же самое, только без MyArray не пробовал?


Страницы:   1 2

Наверх

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