Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Рваные массивы


Автор: sdron 17.10.2007, 21:31
Приведу пример из DELPHI
type
  Tvector = array of integer;

procedure TForm1.Button1Click(Sender: TObject);
Var
A: array of Tvector;
begin

setlength(A,1,1);
A[0][0]:=0;
setlength(A,2,2);
A[1][0]:=1;
A[1][1]:=2;
setlength(A,3,4);
A[2][0]:=21;
A[2][1]:=22;
A[2][2]:=23;
A[2][3]:=24;

end;
end.
Таким образом я получил много векторов разной длины, а не матрицы.....
Как создать на фортране похожее, помогите, пожалуйста...
Я смог только объявить, а вот задать размерность не могу-выдает ошибку:


Type TVctr_ind
     integer, allocatable :: Array1 (:)
     !integer, dimension (5) :: Array
End Type Tvctr_ind

Type (TVctr_ind), allocatable :: Ind(:)    


Автор: popovda 24.10.2007, 13:48
У Вас, как я понял, вся проблема в том, чтобы создавать динамические массивы динамических векторов. Пример не смотрел, но первое, что приходит на ум - использовать здесь не атрибут allocatable, а атрибут pointer. (Внимательно читайте, где нельзя применять allocatable) Если же Вам нужны именно матрицы, то тогда размерности массива надо указывать так 

Код


........., allocatable(:,:) :: ......... - матрица (двумерный массив)
........., allocatable(:,:,:) :: ......... - гиперматрица, куб (в данном случае трехмерный массив)







Автор: kamre 30.10.2007, 20:22
Можно вот так попробывать:
Код

type vector
  integer, allocatable :: values(:)
end type vector

type (vector), allocatable :: vectors(:)

...
allocate(vectors(3))
allocate(vectors(1)%values(2))
allocate(vectors(2)%values(3))
allocate(vectors(3)%values(4))
vectors(1)%values(1) = ...
...


Автор: popovda 31.10.2007, 16:38
Абсолютно логично, только это уже по большому счету не матрица, а массив массивов различной длины.

Автор: Cr@$h 17.1.2009, 18:34
Сам с этим сталкивался.  A la рваные массивы. А всё потому, что в Fortran нельзя давать имена встроенным типам. В F09 можно будет писать:
Код

type(integer) :: int

Хотят. И я даже не знаю, как это отразится на:
Код

type(integer, allocatable, dimension(:)), allocatable :: int(:)

Собственно, ведь именно это и хотел автор темы.
Интересно другое. Это не то же самое, что:
Код

integer, allocatable, dimension(:) :: int(:)

Кстати, так писать даже нельзя!

Фундаментальная из-ряда-вон-выходящая-мораль: в Fortran массивов ссылок на массивы НЕТ! В С, С++ есть массивы указателей на массивы, в других -- массивы ссылок на массивы, в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив. Если кто покопается и найдёт что по этому поводу, дам по репе. Актуально как ни как.

Автор: Иванофф 18.1.2009, 01:58
"в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив"

непонятно чем это плохо? лишние два символа в записи, нужно ли что-то еще городить :

A(2).р(1)=22

Автор: Cr@$h 18.1.2009, 05:29
Цитата(Иванофф @  18.1.2009,  02:58 Найти цитируемый пост)
непонятно чем это плохо? лишние два символа в записи, нужно ли что-то еще городить :

Я не говорю, что это плохо. Это фундаментальная особенность Fortran -- отсутствие массива ссылок.
В нормальной записи больше, чем два символа, не по одной букве же всё называют ;-)

Автор: Иванофф 18.1.2009, 13:45
Может это и хорошо, с точки зреня эффективности, ведь для этого фортран и нужен.
Динамические массивы Делфи я думаю реализованы менее эффективно.

Автор: Cr@$h 18.1.2009, 14:10
Цитата(Иванофф @  18.1.2009,  14:45 Найти цитируемый пост)
Может это и хорошо, с точки зреня эффективности, ведь для этого фортран и нужен.
Динамические массивы Делфи я думаю реализованы менее эффективно. 

Можно попробовать разобраться.

Код

type vector
    integer, allocatable :: Vect(:)
end type vector
type (vector), allocatable :: VectOfVect(:)

vs.
Код

type(integer, allocatable, dimension(:)), allocatable :: VectOfPoint(:)


В первом случае значением VectOfVect является адрес описателя, содержащего информацию о длине массива векторов и т.п.:

VectOfVect(:) ==> 

Значением каждого элемента этого массива является адрес описателя, содержащего информацию о полях экземпляра типа vector:

VectOfVect(i) ==> 

Значением поля Vect каждого этого экземпляра является адрес описателя, содержащего информацию о длине массива целых и т.п.:

VectOfVect(i)%Vect(:) ==> 

Значением каждого элемента этого вектора адрес на целое.

VectOfVect(i)%Vect(j) ==> 

vs.

Во втором случае значением VectOfPoint является адрес описателя, содержащего информацию о длине массива векторов и т.п.:

VectOfPoint(:) ==> 

Значением каждого элемента этого массива является адрес описателя, содержащего информацию о длине массива целых и т.п.:

VectOfPoint(i)(:) ==> 

Значением каждого элемента этого вектора является адрес на целое.

VectOfPoint(i)(j) ==> 

И чем первый вариант лучше? Видим, что в нём каждый внутренний массив обрламлён экземпляром введённого типа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)