Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Рваные массивы 
:(
    Опции темы
sdron
Дата 17.10.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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(:)    


PM MAIL   Вверх
popovda
Дата 24.10.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



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

Код


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








Это сообщение отредактировал(а) popovda - 24.10.2007, 13:48


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
kamre
Дата 30.10.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: нет
Всего: 13



Можно вот так попробывать:
Код

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) = ...
...


PM MAIL   Вверх
popovda
Дата 31.10.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



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


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
Cr@$h
Дата 17.1.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



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

type(integer) :: int

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

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

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

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

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

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

Это сообщение отредактировал(а) Cr@$h - 17.1.2009, 18:38
PM MAIL ICQ   Вверх
Иванофф
Дата 18.1.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 8.9.2006

Репутация: нет
Всего: нет



"в Fortran -- массивы ссылок на производные типы, содержащие ссылки на массив"

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

A(2).р(1)=22

PM MAIL   Вверх
Cr@$h
Дата 18.1.2009, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



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

Я не говорю, что это плохо. Это фундаментальная особенность Fortran -- отсутствие массива ссылок.
В нормальной записи больше, чем два символа, не по одной букве же всё называют ;-)
PM MAIL ICQ   Вверх
Иванофф
Дата 18.1.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 8.9.2006

Репутация: нет
Всего: нет



Может это и хорошо, с точки зреня эффективности, ведь для этого фортран и нужен.
Динамические массивы Делфи я думаю реализованы менее эффективно.
PM MAIL   Вверх
Cr@$h
Дата 18.1.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Иванофф @  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) ==> 

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

Это сообщение отредактировал(а) Cr@$h - 18.1.2009, 14:10
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0760 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.