Intel® C++ Compiler
Support and discussions for creating C++ code that runs on platforms based on Intel® processors.

calling fortran from c++

Dwijendra_Sharma
Beginner
334 Views
I am facing problems with mixed language project.
I have a fortran program created as static library project that is being called from c++,getting the errors as below,I tried a lot but was not able to resolve it hence thought of posting it here.
**************************
c1.cpp(39) : error C2065: '_fcom' : undeclared identifier
c1.cpp(39) : error C2228: left of '.a' must have class/struct/union type
type is ''unknown-type''
c1.cpp(46) : error C2228: left of '.b' must have class/struct/union type
type is ''unknown-type''
c1.cpp(46) : error C3861: '_fcom': identifier not found, even with argument-dependent lookup
c1.cpp(51) : error C2228: left of '.c1' must have class/struct/union type
type is ''unknown-type''
c1.cpp(51) : error C2228: left of '.c2' must have class/struct/union type
type is ''unknown-type''
c1.cpp(51) : error C3861: '_fcom': identifier not found, even with argument-dependent lookup
c1.cpp(51) : error C3861: '_fcom': identifier not found, even with argument-dependent lookup
**************************

I'll appreciate if someone can help me out with this.
0 Kudos
7 Replies
chris3
Beginner
334 Views
You declared the fortran common without a preceeding underscore:

extern forcommon fcom; // To access the external /fcom/ fortran common...

but you use it with an underscore:

cout _fcom.a " ";


I don't know which method is correct (it depends on how the fortran compiler decorates symbols), but it has to be one or the other.
TimP
Black Belt
334 Views
Most Fortran compilers which are intended to work with C and C++ come with examples, which should get you started. Unless you use extensions such as ifort supports, to declare C++ interface in the Fortran source, your C++ must declare functions as extern "C":
extern "C" int fcom_();
so as to avoid C++ name mangling.
Your Fortran compiler probably has options to control link symbol case and underscore appending. Those may interfere with use of some of the libraries provided for your Fortran.
I guess you are using Windows, as your zip file isn't openable by my e-mail reader. With Microsoft compatible linking, you can use tools such as dumpbin /symbols, or equivalent link facilities, to see whether your symbols match.
Questions like this are more often answered in the Fortran forum, assuming you use a Fortran which is, or was, supported by Intel. I am guessing you may not be, as lower case symbols aren't a default with those compilers on Windows.
ttppo
Beginner
334 Views
I saw the f1.obj, and found that fcom was mapped into _fcom.



If you write "forcommon fcom;" in a CPP file, fcom may be mapped into ?fcom?xu???

if using extern "C", you can let Intel compiler map fcom into _fcom.

That is OK!



please try it:



#include

using namespace std;





// Def. a structure type to access external Fortran common area...

typedef struct { int a[6][5]; int b[2][2];

char c1[80]; char c2[80]; } forcommon;



// List of all modules not written in C/C++ language...

extern "C"{

double test( double& d);

void testmore( const char* e1, const int& se1, const char* e2, const int& se2);

}



extern "C" {

forcommon fcom;

} // To access the external /fcom/ fortran common...



int main()

{

double d1, d2;

char s1[]="just a test", s2[]="really a test";



int i, j;



d1 = 10.0;

d2 = test( d1 ); // test is an external Fortran function



int sizs1 = sizeof(s1);

int sizs2 = sizeof(s2);

testmore( s1, sizs1, s2, sizs2 ); // testmore is an external Fortran subroutine

cout d1 " " d2 endl;



for( i=0; i5; i++ ) {

for( j=0; j6; j++ ) {

cout fcom.a " ";

}

cout endl;

}



for( i=0; i2; i++ ) {

for( j=0; j2; j++ ) {

cout fcom.b " ";

}

cout endl;

}



cout _fcom.c1 " " _fcom.c2 endl;



return ( 0 );

}
ttppo
Beginner
334 Views
Some codes are deleted by auto-system?

note:_fcom in CPP file is problemable, you should make the following change:
_fcom.a --> fcom.a
_fcom.b --> fcom.b
_fcom.c1-->fcom.c1
_fcom.c2-->fcom.c2
ttppo
Beginner
334 Views
The new c1.cpp
ttppo
Beginner
334 Views
c1.cpp
ttppo
Beginner
334 Views
or try it:
int main()
{
double d1, d2;
char s1[]="just a test", s2[]="really a test";
extern "C" forcommon fcom;
..............
}
Reply