Чтение вещественной переменной * 8 со значением 0 с вещественным * 4 приводит к большому числу в фортране без предупреждения - PullRequest
1 голос
/ 18 июня 2019

Чтение вещественной * 4 переменной со значением 0 с вещественным * 8 приводит к большому числу, иногда без предупреждения.

Я не очень хорош в Фортране.Я просто запускал код на Фортране, полученный от кого-то другого, и он сделал ошибку сегментации.Во время отладки я обнаружил, что одна из подпрограмм считывает переменную со значением 0, определенным для real * 8, поскольку real * 4 приводит к большому значению.

Я попытался воспроизвести его с помощью простого кода, ноКомпилятор показал предупреждение о несоответствии аргумента.Мне пришлось вложить коды для воспроизведения подавленного предупреждения в простом коде, но я не уверен, каково точное условие для подавленного предупреждения.

На самом деле, по некоторым причинам, я подозреваю, что это может быть проблемамой компилятор, так как код (не пример кода, оригинальный код) нормально работал на ПК человека, который дал мне код.

file hello.f:

  implicit none
  call sdo()
  END

файл test.f:

  subroutine sdo()
  implicit none
  real*4 dsecs
  dsecs=0
  write(0,*) dsecs
  call sd(dsecs)
  return
  end

файл test2.f:

  subroutine sd(dsecs)
  implicit none
  real*8 dsecs
  write(0,*) dsecs
  return
  end

компиляция ивыполнение:

$ gfortran -o hello hello.f test.f test2.f
$ ./hello

Ожидаемый результат:

0. 00000000
0. 0000000000000000

Фактические результаты:

0. 00000000
-5.2153889789423361E+223

1 Ответ

3 голосов
/ 18 июня 2019

Это не проблема компилятора.Это проблема кода.Ваш код выдал мне предупреждение, что вы делаете что-то гнусное, как и должно быть.Подпрограмма, которая думает, что dsecs имеет длину 4 байта, отправила 4 байта.Подпрограмма, которая думает, что dsecs имеет длину 8 байтов, смотрит на 8 байтов.Что в остальных 4 байтах?Кто знает.Как это выглядит, когда два смешиваются вместе?Наверное, не то, что вы хотите.Это как случайное получение порции половинки мороженого и половины мусора: маловероятно, что вы попробуете так, как вы думали.

Это одна из тех проблем, которые очень просто решаются с помощью этой классической шутки: «Доктор, доктор, этобольно, когда я это ! "- «Тогда ... не делай этого».

РЕДАКТИРОВАТЬ: Извините, я обманул.Я не собирал их как отдельные программы.Когда я делаю, я не получаю предупреждения.Это также нормально - на этапе компиляции вы не указали, как выглядят внешние подпрограммы, поэтому он не может пожаловаться, а компилятор на этапе компоновки больше не проверяет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...