https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61788
Bug ID: 61788 Summary: use of x[nr][nc] as array parameter passing mechanism in mixed language programming Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ian at rhymneyconsulting dot co.uk I am writing a suite of mixed language program examples (Fortran calling C, C calling Fortran, and C++ calling Fortran) and have hit a problem with the following code. I am not sure if it is a bug or a standards conformance issue. With the following code C++ ##### #include <iostream> using namespace std; extern "C" void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); int main() { const int nr=2; const int nc=5; float x[nr][nc]; float y[nr][nc]; float t[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0}; int r; int c; int i=0; for (r=0;r<nr;r++) for (c=0;c<nc;c++) { x[r][c]=t[i]; i++; } cout << " C++ passing a 2d array to Fortran " << endl; for (r=0;r<nr;r++) { for (c=0;c<nc;c++) { cout << x[r][c] << " "; } cout << endl; } reciprocal(nr,nc,x,y); for (r=0;r<nr;r++) { for (c=0;c<nc;c++) cout << " 1 / " << x[r][c] << " = " << y[r][c] << endl; } return(0); } ##### and the following Fortran code ##### subroutine reciprocal(nr,nc,x,y) bind(c,name='reciprocal') use iso_c_binding implicit none integer (c_int) , value :: nr integer (c_int) , value :: nc real (c_float) , dimension(1:nr,1:nc) , intent(in ) :: x real (c_float) , dimension(1:nr,1:nc) , intent(out) :: y y=1.0/x end subroutine reciprocal ##### I get the following error message. ##### $ g++ ch3110.cxx ch3110_f.o ch3110.cxx:5:50: error: use of parameter ‘nr’ outside function body extern "C" void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); ^ ch3110.cxx:5:54: error: use of parameter ‘nc’ outside function body extern "C" void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); ^ ch3110.cxx:5:57: error: expected ‘)’ before ‘,’ token extern "C" void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); ^ ch3110.cxx:5:58: error: expected unqualified-id before ‘float’ extern "C" void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); ##### The C calling routine works. ##### #include <stdio.h> void reciprocal(int nr,int nc,float x[nr][nc],float y[nr][nc]); int main() { const int nr=2; const int nc=5; float x[nr][nc]; float y[nr][nc]; float t[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0}; int r; int c; int i=0; for (r=0;r<nr;r++) for (c=0;c<nc;c++) { x[r][c]=t[i]; i++; } printf(" C passing a 2d array to Fortran\n"); for (r=0;r<nr;r++) { for (c=0;c<nc;c++) { printf(" %f " , x[r][c]); } printf("\n"); } reciprocal(nr,nc,x,y); for (r=0;r<nr;r++) { for (c=0;c<nc;c++) { printf(" 1 / %f = %f \n " , x[r][c],y[r][c]); } printf("\n"); } return(0); } ##### Any thoughts?