Ошибка: несоответствие типа возврата функции в (1) (INTEGER (4) / REAL (4)) [дубликат]

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

Решение заключалось в использовании

mb_strtolower($string, 'UTF-8');

mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.

2
задан milancurcic 25 May 2013 в 01:05
поделиться

3 ответа

Вы помещали свои подпрограммы и функции в модуль и 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 .

4
ответ дан Community 31 August 2018 в 21:28
поделиться

Вы не объявляете getS как функцию в подпрограмме createS. Вам нужно добавить double precision, external :: getS в объявления переменных подпрограммы createS.

2
ответ дан Kyle Kanos 31 August 2018 в 21:28
поделиться

заменить двойную точность:

REAL (Kind=8)
INTEGER (Kind=4)
COMPLEX (Kind=8)
-1
ответ дан younesky 31 August 2018 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: