Subroutine in subroutine argument problem

AI Thread Summary
The discussion revolves around issues encountered when trying to pass a subroutine named "funcs" as an argument to another subroutine "subr" in Fortran. The original poster faces errors related to the declaration of "funcs," specifically receiving messages about it not being explicitly declared or being called as a non-subroutine. Participants clarify that in Fortran, it's crucial to distinguish between subroutines and functions, as they have different calling conventions. To resolve the errors, it is suggested that "funcs" should be declared as "EXTERNAL" in the main program to prevent the compiler from misinterpreting it as a variable. Additionally, if "funcs" is indeed a subroutine, it does not require a type declaration (like REAL or INTEGER), but the EXTERNAL declaration is necessary to ensure proper function when passed as an argument. The conversation highlights the importance of understanding these distinctions and the correct declarations in Fortran programming.
snipertje
Messages
11
Reaction score
0
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?
 
Technology news on Phys.org
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.
 
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.
 
Assuming this really is Fortran...

snipertje said:
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:
jtbell said:
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.
 
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.
 
Ok, cheers
 
Back
Top