![]() |
|
![]() ![]() ![]() |
|
sdron |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 17.10.2007 Репутация: нет Всего: нет |
Приведу пример из 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 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
У Вас, как я понял, вся проблема в том, чтобы создавать динамические массивы динамических векторов. Пример не смотрел, но первое, что приходит на ум - использовать здесь не атрибут allocatable, а атрибут pointer. (Внимательно читайте, где нельзя применять allocatable) Если же Вам нужны именно матрицы, то тогда размерности массива надо указывать так
Это сообщение отредактировал(а) popovda - 24.10.2007, 13:48 -------------------- С уважением, Попов Д.А. |
|||
|
||||
kamre |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: нет Всего: 13 |
Можно вот так попробывать:
|
|||
|
||||
popovda |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Абсолютно логично, только это уже по большому счету не матрица, а массив массивов различной длины.
-------------------- С уважением, Попов Д.А. |
|||
|
||||
Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Сам с этим сталкивался. A la рваные массивы. А всё потому, что в Fortran нельзя давать имена встроенным типам. В F09 можно будет писать:
Хотят. И я даже не знаю, как это отразится на:
Собственно, ведь именно это и хотел автор темы. Интересно другое. Это не то же самое, что:
Кстати, так писать даже нельзя! Фундаментальная из-ряда-вон-выходящая-мораль: в Fortran массивов ссылок на массивы НЕТ! В С, С++ есть массивы указателей на массивы, в других -- массивы ссылок на массивы, в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив. Если кто покопается и найдёт что по этому поводу, дам по репе. Актуально как ни как. Это сообщение отредактировал(а) Cr@$h - 17.1.2009, 18:38 |
||||||
|
|||||||
Иванофф |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
"в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив"
непонятно чем это плохо? лишние два символа в записи, нужно ли что-то еще городить : A(2).р(1)=22 |
|||
|
||||
Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
Иванофф |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
Может это и хорошо, с точки зреня эффективности, ведь для этого фортран и нужен.
Динамические массивы Делфи я думаю реализованы менее эффективно. |
|||
|
||||
Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Можно попробовать разобраться.
vs.
В первом случае значением VectOfVect является адрес описателя, содержащего информацию о длине массива векторов и т.п.: VectOfVect(:) ==> Значением каждого элемента этого массива является адрес описателя, содержащего информацию о полях экземпляра типа vector: VectOfVect(i) ==> Значением поля Vect каждого этого экземпляра является адрес описателя, содержащего информацию о длине массива целых и т.п.: VectOfVect(i)%Vect(:) ==> Значением каждого элемента этого вектора адрес на целое. VectOfVect(i)%Vect(j) ==> vs. Во втором случае значением VectOfPoint является адрес описателя, содержащего информацию о длине массива векторов и т.п.: VectOfPoint(:) ==> Значением каждого элемента этого массива является адрес описателя, содержащего информацию о длине массива целых и т.п.: VectOfPoint(i)(:) ==> Значением каждого элемента этого вектора является адрес на целое. VectOfPoint(i)(j) ==> И чем первый вариант лучше? Видим, что в нём каждый внутренний массив обрламлён экземпляром введённого типа. Это сообщение отредактировал(а) Cr@$h - 18.1.2009, 14:10 |
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Fortran | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |