- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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...
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Is your C code in a file with type .cpp? If so, you need 'extern "C"' in front of the routine declaration.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page