Subroutine in subroutine argument problem

  • Thread starter snipertje
  • Start date
  • #1
11
0

Main Question or Discussion Point

I'm having a problem with the argument of a subroutine which I didn't write myself, but should be working as intended.

I'm supposed to write my own subroutine named funcs(a,b,c). Then this subroutine that I got has funcs as one of it's arguments subr(a,b,c,funcs,..) and it says in the description of the subroutine that I must provide a subroutine funcs to make subr(a,b,c,funcs,..) work.

The problem is when I don't declare funcs (Real/integer....) I get an error that funcs is not explicitly declared.. When I do declare funcs, i get an error that i 'attempt to call a non-subroutine'.

Is there a way to pass my subroutine to the other subroutine?
 

Answers and Replies

  • #2
Borek
Mentor
28,476
2,873
I did my best to read your mind to find out what programming language you are using, but the distance is too large. Sorry, I can't help.
 
  • #3
33,738
5,427
Based on the OP's other posts, I believe he is coding in Fortran. It apparently is possible to pass subroutine names as actual arguments to subroutines, according to this link: http://www.fortran.com/F77_std/rjcnf0001-sh-15.html.
See 15.5.2.2 Actual Arguments for an External Function, and 15.6.2.3 Actual Arguments for a Subroutine on the linked page.

snipertje,
Be sure you understand the distinction between a FUNCTION subprogram and a SUBROUTINE subprogram. You are calling 'funcs' a subroutine, but from its name, I suspect that is actually a function. There are differences between these two types of subprogram, both in the way that they are called, and whether they return a value.
 
  • #4
jtbell
Mentor
15,585
3,561
Assuming this really is Fortran...

The problem is when I don't declare funcs (Real/integer....) I get an error that funcs is not explicitly declared.. When I do declare funcs, i get an error that i 'attempt to call a non-subroutine'.
In addition to declaring the function name (in the main program) as real/integer/whatever, I think you must also declare it as "external" so that the compiler doesn't assume that it's a variable, e.g.

REAL FUNCS
EXTERNAL FUNCS

I remember having to do this when I used the "function name as subroutine argument" technique a long time ago. As I recall, the reason you don't have to do this when you call FUNCS in the normal way in your program, is that the compiler can determine from the syntax that it's a function. That is, if you have something like FUNCS(A,B,C) and you haven't declared FUNCS as an array, then it must be a function call. However, if you have CALL SUBR(A,B,C,FUNCS), the compiler assumes FUNCS is a variable unless you tell it otherwise via the EXTERNAL declaration.

(It beats me how I remember all this stuff. It's been about fifteen years since I did any Fortran programming!)
 
Last edited:
  • #5
11
0
Assuming this really is Fortran...



In addition to declaring the function name (in the main program) as real/integer/whatever, I think you must also declare it as "external" so that the compiler doesn't assume that it's a variable, e.g.

REAL FUNCS
EXTERNAL FUNCS

I remember having to do this when I used the "function name as subroutine argument" technique a long time ago. As I recall, the reason you don't have to do this when you call FUNCS in the normal way in your program, is that the compiler can determine from the syntax that it's a function. That is, if you have something like FUNCS(A,B,C) and you haven't declared FUNCS as an array, then it must be a function call. However, if you have CALL SUBR(A,B,C,FUNCS), the compiler assumes FUNCS is a variable unless you tell it otherwise via the EXTERNAL declaration.

(It beats me how I remember all this stuff. It's been about fifteen years since I did any Fortran programming!)
Wow, this is really helpful (if it works anyway ;)). It's indeed confusing that I have to name a subroutine funcs, but I'm positive it has to be a subroutine. I will try this out.
 
  • #6
jtbell
Mentor
15,585
3,561
If it really is a SUBROUTINE subprogram and not a FUNCTION subprogram, then you shouldn't have to declare a type (REAL, INTEGER, etc.), because SUBROUTINEs don't have a type, but you still need to declare it EXTERNAL. Declaring it EXTERNAL will probably remove the "not explicity declared" error message, by itself.
 
  • #7
11
0
Ok, cheers
 

Related Threads on Subroutine in subroutine argument problem

Replies
5
Views
4K
Replies
4
Views
1K
Replies
9
Views
830
Replies
10
Views
6K
Replies
2
Views
2K
Replies
4
Views
9K
  • Last Post
Replies
3
Views
2K
  • Last Post
Replies
3
Views
5K
Replies
8
Views
2K
Top