Fortran, passing an array to multiple subroutines

Click For Summary

Discussion Overview

The discussion revolves around passing an array to subroutines in Fortran, specifically addressing the issue of unintended modification of the original array when performing operations within a subroutine. Participants explore different methods to prevent the original array from being altered, focusing on Fortran 77 solutions.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes a scenario where an array is passed to a subroutine for logarithmic computation, but the original array is altered, leading to confusion about how to maintain its original values.
  • Another participant suggests using the %VAL function to pass the array by value, noting that this function is not standard in Fortran 77.
  • A different approach is proposed, where a new array is defined within the subroutine to store the logarithmic values, thereby leaving the original array intact.
  • One participant expresses uncertainty about the implications of the "real :: ar(n)" declaration in the original code, questioning its effect on the array's behavior.
  • A later reply confirms that defining a new array resolved the issue of overwriting the original array.

Areas of Agreement / Disagreement

Participants generally agree on the need to prevent the original array from being modified, but multiple approaches are discussed without a consensus on the best method. Some methods are proposed as alternatives, but no single solution is universally accepted.

Contextual Notes

Limitations include the potential lack of access to certain functions like %VAL in standard Fortran 77, and the need for clarity on array handling and memory management in subroutines.

Who May Find This Useful

This discussion may be useful for programmers working with Fortran, particularly those dealing with array manipulation and subroutine design in Fortran 77.

Biederman
Messages
9
Reaction score
0
Hi guys,

I am kind of a newbie to fortran and I'd like to ask a simple question.


In the code below, I have a main program with one subroutine. It's a simple one.
In the main code I am filling an array with elements from 1 to 10. Then I am passing this array to a subroutine "sub", where I am computing the logarithms of the array elements. However, I don't want to return the array back into the main program. In fact, I want the the logarithms to be calculated in the subroutine only.
However, when I print the array elements just after the call to the subroutine, I notice that the array elements are actually the logarithms of the latter. When I print the elements before to the call of the subroutine, the elements print fine i.e 1,2,3,4...etc. How do say fortran not to alter the array elements in the main program. I am asking this because later, I need to pass the original array elements to a second subroutine. That is, if a call a second subroutine e.g "sub2" with the same arguments as the first one, I notice that the main program actually passes the logarithms i.e the elements which have been calculated in the first subroutine.

I hope my question is clear enough.

BTW: I prefer to use fortran 77. So, if you can help me by providing a fortran 77 solution, I'd appreciate that!



c***********************************************************************
implicit none

integer i,n
parameter(n=10)
real arr(n)
c***********************************************************************

do i = 1, 10
arr(i) = real(i)
end do

print*,arr ! here it prints: 1,2,3,4 ...etc which is what I want

call sub(n,arr)

print*,arr ! here it prints the logarithm of the values, which is not what I want. I'd like the origininal array because I am going to pass it to another subroutine.

end
c***********************************************************************
subroutine sub(n,ar)

integer i,n
real :: ar(n)

do i = 1, 10
ar(i) = alog10(ar(i))
end do

end
 
Technology news on Phys.org
You need to pass by value, not by reference. You could try this:

call sub(n,%VAL(arr))

The %VAL function is not standard in FORTRAN77, though. I take that to mean you might have access to it, or you might not. See this reference.
 
Ackbeet said:
You need to pass by value, not by reference. You could try this:

call sub(n,%VAL(arr))

The %VAL function is not standard in FORTRAN77, though. I take that to mean you might have access to it, or you might not. See this reference.

Hi Ackbeet,

Thank you for the link!
If I wanted to pass all the elements by values then I'd use : call sub(n, arr(1:10))

But either way, it prints the logarithms after the "call" statement rather than the original array.
 
Well, another option would be to define a new array in the subroutine, and not overwrite the existing array. So your subroutine looks like this:

Code:
subroutine sub(n,ar)

integer i,n
real :: newar(n)

do i = 1, 10
newar(i) = alog10(ar(i))
end do

end

It's been awhile since I've done FORTRAN, so I'm not entirely sure what the "real :: ar(n)" line is doing in your original code. In any case, rest assured that if the argument 'ar' to the subroutine never appears on the LHS of an assignment operator, then it will remain in memory untouched.
 
Ackbeet said:
Well, another option would be to define a new array in the subroutine, and not overwrite the existing array. So your subroutine looks like this:

Code:
subroutine sub(n,ar)

integer i,n
real :: newar(n)

do i = 1, 10
newar(i) = alog10(ar(i))
end do

end

It's been awhile since I've done FORTRAN, so I'm not entirely sure what the "real :: ar(n)" line is doing in your original code. In any case, rest assured that if the argument 'ar' to the subroutine never appears on the LHS of an assignment operator, then it will remain in memory untouched.

Thanks Ackbeet! Defining a new array solved the problem. You're right, in that way I am not overwriting the old array.

I appreciate your help!

Regards,

Abedin
 
You're very welcome!
 

Similar threads

  • · Replies 20 ·
Replies
20
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 59 ·
2
Replies
59
Views
12K
  • · Replies 5 ·
Replies
5
Views
8K
  • · Replies 29 ·
Replies
29
Views
4K
  • · Replies 25 ·
Replies
25
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 11 ·
Replies
11
Views
2K