Недавно я обнаружил, что использование strtolower()
может вызвать проблемы, когда данные усекаются после специального символа.
Решение заключалось в использовании
mb_strtolower($string, 'UTF-8');
mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.
blockquote>
Вы помещали свои подпрограммы и функции в модуль и use
этот модуль? В противном случае, вероятно, происходит то, что вы получаете неявное типирование getS в подпрограмме createS как единственную точность реального, но фактически возвращает двойную точность. Другое предложение: всегда используйте implicit none
для поиска необъявленной переменной. Если вы забудете включить implicit none
в исходный код, gfortran предоставляет параметры компилятора -fimplicit-none
. Неявное типирование является пагубным и, вероятно, продолжено в Fortran для поддержки устаревшего кода.
P.S. double precision
также устарел, но гораздо менее рискован, чем неявный ввод текста. Если у вас есть последняя версия gfortran, вы можете использовать следующее:
use ISO_FORTRAN_ENV
real (real64) ::
См. Руководство gfortran.
EDIT: implicit none
изменил тип getS от реального ( 4) (путем неявной типизации) до неизвестного (нет объявленного типа, неявное типирование отключено). Если вы поместите процедуры в модуль, они будут «знать» типы друг друга: возвращаемые функции и типы аргументов. Это исправит эту ошибку. Это также помогает компилятору найти другие ошибки, но позволяет проверять согласованность аргументов между вызовом и аргументами процедуры. См. Правильное использование модулей, подпрограмм и функций в fortran и . Для примера рассмотрим перекрестное произведение двух векторов в Fortran 90 .
Вы не объявляете getS
как функцию в подпрограмме createS
. Вам нужно добавить double precision, external :: getS
в объявления переменных подпрограммы createS
.
заменить двойную точность:
REAL (Kind=8)
INTEGER (Kind=4)
COMPLEX (Kind=8)