PetscPrintf/ifort 9.1

Barry Smith bsmith at mcs.anl.gov
Wed Aug 29 14:02:09 CDT 2007



On Wed, 29 Aug 2007, Leif Strand wrote:

> IMHO, PETSc's behavior was correct before.  I.e., it was correct to do nothing
> -- it was correct to simply print the string the user passed-in, with no
> translation.  To do otherwise, PETSc would need a 'configure.py' test which
> checks to see whether the user's Fortran compiler already performs the "\n" ->
> LF translation at compile time (as G95 does), so that the translation doesn't
> get performed twice (consider "\\n")... it just gets messy.  Better to do
> nothing.

   Actually this is not a problem, as was pointed out before the C compiler 
replaces the \n with a single charactor (ASCII 10) so my simple search and 
replace will never see the STRING "\n" when the Fortran compiler is gfortran
so nothing will be done twice.

   Barry


> 
> The only thing slightly fishy about "achar(10)" is that it does assume that
> PetscPrintf is implemented in C (see below).
> 
> 
> Stephan Kramer wrote:
> > While this may work for you, it is certainly not *the* correct way to do it.
> > achar(10) corresponds to LF, whereas windows systems
> > expect CR+LF (i.e. achar(13)//achar(10)), it may still work under windows as
> > well though, depends on your terminal/ application
> > you view the output with. The correct way in C is really to use \n (and in
> > the above case I guess), and in fortran to use two
> > separate write statements.
> 
> It is fishy (as I said), but since PetscPrintf is implemented in C and
> ultimately calls vfprintf(), the correct thing will happen on all platforms.
> E.g., with VC++, the MSVCRT.DLL runtime will translate LF to CR,LF if the
> underlying "FILE" was opened in text mode.
> 
> It is portable, because a C/C++ implementation has no choice but to do
> linefeed translation this way (i.e., at runtime).  Consider:
> 
>     #include <stdio.h>
>     #include <string.h>
> 
>     int main()
>     {
>         char buffer[42];
>         strcpy(buffer, "Hello,\nworld.");
>         printf("%d %d\n", strlen(buffer), buffer[6]);
>         puts(buffer);
>         return 0;
>     }
> 
> This program will print
> 
> 13 10
> Hello,
> world.
> 
> on all platforms (even Windows).  (Note that the string has length 13, not 14:
> "\n" -> LF happened at compile time.)
> 
> To summarize: A C/C++ compiler translates "\n" to LF at compile time (this
> transformation is applied to string literals).  Therefore LF->CR+LF
> translation must happen at runtime on Windows (and it will happen even if the
> string came from Fortran code).  What a Fortran compiler does with strings is
> implementation-dependent.  G95 mimics what a C/C++ compiler would do by
> translating "\n" -> LF in string literals, but this is not standard Fortran.
> 
> --Leif
> 
> 




More information about the petsc-users mailing list