LINUX.ORG.RU

FORTRAN зараза

 


0

1
PROGRAM BALANCE
! Calculates balance after interest compounded
REAL BALANCE, INTEREST, RATE
BALANCE = 1000
RATE = 0.09
INTEREST = RATE * BALANCE
BALANCE = BALANCE + INTEREST
PRINT*, 'New balance:', BALANCE
END PROGRAM BALANCE

выдает такое

gfortran-7 balance.f
balance.f:1:1:

 PROGRAM BALANCE
 1
Error: Non-numeric character in statement label at (1)
balance.f:1:1:

 PROGRAM BALANCE
 1
Error: Unclassifiable statement at (1)
balance.f:3:1:

 REAL BALANCE, INTEREST, RATE
 1
Error: Non-numeric character in statement label at (1)
balance.f:3:1:

 REAL BALANCE, INTEREST, RATE
 1
Error: Unclassifiable statement at (1)
balance.f:4:1:

 BALANCE = 1000
 1
Error: Non-numeric character in statement label at (1)
balance.f:5:1:

 RATE = 0.09
 1
Error: Non-numeric character in statement label at (1)
balance.f:6:1:

 INTEREST = RATE * BALANCE
 1
Error: Non-numeric character in statement label at (1)
balance.f:7:1:

 BALANCE = BALANCE + INTEREST
 1
Error: Non-numeric character in statement label at (1)
balance.f:8:1:

 PRINT*, 'New balance:', BALANCE
 1
Error: Non-numeric character in statement label at (1)
balance.f:8:1:

 PRINT*, 'New balance:', BALANCE
 1
Error: Unclassifiable statement at (1)
balance.f:9:1:

 END PROGRAM BALANCE
 1
Error: Non-numeric character in statement label at (1)
balance.f:9:1:

 END PROGRAM BALANCE
 1
Error: Unclassifiable statement at (1)
f951: Error: Unexpected end of file in ‘balance.f’

какой fortran установить чтоб оно работало?

Ответ на: комментарий от Irma

а еще лучше добавь по шесть пробелов в начале строки, фортран ищет там метку.

Не лучше, это для совместимости со старыми версиями. Т.н. фиксированная форма. Сейчас нет никакого смысла в ней. И кстати, переменные давно можно называть в нижнем регистре.

В программе кстати еще ошибка. Имя переменной BALANCE совпадает с названием программы.

praseodim ★★★★★
()
Ответ на: комментарий от Irma

Дела обстоят хуже, нужно скомпилировать CalculiX у кторого все расширения файлов заканчиваются на *.f, и компилируется он g77, а у меня gfortran-4.8 по gfortran-8. И какой из имеющихся есть g77?

saufesma
() автор топика
Ответ на: комментарий от firkax

Есть флаг -std=legacy, но он скорее просто отключает предупреждения о старых расширениях, несовместимых с новыми стандартами.

А так действительно, поменяй расширение файла на .f90, так как .f рассматривается компилятором как файл с фиксированным форматом, т.е. с отступами в шесть полей, внутри которых не может быть ничего кроме числовых меток, знаков комментария или символов переноса строки.

grem ★★★★★
()
Ответ на: комментарий от firkax

Бинарной совместимости нет https://gcc.gnu.org/wiki/GFortranUsage

Compatibility with g77

In order to efficiently implement the passing of array sections, binary compatibility to Fortran 77 had to be abandoned. You should not mix object files produced by g77 and gfortran, because this will not result in a working executable.

Сам код при этом вроде обещают, что компилироваться должен https://gcc.gnu.org/fortran/

We highly encourage users to move from g77, which is no longer maintained, and start taking advantage of GFortran's modern features. Legacy g77 code will compile fine in almost all cases.

Т.е, код должен компироваться, но сам g77 уже давно не поддерживается и отсутствует в дистрибутивах.

Не помню, расширение файла должно быть .f77 для лучшей поддержки или только .f

praseodim ★★★★★
()
Ответ на: комментарий от Irma

Однозначно, есть такая опция у компилятора.

Выглядит идиотски, но похоже этой опции у gfortran или нет или далеко спрятана. Во всяком случае gfortran --help ее не предлагает. Думал опция -x подошла бы, но она похоже про другое. Получается все зависит от расширения у имени файла.

praseodim ★★★★★
()
Ответ на: комментарий от rupert

А он и не терял популярности =) В своей области конечно, но у меня впечатление, что современный фортран достаточно фичаст, чтобы на нем с успехом писать хоть бизнес-логику, хоть например веб-сервер.

praseodim ★★★★★
()
Ответ на: комментарий от praseodim

Можно попробовать скормить компилятору опцию -ffree-form, если лень расширения файлов менять.

@saufesma подробнее и больше опций совместимости здесь: https://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html

И, как выше сказали, имя программы не должно совпадать с именем переменной. Если оно когда-то и работало в таком виде, то из-за того, что компилятор игнорировал такое.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от praseodim

Да, добавление опции компилятора -ffree-form и переименовывание BALANCE во что-то другое внутри PROGRAM и END PROGRAM достаточно.

Насчёт сравнения, у меня тут коллега возмущался (несерьёзно, конечно), что вот при сборке Intel в IDE флаги оптимизации уже включены, а у gfortran по умолчанию они не включены. Поэтому ещё вопрос, что за опции они для gfortran использовали. Хотя в листинге когда у них упоминается g95 -O3 reverse.f90, так что не исключено, что они где-то взяли именно компилятор g95. Но может местами всё действительно примерно так и есть.

grem ★★★★★
()
Ответ на: комментарий от praseodim

А есть ли какое пусть не современное, но работающее на фортране графическое ПО под линукс? Ну там не знаю текстовый редактор например =) В гугле не нашёл. хотя есть gtk-fortran.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от grem

А это интересно.


CFLAGS = -Wall -O3 -fopenmp -I ../../../SPOOLES.2.2 -DARCH="Linux" -DSPOOLES -DARPACK -DMATRIXSTORAGE -DNETWORKOUT
FFLAGS = -Wall -O3 -fopenmp

Тут вопрос когда устанавливал gfortran-8 установился gcc-8

CC=cc
FC=gfortran-8 -ffixed-line-length-none -fdefault-real-8 -std=legacy -fd-lines-as-comments

.c.o :
	$(CC) $(CFLAGS) -c $<
.f.o :
	$(FC) $(FFLAGS) -c $<

include Makefile.inc

SCCXMAIN = ccx_2.11.c

OCCXF = $(SCCXF:.f=.o)
OCCXC = $(SCCXC:.c=.o)
OCCXMAIN = $(SCCXMAIN:.c=.o)

DIR=../../../SPOOLES.2.2

LIBS = \
       $(DIR)/spooles.a \
	../../../ARPACK/libarpack_INTEL.a \
       -lpthread -lm -lc

ccx_2.11: $(OCCXMAIN) ccx_2.11.a  $(LIBS)
	./date.pl; $(CC) $(CFLAGS) -c ccx_2.11.c; $(FC) -fopenmp -Wall -O3 -o $@ $(OCCXMAIN) ccx_2.11.a $(LIBS)

ccx_2.11.a: $(OCCXF) $(OCCXC)
	ar vr $@ $?
                                                                               

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

текстовый редактор

Не очень представляю, кому вдруг захочется писать такое на фортран, но есть такой список проектов, которые есть на гитхаб: https://github.com/Beliavsky/Fortran-code-on-GitHub

grem ★★★★★
()
Ответ на: комментарий от grem

Попробовал так

gfortran-8 -ffixed-line-length-none -fdefault-real-8 -std=legacy -fd-lines-as-comments money.f

      PROGRAM MONEY
!     Calculates balance after interest compounded
      REAL BALANCE, INTEREST, RATE
      BALANCE = 1000
      RATE = 0.09
      INTEREST = RATE * BALANCE
      BALANCE = BALANCE + INTEREST
      PRINT*, 'New balance:', BALANCE
      END PROGRAM MONEY

выдало a.out, что с этим делать?

saufesma
() автор топика
Ответ на: комментарий от grem

dflux.f в репозитории есть только routines там для переноса тепла, а мне нужна сварка она в другом dflux.f и автор другого dflux.f меняет в сырцах этот файл, а затем компилирует Calculix.

saufesma
() автор топика
Ответ на: комментарий от praseodim

Для своих вычислительных задач не заметил принципиальной разницы между gfortran и ifort. Вот только ifort не собирает программы с поддержкой параллельных вычислений на macos.

visitor
()