Home > Archive > Fortran > March 2008 > compiler switch -c
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
compiler switch -c
|
|
| Gerry Ford 2008-02-06, 7:16 pm |
| I'm using a new compiler and am uncertain about a variety of things,
beginning with the switches. When I type
gfortran -c fruit.f90
, it is meant to mimic
ifort -c fruit.f90
, which I thought, yields the intermediate files instead of an executable.
Indeed, five minutes ago I typed
gfortran -c fruit_util.f90
, and got a .o and .mod file out of it without objection. So I don't think
that my compiler switches are the problem, but since there is no page in the
manual that compares compiler switches among fortran vendors, I couldn't
know.
As to the specific complaints, there were many:
fruit.f90:343.28:
function get_last_message_
1
Error: Expected formal argument list in function definition at (1)
fruit.f90:344.50:
character(len=MSG_LENGTH) :: get_last_message_
1
Error: Symbol 'get_last_message_' at (1) has already been host associated
fruit.f90:345.30:
if (messageIndex > 1) then
1
Error: Unexpected block IF statement in CONTAINS section at (1)
fruit.f90:346.24:
get_last_message_ = strip(messageArray(messageIndex-1))
1
Error: Symbol 'get_last_message_' at (1) has already been host associated
fruit.f90:347.8:
else
1
Error: Unexpected ELSE statement in CONTAINS section at (1)
fruit.f90:348.24:
get_last_message_ = ''
1
Error: Symbol 'get_last_message_' at (1) has already been host associated
fruit.f90:349.7:
end if
1
Error: Expecting END MODULE statement at (1)
fruit.f90:350.5:
end function get_last_message_
1
Error: Expecting END MODULE statement at (1)
fruit.f90:428.26:
function is_last_passed_
1
Error: Expected formal argument list in function definition at (1)
fruit.f90:429.29:
logical:: is_last_passed_
1
Error: Symbol 'is_last_passed_' at (1) has already been host associated
fruit.f90:430.19:
is_last_passed_ = last_passed
1
Error: Symbol 'is_last_passed_' at (1) has already been host associated
fruit.f90:431.5:
end function is_last_passed_
1
Error: Expecting END MODULE statement at (1)
fruit.f90:54.39:
module procedure get_last_message_
1
Error: Procedure 'get_last_message_' in generic interface 'get_last_message'
at (1) is neither function nor subroutine
fruit.f90:58.37:
module procedure is_last_passed_
1
Error: Procedure 'is_last_passed_' in generic interface 'is_last_passed' at
(1) is neither function nor subroutine
# end comments by gfortran
As for the source, it's 27K. I can post it if that would help, but posting
it from the git-go points away from the likely culprit here: user error.
Grateful for any pointers.
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
| |
| Steven G. Kargl 2008-02-06, 7:16 pm |
| In article <1202332397_5659@sp12lax.superfeed.net>,
"Gerry Ford" <invalid@invalid.net> writes:
> I'm using a new compiler and am uncertain about a variety of things,
Clearly. :)
> beginning with the switches. When I type
> gfortran -c fruit.f90
> , it is meant to mimic
> ifort -c fruit.f90
gfortran's -c option comes from a long history of compilers
on Unix-like platforms. It is not meant to mimic ifort.
> , which I thought, yields the intermediate files instead of an executable.
> Indeed, five minutes ago I typed
> gfortran -c fruit_util.f90
> , and got a .o and .mod file out of it without objection.
If you got a .o and zero or more .mod files, then -c did its job.
> fruit.f90:343.28:
>
> function get_last_message_
> 1
> Error: Expected formal argument list in function definition at (1)
Without seeing source code and without knowing the exact gfortran
command and without knowing the version of gfortran, it is amazingly
difficult to give any advice.
--
Steve
http://troutmask.apl.washington.edu/~kargl/
| |
| Steve Lionel 2008-02-06, 7:16 pm |
| On Feb 6, 1:32 pm, ka...@troutmask.apl.washington.edu (Steven G.
Kargl) wrote:
> gfortran's -c option comes from a long history of compilers
> on Unix-like platforms. It is not meant to mimic ifort.
Indeed. In this case, ifort's -c option comes from the same long
history, so it is unsurprising that they behave similarly!
In general, though, it is unwise to assume that a switch for one
compiler does the same thing for a different compiler, or even the
same vendor's compiler across different platforms. For example, I
often see users compare optimization level numbers (eg, -O2) between
compilers. Similarly, using ifort as an example, -static means
something entirely different on Windows than on Linux. History again,
though in this case different histories, is the reason.
Read The Fine Manual.
Steve
| |
| e p chandler 2008-02-06, 7:16 pm |
| On Feb 6, 4:11=A0pm, "Gerry Ford" <inva...@invalid.net> wrote:
> I'm using a new compiler and am uncertain about =A0a variety of things,
> beginning with the switches. =A0When I type
> gfortran -c fruit.f90
> , it is meant to mimic
> ifort -c fruit.f90
> , which I thought, yields the intermediate files instead of an executable.=
> Indeed, five minutes ago I typed
> gfortran -c fruit_util.f90
> , and got a .o and .mod file out of it without objection. =A0So I don't th=
ink
> that my compiler switches are the problem, but since there is no page in t=
he
> manual that compares compiler switches among fortran vendors, I couldn't
> know.
>
> As to the specific complaints, there were many:
[snip]
>
> Grateful for any pointers.
>
> --
> Gerry Ford
IMO the documentation for GCC (Gnu Compiler Collection) components is
voluminous and difficult for the new user. I suggest you look at the
manual for g95 first. see http://www.g95.org and follow links to
documentation in PDF format. Both g95 and gfortran use a GCC back end,
so many command line options are the same or are similar.
Next, the gfortran manual and the gcc manuals are available online
see http://gcc.gnu.org/onlinedocs/
IMO it's best to defer a discussion of things like include files and
additional libraries until you have a specific example to work with.
HTH
-- e
| |
| Gerry Ford 2008-02-07, 4:32 am |
|
"e p chandler" <epc8@juno.com> wrote in message
news:82434cce-34ad-42d2-bd3c-de940a8a8708@k2g2000hse.googlegroups.com...
On Feb 6, 4:11 pm, "Gerry Ford" <inva...@invalid.net> wrote:
> I'm using a new compiler and am uncertain about a variety of things,
> beginning with the switches. When I type
> gfortran -c fruit.f90
> , it is meant to mimic
> ifort -c fruit.f90
> , which I thought, yields the intermediate files instead of an executable.
> Indeed, five minutes ago I typed
> gfortran -c fruit_util.f90
> , and got a .o and .mod file out of it without objection. So I don't think
> that my compiler switches are the problem, but since there is no page in
> the
> manual that compares compiler switches among fortran vendors, I couldn't
> know.
>
> As to the specific complaints, there were many:
[snip]
>
> Grateful for any pointers.
>
> --
> Gerry Ford
IMO the documentation for GCC (Gnu Compiler Collection) components is
voluminous and difficult for the new user. I suggest you look at the
manual for g95 first. see http://www.g95.org and follow links to
documentation in PDF format. Both g95 and gfortran use a GCC back end,
so many command line options are the same or are similar.
Next, the gfortran manual and the gcc manuals are available online
see http://gcc.gnu.org/onlinedocs/
IMO it's best to defer a discussion of things like include files and
additional libraries until you have a specific example to work with.
HTH
-- e
--->Thanks Elliot. I'll get to these downloads when my carrier pigeons are
done with other, fortran-related downloads.
Do have any thoughts on why my man folders are empty in my new gnu-related
syntax? Let me rephrase, with the risk of asking something completely
nonsensical. The instructions I often receive of " just man this" isn't
really good advice for me. I think it's the linux equivalent of us saying
"Call Microsoft." I was thinking the information in the man folder,
distinct from the doc folder, would be that which responded to the alleged
man command. (Now the question.) If open-source fortran distros had a man
folder, how would it be populated and with what content?
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
| |
| Gerry Ford 2008-02-07, 4:32 am |
|
"Steven G. Kargl" <kargl@troutmask.apl.washington.edu> wrote in message
news:fod916$a65$1@gnus01.u.washington.edu...
> In article <1202332397_5659@sp12lax.superfeed.net>,
> "Gerry Ford" <invalid@invalid.net> writes:
>
> Clearly. :)
>
>
> gfortran's -c option comes from a long history of compilers
> on Unix-like platforms. It is not meant to mimic ifort.
>
>
> If you got a .o and zero or more .mod files, then -c did its job.
>
>
> Without seeing source code and without knowing the exact gfortran
> command and without knowing the version of gfortran, it is amazingly
> difficult to give any advice.
#begin source for fruit.f90
!------------------------
! FORTRAN unit test utility
!
! Author: Andrew H. Chen meihome @at@ gmail.com
!------------------------
!
! Unit test framework for FORTRAN. (FoRtran UnIT)
!
! This package is to perform unit test for FORTRAN subroutines
!
! The method used most are: assert_true, assert_equals
!
! Coding convention:
! 1) All private subroutines end with underscore. i.e. init_fruit_
! 2) All methods must be exposed by interface. i.e. interface init_fruit
! 3) Variable and methods are lower case connected with underscores. i.e.
init_fruit_, and failed_assert_count
!
module fruit
use fruit_util
implicit none
integer, parameter :: MSG_LENGTH = 1500
integer, parameter :: MSG_STACK_SIZE = 300000
integer, private, save :: successful_assert_count = 0
integer, private, save :: failed_assert_count = 0
character (len = MSG_LENGTH), private, dimension (MSG_STACK_SIZE), save ::
messageArray
character (len = MSG_LENGTH), private, save :: msg = '[unit name not set
from set_name]: '
character (len = MSG_LENGTH), private, save :: unit_name = '_not_set_'
integer, private, save :: messageIndex = 1
integer, private, save :: successful_case_count = 0
integer, private, save :: failed_case_count = 0
integer, private, save :: testCaseIndex = 1
logical, private, save :: last_passed = .false.
interface init_fruit
module procedure init_fruit_
end interface
interface initializeFruit
module procedure obsolete_subroutine_delete_later_initial
izeFruit_
end interface
interface fruit_summary
module procedure fruit_summary_
end interface
interface getTestSummary
module procedure obsolete_subroutine_delete_later_getTest
Summary_
end interface
interface get_last_message
module procedure get_last_message_
end interface
interface is_last_passed
module procedure is_last_passed_
end interface
interface assert_true
module procedure assert_true_logical_
end interface
interface assertTrue
module procedure obsolete_delete_this_later_assert_true_l
ogical_
end interface
interface assert_equals
module procedure assert_equals_int_
module procedure assert_equals_double_
module procedure assert_equals_real_
module procedure assert_equals_logical_
module procedure assert_equals_string_
module procedure assert_equals_complex_
module procedure assert_equals_real_within_range_
module procedure assert_equals_double_within_range_
module procedure assert_equals_1d_int_
module procedure assert_equals_1d_double_
module procedure assert_equals_1d_real_
module procedure assert_equals_1d_string_
module procedure assert_equals_1d_complex_
module procedure assert_equals_1d_real_within_range_
module procedure assert_equals_1d_double_within_range_
module procedure assert_equals_2d_int_
module procedure assert_equals_2d_double_
module procedure assert_equals_2d_real_
module procedure assert_equals_2d_complex_
end interface
interface assertEquals
module procedure assert_equals_int_
module procedure assert_equals_double_
module procedure assert_equals_real_
module procedure assert_equals_logical_
module procedure assert_equals_string_
module procedure assert_equals_complex_
module procedure assert_equals_real_within_range_
module procedure assert_equals_double_within_range_
module procedure assert_equals_1d_int_
module procedure assert_equals_1d_double_
module procedure assert_equals_1d_real_
module procedure assert_equals_1d_string_
module procedure assert_equals_1d_complex_
module procedure assert_equals_1d_real_within_range_
module procedure assert_equals_1d_double_within_range_
module procedure assert_equals_2d_int_
module procedure assert_equals_2d_double_
module procedure assert_equals_2d_real_
module procedure assert_equals_2d_complex_
end interface
interface assert_not_equals
module procedure assert_not_equals_real_
module procedure assert_not_equals_1d_real_
module procedure assert_not_equals_double_
end interface
interface assertNotEquals
module procedure assert_not_equals_real_
module procedure assert_not_equals_1d_real_
module procedure assert_not_equals_double_
end interface
interface add_success
module procedure add_success_
end interface
interface addSuccess
module procedure obsolete_subroutine_delete_later_addSucc
ess_
end interface
interface add_fail
module procedure add_fail_
module procedure add_fail_unit_
end interface
interface addFail
module procedure add_fail_
module procedure add_fail_unit_
end interface
interface set_unit_name
module procedure set_unit_name_
end interface
interface get_unit_name
module procedure get_unit_name_
end interface
interface getTotalCount
module procedure obsolete_subroutine_delete_later_getTota
lCount_
end interface
interface get_total_count
module procedure get_total_count_
end interface
interface getFailedCount
module procedure obsolete_subroutine_delete_later_getFail
edCount_
end interface
interface get_failed_count
module procedure get_failed_count_
end interface
interface success_assert_action
module procedure success_assert_action_
end interface
interface failed_assert_action
module procedure failed_assert_action_
end interface
interface isAllSuccessful
module procedure obsolete_subroutine_delete_later_isAllSu
ccessful_
end interface
interface is_all_successful
module procedure is_all_successful_
end interface
private :: &
init_fruit_, obsolete_subroutine_delete_later_initial
izeFruit_, &
fruit_summary_, obsolete_subroutine_delete_later_getTest
Summary_, &
get_last_message_, obsolete_, make_error_msg_, &
get_total_count_, obsolete_subroutine_delete_later_getTota
lCount_,&
get_failed_count_, obsolete_subroutine_delete_later_getFail
edCount_,
&
add_fail_, add_fail_unit_, increase_message_stack_, &
success_assert_action_, failed_assert_action_, success_mark_,
failed_mark_, &
assert_true_logical_,
obsolete_delete_this_later_assert_true_l
ogical_, &
assert_equals_int_, &
assert_equals_double_, &
assert_equals_real_, &
assert_equals_logical_, &
assert_equals_string_, &
assert_equals_complex_, &
assert_equals_real_within_range_, &
assert_equals_double_within_range_, &
assert_equals_1d_int_, &
assert_equals_1d_double_, &
assert_equals_1d_real_, &
assert_equals_1d_string_, &
assert_equals_1d_complex_, &
assert_equals_2d_int_, &
assert_equals_2d_double_, &
assert_equals_2d_real_, &
assert_equals_2d_complex_, &
assert_equals_1d_real_within_range_, &
assert_equals_1d_double_within_range_, &
assert_not_equals_real_, &
assert_not_equals_double_, &
assert_not_equals_1d_real_, &
add_success_, obsolete_subroutine_delete_later_addSucc
ess_, &
is_all_successful_,
obsolete_subroutine_delete_later_isAllSu
ccessful_, &
set_unit_name_, get_unit_name_, is_last_passed_
contains
subroutine init_fruit_
successful_assert_count = 0
failed_assert_count = 0
messageIndex = 1
write (*,*)
write (*,*) "Test module initialized"
write (*,*)
write (*,*) " . : successful assert, F : failed assert "
write (*,*)
end subroutine init_fruit_
subroutine obsolete_subroutine_delete_later_initial
izeFruit_
call obsolete_ ("initializeFruit is OBSOLETE. replaced by init_fruit")
call init_fruit
end subroutine obsolete_subroutine_delete_later_initial
izeFruit_
subroutine obsolete_subroutine_delete_later_getTest
Summary_
call obsolete_ ( "getTestSummary is OBSOLETE. replaced by
fruit_summary")
call fruit_summary
end subroutine obsolete_subroutine_delete_later_getTest
Summary_
subroutine fruit_summary_
integer :: i
write (*,*)
write (*,*)
write (*,*) ' Start of FRUIT summary: '
write (*,*)
if (failed_assert_count > 0) then
write (*,*) 'Some tests failed!'
else
write (*,*) 'SUCCESSFUL!'
end if
write (*,*)
if ( messageIndex > 1) then
write (*,*) ' -- Failed assertion messages:'
do i = 1, messageIndex - 1
write (*,"(A)") trim(strip(messageArray(i)))
end do
write (*,*) ' -- end of failed assertion messages.'
write (*,*)
else
write (*,*) ' No messages '
end if
if (successful_assert_count + failed_assert_count /= 0) then
write (*,*) 'Total asserts : ', successful_assert_count +
failed_assert_count
write (*,*) 'Successful : ', successful_assert_count
write (*,*) 'Failed : ', failed_assert_count
write (*,'("Successful rate: ",f6.2,"%")')
real(successful_assert_count) * 100.0 / &
real (successful_assert_count + failed_assert_count)
write (*, *)
write (*,*) 'Successful asserts / total asserts : [ ',&
successful_assert_count, '/', successful_assert_count +
failed_assert_count, ' ]'
write (*,*) 'Successful cases / total cases : [ ',
successful_case_count, '/', &
successful_case_count + failed_case_count, ' ]'
write (*, *) ' -- end of FRUIT summary'
end if
end subroutine fruit_summary_
subroutine obsolete_subroutine_delete_later_addSucc
ess_
call obsolete_ ("addSuccess is OBSOLETE. replaced by add_success")
call add_success_
end subroutine obsolete_subroutine_delete_later_addSucc
ess_
subroutine add_success_
call success_assert_action_
end subroutine add_success_
subroutine add_fail_ (message)
character (*), intent (in), optional :: message
call failed_assert_action_('none', 'none', message)
end subroutine add_fail_
subroutine add_fail_unit_ (unitName, message)
character (*), intent (in) :: unitName
character (*), intent (in) :: message
call add_fail_ ("[in " // unitName // "(fail)]: " // message)
end subroutine add_fail_unit_
subroutine obsolete_subroutine_delete_later_isAllSu
ccessful_(result)
logical, intent(out) :: result
call obsolete_ ('subroutine isAllSuccessful is changed to function
is_all_successful.')
result = (failed_assert_count .eq. 0 )
end subroutine obsolete_subroutine_delete_later_isAllSu
ccessful_
subroutine is_all_successful_(result)
logical, intent(out) :: result
result= (failed_assert_count .eq. 0 )
end subroutine is_all_successful_
subroutine success_mark_
write(*,"(A1)",ADVANCE='NO') '.'
end subroutine success_mark_
subroutine failed_mark_
write(*,"(A1)",ADVANCE='NO') 'F'
end subroutine failed_mark_
subroutine increase_message_stack_
if (messageIndex > MSG_STACK_SIZE) then
write (*, *) "Too many errors to put into stack"
call getTestSummary ()
stop 1
end if
messageArray (messageIndex) = msg
messageIndex = messageIndex + 1
end subroutine increase_message_stack_
function get_last_message_
character(len=MSG_LENGTH) :: get_last_message_
if (messageIndex > 1) then
get_last_message_ = strip(messageArray(messageIndex-1))
else
get_last_message_ = ''
end if
end function get_last_message_
subroutine obsolete_subroutine_delete_later_getTota
lCount_ (count)
integer, intent (out) :: count
call obsolete_ (' getTotalCount subroutine is replaced by function
get_total_count')
call get_total_count_(count)
end subroutine obsolete_subroutine_delete_later_getTota
lCount_
subroutine get_total_count_(count)
integer, intent(out) :: count
count = successful_assert_count + failed_assert_count
end subroutine get_total_count_
subroutine obsolete_subroutine_delete_later_getFail
edCount_ (count)
integer, intent (out) :: count
call obsolete_ (' getFailedCount subroutine is replaced by function
get_failed_count')
call get_failed_count_ (count)
end subroutine obsolete_subroutine_delete_later_getFail
edCount_
subroutine get_failed_count_ (count)
integer, intent(out) :: count
count = failed_assert_count
end subroutine get_failed_count_
subroutine obsolete_ (message)
character (*), intent (in), optional :: message
write (*,*)
write (*,*) "<<<<<<<<<<<<<<<<<<<<<<<<<< WARNING from FRUIT[color=darkred]
write (*,*) message
write (*,*)
write (*,*) " old calls will be replaced in the next release in Jan
2009"
write (*,*) " Naming convention for all the method calls are changed to:
first_name from firstName"
write (*,*) " Subroutines will be deleted: assertEquals,
assertNotEquals, assertTrue, addSuccessful, addFail, etc."
write (*,*) "<<<<<<<<<<<<<<<<<<<<<<<<<< WARNING from FRUIT[color=darkred]
write (*,*)
end subroutine obsolete_
subroutine success_assert_action_
successful_assert_count = successful_assert_count + 1
last_passed = .true.
call success_mark_
end subroutine success_assert_action_
subroutine failed_assert_action_ (expected, got, message)
character(*), intent(in) :: expected, got
character(*), intent(in), optional :: message
call make_error_msg_ (expected, got, message)
call increase_message_stack_
failed_assert_count = failed_assert_count + 1
last_passed = .false.
call failed_mark_
end subroutine failed_assert_action_
subroutine set_unit_name_(value)
character(*), intent(in) :: value
unit_name = strip(value)
end subroutine set_unit_name_
subroutine get_unit_name_(value)
character(*), intent(out) :: value
value = strip(unit_name)
end subroutine get_unit_name_
subroutine make_error_msg_ (var1, var2, message)
character(*), intent(in) :: var1, var2
character(*), intent(in), optional :: message
if (present(message)) then
msg = '[' // trim(strip(unit_name)) // ']: Expected [' //
trim(strip(var1)) // '], Got [' // trim(strip(var2)) // ']; '// &
' User message: [' // message // ']'
else
msg = '[' // trim(strip(unit_name)) // ']: Expected [' //
trim(strip(var1)) // '], Got [' // trim(strip(var2)) // ']'
endif
end subroutine make_error_msg_
function is_last_passed_
logical:: is_last_passed_
is_last_passed_ = last_passed
end function is_last_passed_
!--------------------------------------------------------------------------------
! all assertions
!--------------------------------------------------------------------------------
subroutine obsolete_delete_this_later_assert_true_l
ogical_(var1, message)
logical, intent (in) :: var1
character (*), intent (in), optional :: message
call obsolete_ ('assertTrue subroutine is replaced by function
assert_true')
call assert_true_logical_(var1, message)
end subroutine obsolete_delete_this_later_assert_true_l
ogical_
subroutine assert_true_logical_ (var1, message)
logical, intent (in) :: var1
character (*), intent (in), optional :: message
if ( var1 .eqv. .true.) then
call success_assert_action_
else
call failed_assert_action_(to_s(.true.), to_s(var1), message)
end if
end subroutine assert_true_logical_
subroutine assert_equals_int_ (var1, var2, message)
integer, intent(in) :: var1, var2
character (*), intent(in), optional :: message
if ( var1 .eq. var2) then
call success_assert_action_
else
call failed_assert_action_ (to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_int_
subroutine assert_equals_logical_ (var1, var2, message)
logical, intent (in) :: var1, var2
character (*), intent (in), optional :: message
if ( var1 .eqv. var2 ) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_logical_
subroutine assert_equals_string_ (var1, var2, message)
character(*), intent (in) :: var1, var2
character (*), intent (in), optional :: message
if ( trim(strip(var1)) == trim(strip(var2))) then
call success_assert_action_
else
call failed_assert_action_(var1, var2, message)
end if
end subroutine assert_equals_string_
subroutine assert_equals_real_ (var1, var2, message)
real, intent (in) :: var1, var2
character (*), intent (in), optional :: message
if ( var1 .eq. var2) then
call success_assert_action_
else
7 call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_real_
subroutine assert_equals_double_ (var1, var2, message)
double precision, intent (in) :: var1, var2
character(*), intent(in), optional :: message
if ( var1 .eq. var2) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_double_
subroutine assert_equals_complex_ (var1, var2, message)
double complex, intent(IN) :: var1, var2
character (*), intent(IN), optional :: message
integer count
if ( var1 .ne. var2) then
call failed_assert_action_(to_s(var1), to_s(var2), message)
else
call success_assert_action_
end if
end subroutine assert_equals_complex_
subroutine assert_equals_real_within_range_(var1, var2, var3, message)
real, intent (in) :: var1, var2, var3
character(*), intent(in), optional :: message
if ( abs( var1 - var2) .le. var3) then
call success_assert_action_
else
call failed_assert_action(to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_real_within_range_
subroutine assert_equals_double_within_range_(var1,
var2, var3, message)
double precision, intent (in) :: var1, var2, var3
character(*), intent(in), optional :: message
if ( abs( var1 - var2) .le. var3) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_equals_double_within_range_
subroutine assert_equals_1d_int_ (var1, var2, n, message)
integer, intent (in) :: n
integer, intent (in) :: var1(n), var2(n)
character (*), intent (in), optional :: message
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action_(to_s(var1(count)),
to_s(var2(count)),
message)
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_int_
subroutine assert_equals_1d_string_ (var1, var2, n, message)
integer, intent (in) :: n
character(*), intent (in) :: var1(n), var2(n)
character (*), intent (in), optional :: message
integer count
loop_dim1: do count = 1, n
if ( strip(var1(count)) .ne. strip(var2(count))) then
call failed_assert_action_(var1(count), var2(count), message)
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_string_
subroutine assert_equals_1d_real_within_range_(var1
, var2, n, var3,
message)
integer, intent(in) :: n
real, intent (in) :: var1(n), var2(n), var3
character(*), intent(in), optional :: message
if ( maxval( abs( var1 - var2)) .le. var3) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1(1)), to_s(var2(1)), '1D array
real has difference' // ' ' // message)
end if
end subroutine assert_equals_1d_real_within_range_
subroutine assert_equals_1d_double_within_range_(va
r1, var2, n, var3,
message)
integer, intent(in) :: n
double precision, intent (in) :: var1(n), var2(n), var3
character(*), intent(in), optional :: message
if ( maxval( abs( var1 - var2)) .le. var3) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1(1)), to_s(var2(1)), message)
end if
end subroutine assert_equals_1d_double_within_range_
subroutine assert_equals_1d_double (var1, var2, n, message)
integer, intent (in) :: n
double precision, intent (in) :: var1(n), var2(n)
character(*), intent(in), optional :: message
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action_(to_s(var1(count)),
to_s(var2(count)), &
'Array different at count: ' // to_s(count) // ' ' //
message)
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_double
subroutine assert_equals_2d_real (var1, var2, n, m)
integer, intent (in) :: n, m
real, intent (in) :: var1(n,m), var2(n,m)
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action(to_s(var1(count1, count2)),
to_s(var2(count1, count2)),&
'Array (' // to_s(count1) // ',' // to_s( count2) //')')
return
end if
end do loop_dim1
end do loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_real
subroutine assert_equals_2d_double (var1, var2, n, m)
integer, intent (in) :: n, m
double precision, intent (in) :: var1(n,m), var2(n,m)
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action_(to_s(var1(count1, count2)),
to_s(var2(count1, count2)), &
'Array difference at (' // to_s(count1) // ',' //
to_s(count2) // ')')
return
end if
end do loop_dim1
end do loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_double
subroutine assert_equals_2d_int_ (var1, var2, n, m, message)
integer, intent (in) :: n, m
integer, intent (in) :: var1(n,m), var2(n,m)
character (*), intent (in), optional :: message
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action_(to_s(var1(count1, count2)),
to_s(var2(count1, count2)), message)
return
end if
end do loop_dim1
end do loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_int_
subroutine assert_equals_1d_real_ (var1, var2, n, message)
integer, intent (in) :: n
real, intent (in) :: var1(n), var2(n)
character (*), intent (in), optional :: message
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action_(to_s(var1(count)),
to_s(var2(count)),
message)
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_real_
subroutine assert_equals_2d_real_ (var1, var2, n, m, message)
integer, intent (in) :: n, m
real, intent (in) :: var1(n,m), var2(n,m)
character (*), intent(in), optional :: message
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action_(to_s(var1(count1, count2)),
to_s(var2(count1, count2)), message)
return
end if
end do loop_dim1
end do loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_real_
subroutine assert_equals_1d_double_ (var1, var2, n, message)
integer, intent (in) :: n
double precision, intent (in) :: var1(n), var2(n)
character (*), intent (in), optional :: message
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action_(to_s(var1(count)),
to_s(var2(count)),
message)
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_double_
subroutine assert_equals_2d_double_ (var1, var2, n, m, message)
integer, intent (in) :: n, m
double precision, intent (in) :: var1(n,m), var2(n,m)
character (*), intent (in), optional :: message
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action_(to_s(var1(count1, count2)),
to_s(var2(count1, count2)), message)
return
end if
end do loop_dim1
end do loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_double_
subroutine assert_equals_1d_complex_ (var1, var2, n, message)
integer, intent(IN) :: n
double complex, intent(IN) :: var1(n), var2(n)
character (*), intent(IN), optional :: message
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action_(to_s(var1(count)),
to_s(var2(count)),
message)
return
end if
enddo loop_dim1
call success_assert_action_
end subroutine assert_equals_1d_complex_
subroutine assert_equals_2d_complex_ (var1, var2, n, m, message)
integer, intent(IN) :: n, m
double complex, intent(IN) :: var1(n,m), var2(n,m)
character (*), intent(IN), optional :: message
integer count1, count2
loop_dim2: do count2 = 1, m
loop_dim1: do count1 = 1, n
if ( var1(count1,count2) .ne. var2(count1,count2)) then
call failed_assert_action_(to_s(var1(count1, count2)),
to_s(var2(count1, count2)), message)
return
endif
enddo loop_dim1
enddo loop_dim2
call success_assert_action_
end subroutine assert_equals_2d_complex_
subroutine assert_not_equals_real_ (var1, var2, message)
real, intent (in) :: var1, var2
character (*), intent (in), optional :: message
if ( var1 .ne. var2) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_not_equals_real_
subroutine assert_not_equals_double_ (var1, var2, message)
double precision, intent (in) :: var1, var2
character(*), intent(in), optional :: message
if ( var1 .ne. var2) then
call success_assert_action_
else
call failed_assert_action_(to_s(var1), to_s(var2), message)
end if
end subroutine assert_not_equals_double_
subroutine assert_not_equals_1d_real_ (var1, var2, n)
integer, intent (in) :: n
real, intent (in) :: var1(n), var2(n)
integer count
loop_dim1: do count = 1, n
if ( var1(count) .ne. var2(count)) then
call failed_assert_action(to_s(var1(count)), to_s(var2(count)),&
'Array (' // to_s(count)//')')
return
end if
end do loop_dim1
call success_assert_action_
end subroutine assert_not_equals_1d_real_
end module fruit
#end source
A longish post, yes. Steve left the first error quoted, so I think
everything's here for the reader.
One thing it doesn't seem to be is source fold-over. The first error was in
get_last_function, and the lines there were less fifty chars. Am I correct
that the way to deal with folded-over lines in f90 is to put an & at the end
of the top line and another at the beginning of the next?
One thing that makes me suspicious is right in the beginning, with no
filetype on what is being used. I have a file called fruit_util.mod in that
same folder.
module fruit
use fruit_util
implicit none
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
| |
|
| > integer, private, save :: successful_assert_count = 0
> integer, private, save :: failed_assert_count = 0
> character (len = MSG_LENGTH), private, dimension (MSG_STACK_SIZE), save ::
> messageArray
> character (len = MSG_LENGTH), private, save :: msg = '[unit name not set
> from set_name]: '
Hum, lines longer than mandated by the standard. Try to use
-ffree-line-length-none (removes the size limit on lines in free form
source).
--
FX
| |
| Gerry Ford 2008-02-07, 4:32 am |
|
"FX" <coudert@alussinan.org> wrote in message
news:foefjj$2k4i$1@nef.ens.fr...
>
> Hum, lines longer than mandated by the standard. Try to use
> -ffree-line-length-none (removes the size limit on lines in free form
> source).
>
But this would be an error that Bill Kleb "should" have had also.
> -ffree-line-length-none
I'll bet dollars to donuts that this won't work, but I will try.
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
> FX
| |
| paul.richard.thomas@gmail.com 2008-02-07, 4:32 am |
| Gerry,
I do not have a copy of fruit_util, so I commented out the line USE
fruit_util. After that, gfortran picked up two errors that are real:
s/function get_last_message_/function get_last_message_ ()/
s/function is_last_passed_/function is_last_passed_ ()/
ie. An ectual argument list is required by the standard for functions.
Beyond that, two functions that I guess must be in fruit_util, 'to_s'
and 'strip', have no implicit type because they are not declared
anywhere.
Modulo these points, your source compiles fine with gfortran.
Paul
| |
| paul.richard.thomas@gmail.com 2008-02-07, 4:32 am |
| Gerry,
> Beyond that, two functions that I guess must be in fruit_util, 'to_s'
> and 'strip', have no implicit type because they are not declared
> anywhere.
>
> Modulo these points, your source compiles fine with gfortran.
Adding fruit_util.f90 does the trick - so there are just the two
errors in fruit.f90 that I mentioned previously.
Paul
| |
| Gerry Ford 2008-02-08, 7:18 pm |
|
<paul.richard.thomas@gmail.com> wrote in message
news:29a9a0fc-d229-4af2-9c97-c18962e38c75@s12g2000prg.googlegroups.com...
> Gerry,
>
>
>
> Adding fruit_util.f90 does the trick - so there are just the two
> errors in fruit.f90 that I mentioned previously.
>
> Paul
Thanks, Paul.
Where do I add those two lines?
I tried a few places and variations and seem to be going backwards. This
syntax:
s/function get_last_message_/function get_last_message_ ()/
s/function is_last_passed_/function is_last_passed_ ()/
matches no other in the source. I've never seen fortran that looks like
this, even with the coding conventions that Mr. Chen has for this project:
! Coding convention:
! 1) All private subroutines end with underscore. i.e. init_fruit_
! 2) All methods must be exposed by interface. i.e. interface init_fruit
! 3) Variable and methods are lower case connected with underscores. i.e.
init_fruit_, and failed_assert_count
Frankly, it looks like what gfortran would spit out as erroneous, and that
the thing to add was, respectively, get_last_message_ , and is_last_passed_
..
I thought the best place to add the functions would be here:
private :: &
ruby fruit_util.f90
init_fruit_, obsolete_subroutine_delete_later_initial
izeFruit_, &
fruit_summary_, obsolete_subroutine_delete_later_getTest
Summary_, &
get_last_message_, obsolete_, make_error_msg_, &
, but it's already there, so I'm stumped.
> ie. An [actual] argument list is required by the standard for functions.
Can you elaborate? What is this argument list?
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
| |
| Steven G. Kargl 2008-02-08, 7:18 pm |
| In article <1202496135_10219@sp12lax.superfeed.net>,
"Gerry Ford" <invalid@invalid.net> writes:
>
> <paul.richard.thomas@gmail.com> wrote in message
> news:29a9a0fc-d229-4af2-9c97-c18962e38c75@s12g2000prg.googlegroups.com...
> Thanks, Paul.
>
> Where do I add those two lines?
>
> I tried a few places and variations and seem to be going backwards. This
> syntax:
>
> s/function get_last_message_/function get_last_message_ ()/
> s/function is_last_passed_/function is_last_passed_ ()/
Seems that you have never used sed or ed or vi in command mode or ...
s/abc/xyz/ means you need to find the locations of abc and
replace abc with xyz. In your case you need to replace
get_last_message_ with get_last_message_(). Those parentheses
are important. See R1217 in F95 standard.
Oh, the irony! fruit is supposely a unit testing framework
written in Fortran; yet, fruit doesn't conform to the Fortran
standard.
--
Steve
http://troutmask.apl.washington.edu/~kargl/
| |
| Gerry Ford 2008-02-08, 7:18 pm |
|
"Steven G. Kargl" <kargl@troutmask.apl.washington.edu> wrote in message
news:foi959$lth$1@gnus01.u.washington.edu...
> In article <1202496135_10219@sp12lax.superfeed.net>,
> "Gerry Ford" <invalid@invalid.net> writes:
>
> Seems that you have never used sed or ed or vi in command mode or ...
>
> s/abc/xyz/ means you need to find the locations of abc and
> replace abc with xyz. In your case you need to replace
> get_last_message_ with get_last_message_(). Those parentheses
> are important. See R1217 in F95 standard.
Thanks Steve.
It seems odd that only these 2 out of all these would be changed (full
posting is upthread):
private :: &
init_fruit_, obsolete_subroutine_delete_later_initial
izeFruit_, &
fruit_summary_, obsolete_subroutine_delete_later_getTest
Summary_, &
get_last_message_(), obsolete_, make_error_msg_, &
get_total_count_, obsolete_subroutine_delete_later_getTota
lCount_,&
get_failed_count_, obsolete_subroutine_delete_later_getFail
edCount_, &
add_fail_, add_fail_unit_, increase_message_stack_, &
success_assert_action_, failed_assert_action_, success_mark_, failed_mark_,
&
assert_true_logical_, obsolete_delete_this_later_assert_true_l
ogical_, &
assert_equals_int_, &
assert_equals_double_, &
assert_equals_real_, &
assert_equals_logical_, &
assert_equals_string_, &
assert_equals_complex_, &
assert_equals_real_within_range_, &
assert_equals_double_within_range_, &
assert_equals_1d_int_, &
assert_equals_1d_double_, &
assert_equals_1d_real_, &
assert_equals_1d_string_, &
assert_equals_1d_complex_, &
assert_equals_2d_int_, &
assert_equals_2d_double_, &
assert_equals_2d_real_, &
assert_equals_2d_complex_, &
assert_equals_1d_real_within_range_, &
assert_equals_1d_double_within_range_, &
assert_not_equals_real_, &
assert_not_equals_double_, &
assert_not_equals_1d_real_, &
add_success_, obsolete_subroutine_delete_later_addSucc
ess_, &
is_all_successful_, obsolete_subroutine_delete_later_isAllSu
ccessful_, &
set_unit_name_, get_unit_name_, is_last_passed_()
>
> Oh, the irony! fruit is supposely a unit testing framework
> written in Fortran; yet, fruit doesn't conform to the Fortran
> standard.
It would be a lot juicier if Andrew Chen were a pompous windbag like the
regs in c.l.c. He's seems like an ordinary, helpful mortal to me. I
managed to kill two gfortran installations today, so it will be a while
before I can test again.
--
Gerry Ford
"The apple was really a peach."
-- Allison Dunn on the garden of eden
| |
| Wade Ward 2008-02-08, 7:18 pm |
| On Feb 7, 2:14=A0am, paul.richard.tho...@gmail.com wrote:
> Gerry,
>
> I do not have a copy of fruit_util, so I commented out the line USE
> fruit_util. =A0After that, gfortran picked up two errors that are real:
>
> s/function get_last_message_/function get_last_message_ ()/
> s/function is_last_passed_/function is_last_passed_ ()/
>
> ie. An ectual argument list is required by the standard for functions.
>
> Beyond that, two functions that I guess must be in fruit_util, 'to_s'
> and 'strip', have no implicit type because they are not declared
> anywhere.
>
> Modulo these points, your source compiles fine with gfortran.
>
> Paul
Google has now conflated these threads.??
For persons who haven't used vi in twenty years or so, he means to
replace the former with the latter, with the s in command mode.
Thanks for the information and the reminder to use vi again sometime
soon or lose it forever.
--
| |
| Andrew Chen 2008-03-25, 7:25 pm |
| Sorry I was not aware of the discussion thread of fruit.
1. If you compile fruit FORTRAN code manually, you need to compile
fruit_util.f90 first, then fruit.f90
groucho: /users/chena/prj/fruit >cd src
groucho: /users/chena/prj/fruit/src >ls
CVS/ fruit.f90 fruit_util.f90* Makefile.obsolete* rakefile*
groucho: /users/chena/prj/fruit/src >ifort -c fruit_util.f90
groucho: /users/chena/prj/fruit/src >ifort -c fruit.f90
groucho: /users/chena/prj/fruit/src >ar cr libfruit.a fruit.o
fruit_util.o
groucho: /users/chena/prj/fruit/src >ls
CVS/ fruit.mod fruit_util.f90* fruit_util.o Makefile.obsolete*
fruit.f90 fruit.o fruit_util.mod libfruit.a rakefile*
You can replace ifort with your compiler.
Then the easiest way is to make libfruit.a available in your other
codes.
Please check out one thread on FRUIT forum here:
http://sourceforge.net/forum/forum....forum_id=508240
2. I'm not a FORTRAN guru, comments are welcomed. I'm good at Java
and Ruby. Any comments for improvement are welcomed. Also, feel free
to modify the source code. If you don't feel like to commit directly
to the CVS, just send code to me, I will check in. My email address
is meihome _at_ gmail.com
3. I will modify fruit.f90, so that it will declare everything
private, and only have the interface public.
4. I thought the F90 coding spec don't have line length limitation. I
will reformat my code, and make them all within 80 characters.
Currently, I have a project due early next w , then I will spend
some time, and download gfortran, and make it run on Windows.
Sorry about the late reply.
~Andrew Chen
| |
| Andrew Chen 2008-03-25, 7:25 pm |
| Gerry,
Did fruit_util.f90 compile for you eventually?
Can you please send me output for this command?
gfortran fruit_util.f90
Which version of gfortan are you using? Let me download that and try
it myself.
Thanks
~Andrew Chen
On Feb 6, 5:11 pm, "Gerry Ford" <inva...@invalid.net> wrote:
> I'm using a new compiler and am uncertain about a variety of things,
> beginning with the switches. When I type
> gfortran -cfruit.f90
> , it is meant to mimic
> ifort -cfruit.f90
> , which I thought, yields the intermediate files instead of an executable.
> Indeed, five minutes ago I typed
> gfortran -c fruit_util.f90
> , and got a .o and .mod file out of it without objection. So I don't think
> that my compiler switches are the problem, but since there is no page in the
> manual that compares compiler switches amongfortranvendors, I couldn't
> know.
>
> As to the specific complaints, there were many:fruit.f90:343.28:
>
> function get_last_message_
> 1
> Error: Expected formal argument list in function definition at (1)fruit.f90:344.50:
>
> character(len=MSG_LENGTH) :: get_last_message_
> 1
> Error: Symbol 'get_last_message_' at (1) has already been host associatedfruit.f90:345.30:
>
> if (messageIndex > 1) then
> 1
> Error: Unexpected block IF statement in CONTAINS section at (1)fruit.f90:346.24:
>
> get_last_message_ = strip(messageArray(messageIndex-1))
> 1
> Error: Symbol 'get_last_message_' at (1) has already been host associatedfruit.f90:347.8:
>
> else
> 1
> Error: Unexpected ELSE statement in CONTAINS section at (1)fruit.f90:348.24:
>
> get_last_message_ = ''
> 1
> Error: Symbol 'get_last_message_' at (1) has already been host associatedfruit.f90:349.7:
>
> end if
> 1
> Error: Expecting END MODULE statement at (1)fruit.f90:350.5:
>
> end function get_last_message_
> 1
> Error: Expecting END MODULE statement at (1)fruit.f90:428.26:
>
> function is_last_passed_
> 1
> Error: Expected formal argument list in function definition at (1)fruit.f90:429.29:
>
> logical:: is_last_passed_
> 1
> Error: Symbol 'is_last_passed_' at (1) has already been host associatedfruit.f90:430.19:
>
> is_last_passed_ = last_passed
> 1
> Error: Symbol 'is_last_passed_' at (1) has already been host associatedfruit.f90:431.5:
>
> end function is_last_passed_
> 1
> Error: Expecting END MODULE statement at (1)fruit.f90:54.39:
>
> module procedure get_last_message_
> 1
> Error: Procedure 'get_last_message_' in generic interface 'get_last_message'
> at (1) is neither function nor subroutinefruit.f90:58.37:
>
> module procedure is_last_passed_
> 1
> Error: Procedure 'is_last_passed_' in generic interface 'is_last_passed' at
> (1) is neither function nor subroutine
> # end comments by gfortran
>
> As for the source, it's 27K. I can post it if that would help, but posting
> it from the git-go points away from the likely culprit here: user error.
>
> Grateful for any pointers.
>
> --
> Gerry Ford
>
> "The apple was really a peach."
> -- Allison Dunn on the garden of eden
| |
| Gerry Ford 2008-03-25, 7:25 pm |
|
"Andrew Chen" <hangfei@gmail.com> wrote in message
news:d6d1c1f7-6539-4fc1-b0d9-1baf04c139a3@m36g2000hse.googlegroups.com...
> On Feb 6, 5:11 pm, "Gerry Ford" <inva...@invalid.net> wrote:
[re-ordered for top vs. bottom posting: it was less difficult than alleged][color=darkred]
> Gerry,
> Did fruit_util.f90 compile for you eventually?
> Can you please send me output for this command?
> gfortran fruit_util.f90
Andrew,
I never did get it. Steve Kargl and others pointed out that the functions
above are in trouble. I think the crux of it was that the trailing
underscore is illegal. I can't quite remember how it went, but it was with
get_last_message and last_function_passed. I'm promiscuous with syntax, so
I never really know where a trailing underscore works or it doesn't, much
the same as I sometimes can't see the diffference between a forward slash
and a backslash. I call the latter a symptom in "platform fatigue
indifference syndrome."
When these 2 errors were shown, I posted a source snippet of 30 other
functions that looked the same and wondered aloud whether they would have
the same trouble. I never heard from you thereafter until this afternoon,
so I put fruit away and moved on. I assumed you read of the errors and
retreated to the chalkboard for a bit.
> Which version of gfortan are you using? Let me download that and try
> it myself.
That's a little bit of a story. I now only have 4.3.0 from a vendor who
does not want me to possess it. I would like to find another 4.3.0 open
source distro. If you post a link for the gnu-est version that is not from
equation.com, we could both download it, and I would continue testing.
If I experience your software other than how you wished it to be, I would
like you to know that I am making a "simple observation" as opposed to a
"baseless complaint."
Gorgeous day here in the southwest.
--
"I am waiting for them to prove that God is really American."
~~ Lawrence Ferlinghetti
| |
| Gerry Ford 2008-03-27, 5:14 am |
|
"Andrew Chen" <hangfei@gmail.com> wrote in message
news:d6d1c1f7-6539-4fc1-b0d9-1baf04c139a3@m36g2000hse.googlegroups.com...[color=darkred]
> Gerry,
> Did fruit_util.f90 compile for you eventually?
> Can you please send me output for this command?
> gfortran fruit_util.f90
>
> Which version of gfortan are you using? Let me download that and try
> it myself.
>
> Thanks
> ~Andrew Chen
>
> On Feb 6, 5:11 pm, "Gerry Ford" <inva...@invalid.net> wrote:
I remember it now. It's that get_last_message and last_function_passed need
to have parentheses.
--
"I am waiting for them to prove that God is really American."
~~ Lawrence Ferlinghetti
|
|
|
|
|