Программа получила SIGSEGV - недействительная ссылка на память - PullRequest
2 голосов
/ 22 января 2020

Я написал небольшой компоновщик на фортране - cpp, чтобы прочитать файл с некоторыми числами.

  $cat mainProg.f

  program fprogram
  real*8 c(30)

  do i=1,30
     c(i) = i * 1.0
  end do
  print*,"Before calling cpp function"
  c PASS ARRAY "C" TO CPP
  call pass_to_cpp(c)
  print*,"After calling cpp function"
  do i=1,30
     print*,' c =',c(i)
  end do

  print*,"I'm done here ..!!"
  c      stop
  end

и,

  $cat cprog.C

  #include<iostream>
  #include<cmath>
  #include<fstream>
  using namespace std;

  extern "C" {
        void pass_to_cpp_(double *c);
  }
  void pass_to_cpp_(double *c)
  {
    ifstream myfile ("example.txt");
    for(int i=0; i<30; i++)
    {
        myfile >> c[i];
        cout <<"called = " << i << "\n";
    }
  }

Я строю это на Ubuntu 16.04 для запуска на windows машине. Я использую mingw для компиляции.

Вот ошибка на windows:

   called = 0
   Program received a signal SIGSEGV: Segmentation fault - invalid memory reference
   Backtrace for this error:
   #0 ffffffffffffff
   #1 ffffffffffffff
   #2 ffffffffffffff
   #3 ffffffffffffff
   #4 ffffffffffffff
   #5 ffffffffffffff
   #6 ffffffffffffff
   #7 ffffffffffffff
   #8 ffffffffffffff
   #9 ffffffffffffff
   #10 ffffffffffffff
   #11 ffffffffffffff
   #12 ffffffffffffff
   #13 ffffffffffffff
   #14 ffffffffffffff
   #15 ffffffffffffff

Файл 'example.txt' представляет собой простой файл с 30 числами.

Любые предложения о том, что является причиной ошибки?

Я скомпилировал это:

    $ x86_64-w64-mingw32-gfortran -c main_read.f
    $ x86_64-w64-mingw32-g++ -c cread.C
    $ x86_64-w64-mingw32-gfortran -o read.exe main_read.o cread.o -lstdc++ -static

Если я не использую -stati c, он жалуется, что libgfortran3.dll не найден ».

...