Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.042 c
3-1118124442
KotJunior
2005-06-07 10:07
2005.07.25
Как изменить размер поля базы данных...


6-1113417617
Sup
2005-04-13 22:40
2005.07.25
проблема с сокетами


3-1118394819
Andy Nortsov
2005-06-10 13:13
2005.07.25
Как правильно работать с ADO+ODBC+FireBird+Delphi?


14-1120142167
slaga
2005-06-30 18:36
2005.07.25
Как узнать експортируемые процедуры и функции "вражеской" dll ки


6-1111342234
Matrex
2005-03-20 21:10
2005.07.25
как вызвать стандартное окно "Соединение с..."