On 23 juil, 07:59, rudra <bnrj.ru...@[EMAIL PROTECTED]
> wrote:
> dear friend, i have a C++ routine(badly written):
>
> main()
> {
> ofstream myfile;
> /********* PART 1: Checking machine bit *********/
>
> FILE *stream;
> char sys[6],*sysptr;
> int bit;
> sysptr = &sys[0];
> sys[6] = 0x0;
> stream=popen("/bin/uname -m","r");
> fread(sysptr,1,6,stream);
> pclose(stream);
> //printf("%s\n",sysptr);
>
> if ((strncmp(sysptr, "i686",4)==0)||
> (strncmp(sysptr, "i386",4)==0))
> {
> bit=32;
> }
> else {
> bit=64;
> }
> myfile.open ("machine");
> myfile << bit<<"\n";
> myfile.close();
> printf("This is a %d bit machine \n",bit);
>
> }
>
> wose output is written in "machine" file. a f90 program is supposed to
> read it as
>
> open(2,file="machine",status="old")
> read(2,*) bit
> close(2)
>
> I want to use the C code as a function of the f90 program.
> can anybody tell me how can i do that?
Transform your C++ code into a C code first : you don't need C++ for
such routine. In addition, you just want to get the value of "bit".
Therefore, you don't need to use the "machine" file :
File operating_system.c :
#include <stdlib.h>
#include <stdio.h>
int operating_system(void){
FILE *stream;
char sys[6],*sysptr;
int bit;
sysptr = &sys[0];
sys[6] = 0x0;
stream=popen("/bin/uname -m","r");
fread(sysptr,1,6,stream);
pclose(stream);
bit=64;
if ((strncmp(sysptr, "i686",4)==0)||
(strncmp(sysptr, "i386",4)==0))
bit=32;
return bit;
}
In the FORTRAN program, you just need to declare an interface to that
routine :
PROGRAM test
INTERFACE operating_system
FUNCTION operating_system() RESULT(r)
BIND(C,name="operating_system")
USE iso_c_binding
INTEGER(C_INT) :: r
END FUNCTION
END INTERFACE
INTEGER :: bit
bit=operating_system()
WRITE(*,*) bit
END PROGRAM
Shell commands :
$$$ cc -c operating_system.c
$$$ gfortran test.f90 operating_system.o
$$$ ./a.out
32
Caution : this is a F2003 technique. To use it, you need a recent
FORTRAN compiler like ifort-10.x, gfortran-4.3, g95 ...


|