For Programmers: Free Programming Magazines  


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


FX

2008-02-07, 4:32 am

> 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


Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com