Subroutine in subroutine argument problem

Click For Summary

Discussion Overview

The discussion revolves around a problem related to passing a subroutine as an argument to another subroutine in a programming context, specifically focusing on the Fortran language. Participants explore the requirements for declaring subroutines and the distinctions between subroutines and functions.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • The original poster (OP) describes an issue with declaring a subroutine named funcs when passing it as an argument to another subroutine, subr(a,b,c,funcs,..).
  • Some participants suggest that the OP is likely using Fortran and point out the possibility of passing subroutine names as arguments.
  • One participant emphasizes the need to distinguish between FUNCTION and SUBROUTINE subprograms, noting that they are called differently and have different return behaviors.
  • Several participants mention the necessity of declaring the subroutine as EXTERNAL to avoid the compiler assuming it is a variable.
  • One participant asserts that if funcs is indeed a SUBROUTINE, it should not require a type declaration, but still needs to be declared EXTERNAL.

Areas of Agreement / Disagreement

Participants generally agree on the need for an EXTERNAL declaration when passing subroutines as arguments, but there is some uncertainty regarding whether funcs is a subroutine or a function, and how this affects the required declarations.

Contextual Notes

There are unresolved aspects regarding the specific nature of funcs (whether it is a subroutine or a function) and the implications of this distinction on the required declarations.

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
 

Similar threads

  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 9 ·
Replies
9
Views
2K
  • · Replies 59 ·
2
Replies
59
Views
12K
  • · Replies 8 ·
Replies
8
Views
4K
Replies
1
Views
7K
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
13K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 14 ·
Replies
14
Views
4K
  • · Replies 3 ·
Replies
3
Views
2K