- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I have a simple program in fortran 77 that I want to pass dynamic array size between the program and the subroutine.
But I encountered a problem with the compiling
the code is as below
program read_sub ! ********************** Main program ********************************* implicit none integer :: cm(30),n,i,nstress integer,allocatable,dimension(:),pointer :: stress n=30 nstress=size(cm) allocate stress(nstress) do i=1,n cm(i)=10 enddo CALL umat(cm,stress,n,nstress) end program read_sub subroutine umat(cm,stress,n,nstress) integer :: cm(30),n,i,nstress integer :: stress(nstress) do i=1,nstress stress(i)=cm(i)+10 write(*,*) stress(i) enddo end
I think allocate and size doesn't work with fortran 77 but I am not sure.
Any help will be appreciated
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This program is certainly NOT Fortran 77! Not even close!
You have some syntax errors in the program:
1) The ALLOCATE needs to be allocate(stress(nstress))
2) You can't give a variable both the ALLOCATABLE and POINTER attributes. Remove POINTER.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Steve Lionel (Ret.) wrote:
This program is certainly NOT Fortran 77! Not even close!
You have some syntax errors in the program:
1) The ALLOCATE needs to be allocate(stress(nstress))
2) You can't give a variable both the ALLOCATABLE and POINTER attributes. Remove POINTER.
Thank you for your reply, I make the changes as you suggested and the program works fine using Visual studio 12
I changed the declaration of the array cm(30) to cm(*) because the software that uses this subroutine declares cm as cm(*)
But it doesn't work
So I tried to use cm(:) insted but also I got this error msg
the error SIZE of array is not computable. [SIZE]
The final subroutine should be like this,
subroutine read_sub ! ********************** Main program ********************************* implicit none integer :: cm(*),n,i,nstress integer,allocatable,dimension(:) :: stress n=30 nstress=size(cm) allocate(stress(nstress)) do i=1,n cm(i)=10 enddo CALL umat(cm,stress,n,nstress) end program read_sub subroutine umat(cm,stress,n,nstress) integer :: cm(30),n,i,nstress integer :: stress(nstress) do i=1,nstress stress(i)=cm(i)+15 write(*,*) stress(i) enddo end
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
(*) means "assumed-size" and is valid for dummy arguments only. It means that the size of the array is not known. You should keep the (30) in the main program, or set it to whatever value you want for the size of cm. You could also make it ALLOCATABLE and allocate it to the desired size.
Use of (*) is considered a poor practice nowadays, though it was used a lot in the past. The more modern approach is to declare the dummy argument assumed-shape, with the syntax (:) - this will cause the size to be passed directly by the caller, but this requires an explicit interface to be visible.
Another approach you could take - since nstress has the size of cm you can declare cm in the subroutine as cm(nstress). Just move the declaration of nstress to before that of cm to be standard-conforming.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I want to thank you Mr. Lionel for your help. I tried your last suggestion but it does not work.
program read_sub
! ********************** Main program ********************************* implicit none integer :: nstress,cm(nstress),n,i integer,allocatable,dimension(:) :: stress n=30 nstress=size(cm) allocate(stress(nstress)) do i=1,n cm(i)=10 enddo CALL umat(cm,stress,n,nstress) end program read_sub subroutine umat(cm,stress,n,nstress) integer :: nstress,cm(nstress),n,i integer :: stress(nstress) do i=1,nstress stress(i)=cm(i)+15 write(*,*) stress(i) enddo end
I will see my professor if bounding the array up to 30 is ok.
Thank you very much
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You have made inconsistent changes to parts of the program. It is not clear to me what you want the program to do, so I shall confine my comments to the code that you showed in #5.
You cannot use nstress as the dimension of the statically allocated array cm in the main program. You may use a literal or named constant ("parameter" attribute in Fortran) for this purpose.
The argument n is not used in the subroutine, and could perhaps be omitted.
To use the "END PROGRAM <progname>" statement, you need to start the program with a "PROGRAM <progname>" statement, and the two prog-names must be identical.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page