Текущий архив: 2005.07.25;
Скачать: CL | DM;
Вниз
Указатель на динамический массив Найти похожие ветки
← →
VasRog (2005-07-07 19:57) [0]Как создать указатель на динамический массив? Делаю так:
Type
PHeiGht = ^THeiGht;
THeiGht = array of array of inteGer;
var
Z : THeiGht;
Z_L: PHeiGht;
beGin
.................
SetLenGth(Z,Ny,Nx);
For j:=0 to Ny - 1 do
For i:= 0 to Nx - 1 do
Cosin_L[j,i]:=@Cosin[j,i]
Не проходит.
...................
end;
Или так:
beGin
.................
SetLenGth(Z,Ny,Nx);
Z_L:=@Z;
Проходит, но как-то странно себя потом прога ведет.
...................
end;
Подскажите, пожалуйста, как нужно правильно сделать?
← →
begin...end © (2005-07-07 20:15) [1]А зачем это нужно?
← →
palva © (2005-07-07 20:23) [2]А разве бывают двумерные динамические массивы?
У вас объявлен динамический массив, состоящий из динамических массивов. Указателя здесь использовать не нужно. Но нужно на каждый динамический массив перед его использованием выдать свой SetLength. Например:
{$APPTYPE CONSOLE}
var
z: array of array of Integer;
begin
SetLength(z,3);
SetLength(z[0],4);
SetLength(z[1],5);
SetLength(z[2],6);
z[0,3] := 432;
WriteLn(z[0,3]);
end.
← →
begin...end © (2005-07-07 20:27) [3]> palva © (07.07.05 20:23) [2]
> А разве бывают двумерные динамические массивы?
Бывают.
> Но нужно на каждый динамический массив перед его
> использованием выдать свой SetLength.
Не нужно. Автор создаёт прямоугольный массив Nx * Ny. В этом случае можно вызвать SetLength один раз, с несколькими параметрами.
← →
VasRog (2005-07-07 20:34) [4]
> palva © (07.07.05 20:23) [2]
Впринципе вы правы насчет объявления. Но для более общего случая. Для прямоугольного же массива вот что Help нам выдает.
To declare multidimensional dynamic arrays, use iterated array of ... constructions. For example,
type TMessageGrid = array of array of string;
var Msgs: TMessageGrid;
declares a two-dimensional array of strings. To instantiate this array, call SetLength with two integer arguments. For example, if I and J are integer-valued variables,
SetLength(Msgs,I,J);
allocates an I-by-J array, and Msgs[0,0] denotes an element of that array.
Но насчет указателей я не понял. Если мне нужно создать массив указателей на динамический массив, то как я должен поступить? Далее этот массив указателей я собираюсь использовать для его (массива) сортировки.
← →
begin...end © (2005-07-07 20:39) [5]> VasRog (07.07.05 20:34) [4]
> Но насчет указателей я не понял. Если мне нужно
> создать массив указателей на динамический массив, то
> как я должен поступить?
Я тоже ничего не понял. Переменная динамического массива -- это уже указатель. Поэтому непонятно, зачем нужен указатель на указатель.
Или нужно создать массив указателей на элементы массива? Тоже не совсем понятно, зачем, и при чём тут сортировка.
← →
VasRog (2005-07-07 20:44) [6]
> Или нужно создать массив указателей на элементы массива?
Ну да. Массив указателей. Каждый элемент этого массива - это указатель на соответствующий элемент другого массива. И как сие сделать?
← →
palva © (2005-07-07 20:53) [7]> и при чём тут сортировка
Понял. Он хочет сортировать строки матрицы переставляя указатели на эти строки. Наверно динамические массивы можно переставить, если предварительно преобразовать их в Integer.
← →
begin...end © (2005-07-07 20:54) [8]> VasRog (07.07.05 20:44) [6]
type
TElementArray = array of array of Integer;
TPointerArray = array of array of Pointer; // Или array of array of PInteger
const
Nx = ...;
Ny = ...;
var
I, J: Integer;
Z: TElementArray;
ZL: TPointerArray;
begin
SetLength(Z, Nx, Ny);
... // Заполнение массива TElementArray
// Теперь устанавливаем длину массива указателей равной длине массива элементов...
SetLength(ZL, Nx, Ny);
// ...и присваиваем каждому элементу этого массива нужное значение --
// -- адрес соответствующего элемента в массиве Z
for I := 0 to Nx - 1 do
for J := 0 to Ny - 1 do
ZL[I, J] := @Z[I, J];
... // Массив ZL заполнен: теперь каждый его элемент представляет собой
... // указатель на соответствующий элемент массива Z
end.
← →
VasRog (2005-07-07 21:04) [9]Именно!!!
Гигантское спасибо. :)
← →
evvcom © (2005-07-08 00:03) [10]
> Наверно динамические массивы можно переставить, если предварительно
> преобразовать их в Integer.
массив преобразовать в Integer нельзя, т.к. в общем случае заранее неизвестно количество байт, отведенное (отводимое) под массив, тогда как под переменную Integer отводится в данной версии Delphi 4 байта.
А указатели действительно можно переставить, и для этого совсем необязательно заводить еще один "массив указателей".
Страницы: 1 вся ветка
Текущий архив: 2005.07.25;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.016 c