Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Subroutine in subroutine argument problem

  1. May 10, 2012 #1
    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?
     
  2. jcsd
  3. May 10, 2012 #2

    Borek

    User Avatar

    Staff: Mentor

    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.
     
  4. May 10, 2012 #3

    Mark44

    Staff: Mentor

    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.
     
  5. May 10, 2012 #4

    jtbell

    User Avatar

    Staff: Mentor

    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!)
     
    Last edited: May 10, 2012
  6. May 10, 2012 #5
    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.
     
  7. May 10, 2012 #6

    jtbell

    User Avatar

    Staff: Mentor

    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.
     
  8. May 10, 2012 #7
    Ok, cheers
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook