Современный Фортран_учебник
.pdf127
% 47. & #
5 ', $ |
#$ |
# |
|
||||
|
|
|
|||||
Program |
Function (X) |
Память под массив- |
|||||
Real,dimension(:) :: X |
real,intent(in),& |
аргумент распреде- |
|||||
Неправильно: в главной: размер- |
dimension(:)::X |
лена в вызывающей |
|||||
ность |
неизвестна, а надо |
Integer N |
программе. В проце- |
||||
allocatable или константу |
N=size(X) |
дуре массив не ста- |
|||||
Function ( N, X ) |
|
тический, не динами- |
|||||
Integer,intent(in)::N |
В процедуре отложенное (defer- |
ческий – он перени- |
|||||
Real,dimension(1:N) :: X |
red) определение размерности. |
мает адрес и размер- |
|||||
нехорошо, размерность N – вели- |
N – лучше измерить при помощи |
ность у фактического |
|||||
встроенной функции N=size(X) |
аргумента.. |
|
|||||
чина, зависящая от X |
|
||||||
|
|
|
|
|
|||
Function (X) |
Pure Function (X) |
|
|
|
|
||
Real,dimension(:) :: X |
|
|
|
|
|||
real,intent(in),& |
intent |
– |
атрибут |
||||
для аргумента X нет |
|||||||
dimension(:)::X |
аргумента процедуры |
||||||
intent(in), |
|||||||
есть pure – будет сообщение |
|
|
|
|
|||
но сообщения нет |
|
|
|
|
|||
|
|
|
|
|
|||
Program |
Function (N) |
автоматический |
ди- |
||||
намический |
массив |
||||||
Integer::N |
Integer,intent(in)::N |
||||||
размещается |
авто- |
||||||
Real,dimension(1:N) :: X |
Real,dimension(1:N) :: X |
||||||
матически при входе, |
|||||||
Размерность статического масси- |
Размерность – переменная, |
||||||
освобождается – при |
|||||||
ва – только константа |
только в процедуре |
||||||
выходе из процедуры |
|||||||
|
|
|
|||||
Program unallocated |
allocate(y(1:size(x)).. |
Процедура правиль- |
|||||
contains |
|||||||
Real,dimension(1:4)::X=1 |
ная, а в главной за- |
||||||
subroutine s (x, y) |
|||||||
real,allocatable, & |
были allocate |
||||||
real,intent(in),& |
|||||||
|
dimension(:)::y |
В результате видим |
|||||
|
dimension(:)::X |
||||||
open(1,file='su.txt') |
|
y= |
|
|
|||
real,intent(out),& |
|
|
|
||||
allocate(y(1:size(x))) |
Вместо правильного |
||||||
dimension(:)::Y |
|||||||
call |
s(x,y) |
y= 1. 1. 1. 1. |
|
||||
y=x |
|
||||||
write(1,*) 'y=', y |
при наличии |
|
|||||
End subroutine s |
|
||||||
.. |
|
allocate |
|
||||
|
EndProgram unallocated |
|
|||||
|
|
|
|
|
|
||
Program unallocated |
allocate(y(1:size(x))) |
|
|
|
|
||
Real,dimension(1:4)::X=1 |
.. contains |
|
|
|
|
||
real,allocatable, & |
subroutine s(x,y) |
Процедура правиль- |
|||||
|
dimension(:)::y |
real,intent(in),& |
ная, а в главной за- |
||||
open(1,file='su.txt') |
dimension(:)::X |
были allocate. |
|||||
|
! allocate(y) |
real,intent(out), & |
В результате массив |
||||
call |
s(x,y) |
dimension(1:size(x))::y |
y имеет неопреде- |
||||
write(1,*) 'y=',y |
Y=X |
ленный адрес. |
|
||||
contains |
End subroutine s |
|
|
|
|
||
.. |
|
endProgram unallocated |
|
|
|
|
|
|
|
|
|
|
|
||
Function si(X) |
Function si(X) |
массивоподобной |
|
||||
Real :: si |
real,dimension(:) :: si |
|
|||||
функции забыли дать |
|||||||
real,intent(in),& |
real,intent(in),& |
||||||
атрибут |
массива |
– |
|||||
dimension(:)::X |
dimension(:)::X |
||||||
dimension |
|
|
|||||
si=sin(X) |
si=sin(X) |
|
|
||||
|
|
|
|