Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28456 Discussions

Fortran -> C Interop w/ Argument Errors

Krob__Jeff
Beginner
391 Views

All,

In my continuing journey in learning how to interoperate Fortran with C, I've come across yet another confusing situation. Below, I'm trying to pass two REAL data arrays to a C routine gpc _cvlist to populate a data structure with the data in the arrays but when I compile, I get the error #6633: The type of the actual argument differs from the type of the dummy argument.   [XV] & [YV] . I'm not understanding why this error would occur since I (thought)  was consistent with my declarations concerning the two arrays.

Below is the code:

!  F2CGPCList.f90 
!
!  FUNCTIONS:
!  F2CGPCList - Entry point of console application.
!

!****************************************************************************
!
!  PROGRAM: F2CGPCList
!
!  PURPOSE:  Entry point for the console application.
!
!****************************************************************************

    module gpc_list
	   use, intrinsic :: ISO_C_BINDING
	   implicit none
	   private
	   public C_GPC_VERTEX, C_GPC_VERTEX_LIST, C_GPC_POLYGON
       public gpc_cvlist

	   TYPE, BIND(C) :: C_GPC_VERTEX
	      REAL(C_DOUBLE) :: x
	      REAL(C_DOUBLE) :: y
	   END TYPE C_GPC_VERTEX

	   TYPE, BIND(C) :: C_GPC_VERTEX_LIST
	      INTEGER(C_INT) :: num_vertices
	      TYPE(C_PTR) :: C_vertex
	   END TYPE C_GPC_VERTEX_LIST

	   TYPE, BIND(C) :: C_GPC_POLYGON
	      integer(C_INT) num_contours
	      type(C_PTR) hole
	      type(C_PTR) C_contour
	   END TYPE C_GPC_POLYGON

	   interface

!*********************************************************************
!                   GPC FUNCTION ADD-ONS
!
	      SUBROUTINE gpc_cvlist(npoly, px, py, vertex_list, iret) &
	         BIND(C,name='gpc_cvlist')
	         IMPORT :: C_INT, C_FLOAT, C_GPC_VERTEX_LIST
             implicit none
 	         integer(C_INT),    intent(inout) :: npoly
 	         integer(C_FLOAT),  intent(inout) :: px(*)
 	         integer(C_FLOAT),  intent(inout) :: py(*)
	         TYPE(C_GPC_VERTEX_LIST) vertex_list
 	         integer(C_INT),    intent(inout) :: iret
	      end SUBROUTINE gpc_cvlist

	   end interface

	end module gpc_list


    program F2CGPCList

    use GPC_List

    use, intrinsic :: ISO_C_BINDING

    implicit none

    ! Variables
! - - - local declarations - - -
  INTEGER :: nverts,ii,ier

  REAL    :: xv(10),yv(10)

  type(C_GPC_VERTEX_LIST) C_verticies

    ! Body of F2CGPCList
  WRITE (*,*) "The following are the polygon points to be xfered " 

  nverts = 10
  DO ii = 1,nverts
    xv(ii) = float(ii*10)
    yv(ii) = float(ii*10+1)
    write(*,*)'x/yv = ',ii,xv(ii),yv(ii)
  END DO

  CALL gpc_cvlist( nverts, xv, yv, C_verticies, ier )

  end program F2CGPCList

#include "gpc.h"

#define	G_MALLOC(p,type,np,str)  { if ((np) > 0) { \
		(p)=(type*)malloc((np)*sizeof(type)); \
		if (p==((type*)NULL)) { \
		    fprintf(stderr, "malloc failure: %s\n", (str) ); \
		  } \
		} \
		else \
		    (p)=(type*)NULL; \
		}

void gpc_cvlist ( int npoly, float *px, float *py,
				gpc_vertex_list *contour, int *iret )
/************************************************************************
 * gpc_cvlist                                                           *
 *                                                                      *
 * This function generates a GPC vertex list structure given a set of	*
 * polygon points.							*
 *                                                                      *
 * gpc_cvlist ( npoly, px, py, contour, iret )				*
 *                                                                      *
 * Input parameters:                                                    *
 *      *npoly  	int             Number of points in polygon	*
 *      *px     	float[]         X array				*
 *      *py     	float[]         Y array				*
 *                                                                      *
 * Output parameters:                                                   *
 *      *contour  	gpc_vertex_list Vertex list structure		*
 *      *iret   	int     	Return code                     *
 *                                                                      *
 **                                                                     *
 ***********************************************************************/
{
int	ii;
/*---------------------------------------------------------------------*/

    *iret = 0;

    contour->num_vertices = npoly;

    G_MALLOC ( contour->vertex, gpc_vertex, npoly, "gpc_vertex creation" );

    for ( ii = 0; ii < npoly; ii++ )  {
	contour->vertex[ii].x = px[ii];
	contour->vertex[ii].y = py[ii];
    }

    return;

}

Thanks in advance,

Jeff

 

0 Kudos
2 Replies
Krob__Jeff
Beginner
391 Views

Good grief...never mind. Just saw my error:

              integer(C_FLOAT),  intent(inout) :: px(*)
              integer(C_FLOAT),  intent(inout) :: py(*)


should be

              real(C_FLOAT),  intent(inout) :: px(*)
              real(C_FLOAT),  intent(inout) :: py(*)

however...now it is complaining with a linker error:

1>F2C-GPCList.obj : error LNK2019: unresolved external symbol _gpc_cvlist referenced in function _MAIN__


gpc_cvlist is in the C portion of the project so the compiler should see it...

 

0 Kudos
Steven_L_Intel1
Employee
391 Views

Is your C code in a file with type .cpp? If so, you need 'extern "C"' in front of the routine declaration.

0 Kudos
Reply