2015-11-16 2 views
-1

Я свежий в программировании, и я хочу назвать общий блок Fortran 77 в моем коде на C++. На самом деле я прочитал некоторые Q & Подобно моему, но я был не очень ясным ....Как C++ вызывать общие блоки Fortran 77

Этот общий блок определяется другой подпрограммой Fortran 77.

Пример кода:

common.inc:

!test common block: 
real delta(5,5) 
common /test/ delta 
!save /test/ delta ! any differences if I comment this line? 

tstfunc.f

subroutine tstfunc() 
    implicit none 
    include 'common.inc' 
    integer i,j 
    do i = 1, 5 
     do j = 1, 5 
      delta(i,j)=2 
      if(i.ne.j) delta(i,j)=0 
      write (*,*) delta(i,j) 
     end do 
    end do 
end 

tst01.cpp

#include <iostream> 

extern "C" 
{ 
    void tstfunc_(); 
}; 

void printmtrx(float (&a)[5][5]){ 
    for(int i=0;i<5;i++){ 
     for(int j=0;j<5;j++){ 
      std::cout<<a[j][i]<<'\t'; 
      a[j][i]+=2; 
     } 
     std::cout<<std::endl; 
    } 
} 

int main() 
{ 
//start... 
    tstfunc_(); 
    printmtrx(delta);//here i want to call delta and manipulate it. 
    return 0; 
} 

Если я хочу передать delta (от общего. inc) к функции C++ printmtrx(), что мне делать?

+0

Это зависит от компилятора. Какие компиляторы вы используете? – MSalters

+0

Уважаемый @MSalters, я использую gfortran и g ++ – Kylxyz

+0

Вы не называете общие блоки. Они содержат данные, а не код. «Что я должен делать?» не является понятным вопросом, и здесь нет никаких доказательств реальной проблемы. То, что вы просите, остается неясным. – EJP

ответ

1

Помимо ряда/столбцам вопроса порядка (матрица 5х5 будет казаться транспонированной в C-кода), возможно, вы могли бы действовать следующим образом (см раздел общих блоков в этом tutorial):

tstfunc1 .f

subroutine tstfunc() 
     implicit none 
     real delta(5, 5) 
     common /test/ delta 
     integer i,j 
     do i = 1, 5 
      do j = 1, 5 
       delta(i,j)=2 
       if(i.ne.j) delta(i,j)=0 
       write (*,*) delta(i,j) 
      end do 
     end do 
    end 

tst01.cc

#include <iostream> 

extern "C" { 
    void tstfunc_(); 
    extern struct{ 
    float data[5][5]; 
    } test_; 
} 

void printmtrx(float (&a)[5][5]){ 
    for(int i=0;i<5;i++){ 
     for(int j=0;j<5;j++){ 
      std::cout << a[i][j] << '\t'; 
      a[i][j] += 2; 
     } 
     std::cout << std::endl; 
    } 
} 

int main() 
{ 
    //start... 
    tstfunc_(); 

    printmtrx(test_.data);//here i want to call delta and manipulate it. 
    return 0; 
} 

Тогда для того, чтобы скомпилировать:

gfortran -c -o tstfunc1.o tstfunc1.f  
g++ -o tst tst01.cc tstfunc1.o -lgfortran 
+0

Дорогой @ewcz, он работает! Спасибо огромное! – Kylxyz

1

Обратите внимание, что 2D-массивы в C равны row-major, тогда как в FORTRAN они равны column-major, поэтому вам нужно переключать индексы массивов на один или несколько языков.

+1

о! Я не знал об этом, Спасибо, человек – Kylxyz

Смежные вопросы