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

Вниз

Указатель на динамический массив   Найти похожие ветки 

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

Наверх





Память: 0.47 MB
Время: 0.012 c
14-1120193061
DelphiNew
2005-07-01 08:44
2005.07.25
Мобильная меланхолия


9-1113162130
Ibrox
2005-04-10 23:42
2005.07.25
Текстуры в OpenGL


14-1120466749
Juice
2005-07-04 12:45
2005.07.25
C++ Абстрактность неабстрактоного класса


14-1120138292
Narik
2005-06-30 17:31
2005.07.25
Интернет браузер


6-1113550613
X-Disa
2005-04-15 11:36
2005.07.25
Проверка коннекта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский