| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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) Если же Вам нужны именно матрицы, то тогда размерности массива надо указывать так
|
| Автор: kamre 30.10.2007, 20:22 | ||
Можно вот так попробывать:
|
| Автор: popovda 31.10.2007, 16:38 |
| Абсолютно логично, только это уже по большому счету не матрица, а массив массивов различной длины. |
| Автор: Cr@$h 17.1.2009, 18:34 | ||||||
Сам с этим сталкивался. A la рваные массивы. А всё потому, что в Fortran нельзя давать имена встроенным типам. В F09 можно будет писать:
Хотят. И я даже не знаю, как это отразится на:
Собственно, ведь именно это и хотел автор темы. Интересно другое. Это не то же самое, что:
Кстати, так писать даже нельзя! Фундаментальная из-ряда-вон-выходящая-мораль: в Fortran массивов ссылок на массивы НЕТ! В С, С++ есть массивы указателей на массивы, в других -- массивы ссылок на массивы, в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив. Если кто покопается и найдёт что по этому поводу, дам по репе. Актуально как ни как. |
| Автор: Иванофф 18.1.2009, 01:58 |
| "в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив" непонятно чем это плохо? лишние два символа в записи, нужно ли что-то еще городить : A(2).р(1)=22 |
| Автор: Иванофф 18.1.2009, 13:45 |
| Может это и хорошо, с точки зреня эффективности, ведь для этого фортран и нужен. Динамические массивы Делфи я думаю реализованы менее эффективно. |
| Автор: Cr@$h 18.1.2009, 14:10 | ||||||
Можно попробовать разобраться.
vs.
В первом случае значением VectOfVect является адрес описателя, содержащего информацию о длине массива векторов и т.п.: VectOfVect(:) ==> Значением каждого элемента этого массива является адрес описателя, содержащего информацию о полях экземпляра типа vector: VectOfVect(i) ==> Значением поля Vect каждого этого экземпляра является адрес описателя, содержащего информацию о длине массива целых и т.п.: VectOfVect(i)%Vect(:) ==> Значением каждого элемента этого вектора адрес на целое. VectOfVect(i)%Vect(j) ==> vs. Во втором случае значением VectOfPoint является адрес описателя, содержащего информацию о длине массива векторов и т.п.: VectOfPoint(:) ==> Значением каждого элемента этого массива является адрес описателя, содержащего информацию о длине массива целых и т.п.: VectOfPoint(i)(:) ==> Значением каждого элемента этого вектора является адрес на целое. VectOfPoint(i)(j) ==> И чем первый вариант лучше? Видим, что в нём каждый внутренний массив обрламлён экземпляром введённого типа. |