gfortran for dummies: Was macht mcmodel = medium genau?

Ich habe einen Code, der mir beim Kompilieren Versetzungsfehler verursacht. Im Folgenden finden Sie ein Beispiel, das das Problem veranschaulicht:

  program main
  common/baz/a,b,c
  real a,b,c
  b = 0.0
  call foo()
  print*, b
  end

  subroutine foo()
  common/baz/a,b,c
  real a,b,c

  integer, parameter :: nx = 450
  integer, parameter :: ny = 144
  integer, parameter :: nz = 144
  integer, parameter :: nf = 23*3
  real :: bar(nf,nx*ny*nz)

  !real, allocatable,dimension(:,:) :: bar
  !allocate(bar(nf,nx*ny*nz))

  bar = 1.0
  b = bar(12,32*138*42)

  return
  end

Kompilieren Sie dies mitgfortran -O3 -g -o test test.fIch erhalte den folgenden Fehler:

relocation truncated to fit: R_X86_64_PC32 against symbol `baz_' defined in COMMON section in /tmp/ccIkj6tt.o

Aber es funktioniert wenn ich benutzegfortran -O3 -mcmodel=medium -g -o test test.f. Beachten Sie auch, dass es funktioniert, wenn ich das Array zuweisbar mache und es innerhalb der Subroutine zuordne.

Meine Frage ist was genau macht-mcmodel=medium tun? Ich hatte den Eindruck, dass die beiden Versionen des Codes (die mitallocatable Arrays und das ohne waren mehr oder weniger gleichwertig ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage