Главная страница
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.036 c
1-1120894062
serguncho
2005-07-09 11:27
2005.07.25
Информация из Stringgrid на печать


1-1120829932
Vudu
2005-07-08 17:38
2005.07.25
Что за сообщение?


4-1117107607
Толян
2005-05-26 15:40
2005.07.25
Определение телефона при помощи модема


9-1112994430
Yegorchic
2005-04-09 01:07
2005.07.25
Модель Солн. Системы


14-1120099743
Soft
2005-06-30 06:49
2005.07.25
Вы хотели бы быть похоронены в гробу из системного блока?