[comp.lang.fortran] Fortran to C translator question.

laredo@csri.toronto.edu (Jim Alain Laredo) (08/01/89)

To those of you that have used any of the Fortran to C translators,
please, tell me what the expected results for this small routine are

	SUBROUTINE X(A,M)
	INTEGER M
	DOUBLE PRECISION A(M,*)

	INTEGER I,J

    DO 20 I=1,M
        DO 10 J=I+1,M
             A(I,J) = A(I,J)+1
10      CONTINUE
20  CONTINUE

According to the FOR_C brochure (from COBALT BLUE) the coordinates
of the matrices are inverted to solve the problem of the memory
distribution, Fortran places the matrices column-wise as oppossed to C
that does it row-wise. Therefore a reference in Fortran to A(i,j)
should be translated into C as A[M*j+i].
	Also, I would like to know if the translator modifies the loops,
note that in the first loop , DO 20 I=1,M, both values have to be
be decremented, while in the second, DO 10 J=I+1,M, only the absolute
value M, should be decremented to fit into the C matrix definitions.

	If the translator is good, I would expect the following code or 
at least something similar.

	void X(A,M)
	int	M;
	double A[];
	{
		int	i,j;
		for(i=0;i<=M-1;i++)
         	for(j=i+1;j<=M-1;j++)
	              A[j*M+i] = A[j*M+i]+1;
	}

	thanks for your help,
	Jim Laredo
	laredo@csri.toronto.edu

ralphc@tekcae.CAX.TEK.COM (Ralph Carpenter) (08/02/89)

In response to Jim Laredo's <1989Aug1.105428.18152@jarvis.csri.toronto.edu>
question about FOR_C's translation of a sample subroutine:

        subroutine x(a,m)
	integer m
	double precision a(m,*)
	integer i,j
      do 20 i=1,m
	do 10 j=i+1,m
	  a(i,j)=a(i,j)+1
   10   continue
   20 continue
	end


According to Jim:

>       If the translator is good, I would expect the following code or
>at least something similar.
>
>       void X(A,M)
>       int     M;
>       double A[];
>       {
>               int     i,j;
>               for(i=0;i<=M-1,i++)
>               for(j=i+1;j<=M-1;j++)
>                       A[j*M+i] = A[j*M+i]=1;
>       }
        
        
I have a FOR_C DEMO v2.0 demo disk, (files dated 10/15/88, probably a
little out of date by now,) which output the following c code:

        /*Translated by FOR_C, v2.0, on 08/01/89 at 18:24:20 */
        /*FOR_C Options SET: none */
        #include <stdio.h>
        #include <math.h>
        #include <f_rt.h>
        void /*FUNCTION*/ x(a, m)
        double *a;
        int *m;
        {
        #define A(I_,J_)  (a+(I_)*(*m)+(J_))
        int _do0, _do1, i, j;
        
        for( i = 0, _do0 = *m - 1; i <= _do0; i++ ){
           for( j = (i+1) + 0, _do1 = *m - 1; j <= _do1; j++ ){
	      *A(j,i) = *A(j,i) + 1;
	      }
	}
        #undef	A
        } /* end of function */



Ralph Carpenter
Tektronix, Inc.

scf@statware.UUCP (Steve Fullerton) (08/04/89)

In article <2992@tekcae.CAX.TEK.COM> ralphc@tekcae.CAX.TEK.COM (Ralph Carpenter) writes:
>
>In response to Jim Laredo's <1989Aug1.105428.18152@jarvis.csri.toronto.edu>
>question about FOR_C's translation of a sample subroutine:
>
> subroutine x(a,m)
>	integer m
>	double precision a(m,*)
>	integer i,j
>      do 20 i=1,m
>	do 10 j=i+1,m
>	  a(i,j)=a(i,j)+1
>   10   continue
>   20 continue
>	end
>

Here are several FOR_C translations I did on the code using version v2.2
under SCO XENIX.  For the first translation, I specified options to disable
the creation of temporaries for the DO test parameter and requested
optimization of common subexpressions.

/*Translated by FOR_C, v2.2, on 08/03/89 at 13:14:57 */
/*FOR_C Options SET: no=d op=a */
#include <stdio.h>
#include <math.h>
#include <f_rt.h>
void /*FUNCTION*/ x(a, m)
double *a;
int *m;
{
#define A(I_,J_)	(a+(I_)*(*m)+(J_))
int i, i_, j, j_;

	for( i = 1; i <= *m; i++ ){
		i_ = i - 1;
		for( j = i + 1; j <= *m; j++ ){
			j_ = j - 1;
			*A(j_,i_) += 1;
			}
		}
#undef	A
} /* end of function */

This next translation used an addition option to prevent the
creation of a reduced DO index variable.

/*Translated by FOR_C, v2.2, on 08/03/89 at 13:14:16 */
/*FOR_C Options SET: no=dr op=a */
#include <stdio.h>
#include <math.h>
#include <f_rt.h>
void /*FUNCTION*/ x(a, m)
double *a;
int *m;
{
#define A(I_,J_)	(a+(I_)*(*m)+(J_))
int i, j;

	for( i = 1; i <= *m; i++ ){
		for( j = i + 1; j <= *m; j++ ){
			*A(j - 1,i - 1) += 1;
			}
		}
#undef	A
} /* end of function */

-- 
Steve Fullerton                        Statware, Inc.
scf%statware.uucp@cs.orst.edu          260 SW Madison Ave, Suite 109
orstcs!statware!scf                    Corvallis, OR  97333
                                       503/753-5382