Массивы и производные типы - PullRequest
6 голосов
/ 18 апреля 2009

Для моего нового проекта я должен использовать массив вместо чистого файла для хранения информации от пользователей. Для этого мне тоже нужно создавать производные типы.

Однако я не понял, что такое массив и что такое производный тип, как его использовать, что они могут делать и какие-то другие основные идеи. Кто-нибудь может дать мне некоторую информацию о массиве и производных типах?

Я написал код для них, но я не знаю, что он написан правильно. Если кто-нибудь может проверить это для меня, я был бы признателен.

Вот мой массив и производные типы:

! derived type
TYPE Bank
  INTEGER :: acNumber, acChecks
  REAL :: acBlance, acRate
  CHARACTER :: acType*1, acLName*15, acFName*15
END TYPE

! array
INTEGER, PARAMETER :: MaxRow, MaxColum = 7
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData

Ответы [ 2 ]

6 голосов
/ 20 апреля 2009

Если вы программист на фортране, вы, вероятно, видели подпрограмму, принимающую 10/15 аргументов. Если вы думаете об этом, это безумие (их слишком много, вы рискуете их поменять), и вы быстро понимаете, что некоторые аргументы всегда идут вместе. Было бы целесообразно объединить их в единую сущность, которая несет в себе все как единое целое, а не как независимые сущности. Это значительно уменьшит количество аргументов, предоставляя вам только бремя для поиска правильной связи. Эта единая сущность является типом.

В своем коде вы говорите, что Банк является совокупностью этой информации. Теперь вы можете объявить конкретную переменную этого типа, которая будет представлять и предоставлять доступ к отдельным переменным acNumber, acChecks и так далее. Для этого вы должны использовать символ%. так что если ваша банковская переменная называется b, вы можете сказать, например,

b%acNumber = 5

Вы можете представить себе b как шкаф, содержащий разные полки. Вы перемещаете закрытые, все полки и их содержимое перемещаются вместе.

Массив - это группа объектов одного типа (скажем, целое число или символ (len = 1024), или банк), и они располагаются один за другим, поэтому вы можете получить доступ к каждому из них с помощью числового индекса. Помните, что, если не указано иное, индексы массивов в фортране начинаются с 1 (во всех других основных языках вместо этого первый индекс равен нулю)

Что касается вашего кода, я предлагаю вам:

  • запись

     INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData 
    

    а

     INTEGER :: AccountData(MaxRow,MaxColum)
    

    это то же самое, но ты пишешь меньше. Также обратите внимание, что есть разница между использованием: и,. Если вы хотите определить матрицу (ваш случай), которая является двумерным массивом, вы должны использовать запятую. То, что вы написали, неверно.

  • для строк, лучше написать

     CHARACTER :: acType*1, acLName*15, acFName*15
    

    как

     CHARACTER(LEN=1) :: acType
     CHARACTER(LEN=15) :: acLName
     CHARACTER(LEN=15) :: acFName
    

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

  • Для MaxRows и MaxColumns я бы написал их как MAX_ROWS и MAX_COLUMNS. Параметры и прочее, которые по традиции очень постоянны, обозначаются заглавными буквами, подчеркиваемыми в любом главном языке.


Редактировать : чтобы ответить на ваш комментарий, вот пример использования массива

$ more foo.f90 
program test
    integer :: myarray(10)

    myarray = 0   ! equivalent to zeroing the single elements one by one
    myarray(2) = 5
    myarray(7) = 10

    print *, myarray

end program
$ g95 foo.f90 -o foo
$ ./foo
 0 5 0 0 0 0 10 0 0 0

массив похож на несколько переменных с одинаковыми именами, идентифицированными индексом. Очень полезно для выражения векторов или матриц. Конечно, вы можете создать массив определенного вами агрегированного типа вместо предопределенного типа (например, целое число).

0 голосов
/ 19 апреля 2009

Массив - это упорядоченный список переменных одного типа, проиндексированных целыми числами. См. Array в Википедии. . Обратите внимание, что индексирование массивов на Фортране более гибко, чем в большинстве других языков низкого уровня, поскольку вместо одного индекса на измерение вы можете иметь триплет индекса, состоящий из нижней границы, верхней границы, и шагать В этом случае lvalue выражения является подмассивом, а не отдельным элементом типа массива.

Производный тип - это составной тип, определенный пользователями, который состоит из нескольких компонентов, которые могут быть разных типов. В некоторых других языках они известны как структуры, типы структур или типы записей. См. Запись в Википедии

Вы также можете создать массив производного типа или иметь производный тип, в котором один или несколько компонентов сами являются массивами или, в этом отношении, другими производными типами. Вам решать!

Самый простой способ проверить ваш код - это попробовать скомпилировать его. Преодоление компилятора, конечно, не является гарантией того, что программа работает должным образом, но это, безусловно, обязательный шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...