ISO C binding and character variables

Christopher D. Rickett crickett@lanl.gov
Wed Jul 11 23:45:00 GMT 2007


hi all,

i modified the way by-value character args are handled for bind(c) 
procedures and i want to see if it's behaving more as expected.

the following code:

module c_char_tests
   use, intrinsic :: iso_c_binding, only: c_char
   implicit none
contains
   subroutine param_test(my_char, my_char_2) bind(c)
     character(c_char), value :: my_char
     character(c_char), value :: my_char_2
     if(my_char /= c_char_'y') call abort()
     if(my_char_2 /= c_char_'z') call abort()
   end subroutine param_test
end module c_char_tests

produces the following output w/ my patch applied:

param_test (my_char, my_char_2, _my_char, _my_char_2)
{
   if (my_char != 121)
     {
       _gfortran_abort ();
     }
   if (my_char_2 != 122)
     {
       _gfortran_abort ();
     }

and the following w/o my patch:

param_test (my_char, my_char_2, _my_char, _my_char_2)
{
   if (my_char[1]{lb: 1 sz: 1} != 121)
     {
       _gfortran_abort ();
     }
   if (my_char_2[1]{lb: 1 sz: 1} != 122)
     {
       _gfortran_abort ();
     }

the code runs as expected on my box, but i can't test it on the arch in 
question.  also, for non-bind(c), there is no change from what is 
currently done.

thoughts?
Chris

On Wed, 11 Jul 2007, Tobias Burnus wrote:

> Hi again,
>
> one has to be careful though; assuming the following file (based on the
> original example):
>
> --------------------
> subroutine param_test(my_char) bind(c)
>  use iso_c_binding
>  character(c_char), value :: my_char
>  if(my_char /= c_char_'y') stop 'error'
> end subroutine param_test
> --------------------
>
> If now "my_char" is a scalar variable ("char my_char_") then one needs
> to remember this later on in the program; otherwise one does the same
> mistake as NAG f95 and produces:
>
> ----------------
> void param_test(char my_char_)
> {
>  if ( *my_char_!=121)
>    __NAGf90_stop("error");
> }
> ----------------
>
> That is: One uses "*my_char" although my_char is not a pointer. And as
> Steve E. has shown simply assuming "char[]" does not work on IA64 HP-UX
> and thus one needs to go through all trans-* and make sure it works.
>
> Who has ever claimed that ISO C Binding is trivial?
>
> As post script:
> I filled this as PR32732
>
> As another post script:
>
> The extra length parameter(s) is/are not nice, but harmless: It/They
> always come(s) last in the argument list and can therefore easily be
> ignored. And while the parameter is present in the argument list, it is
> never used.
> I'm almost sure, however, that someone will find a platform or scenario
> where this fails.
>
> Tobias
>



More information about the Fortran mailing list