Синтаксическая ошибка в операторе вызова на Fortran

#fortran

#fortran

Вопрос:

Я написал простую тестовую программу, чтобы попробовать подпрограммы и оператор вызова в Fortran. Я использую компилятор gfortran в GNU / Linux. Я объявил 14 параметров, которые пронумерованы соответствующим образом в моем коде. Хотя мой код работает ОТЛИЧНО, когда я пытаюсь передать 11 из этих аргументов через оператор call, я сталкиваюсь с довольно странной «СИНТАКСИЧЕСКОЙ ОШИБКОЙ», когда я пытаюсь включить 12-й аргумент и пытаюсь передать 12 аргументов через оператор call. В чем может быть проблема и как я могу ее исправить? Вот программа, о которой я говорю

`

     program test

         IMPLICIT REAL*4(A-B,D-H,O-Z)
         IMPLICIT COMPLEX(C)
         COMPLEX*16 CQC,CQV

         parameter k1=2   
         parameter k2=2  
         parameter k3=2
         parameter k4=2
         parameter k5=2
         parameter k6=2
         parameter k7=2
         parameter k8=2
         parameter k9=2
         parameter k10=2
         parameter k11=2
         parameter k12=2
         parameter k13=2
         parameter k14=2

         call bins(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12) 

    end program


    subroutine bins(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12)

         integer k1, k2, k3, k4, k5

    end subroutine   `
  

Ниже приведена ошибка, которую я получаю, когда включаю k12 в оператор ‘call’, а затем компилирую его:

`

 siddharth@siddharth-VBox:~/Desktop/Codes$ gfortran test6.for -o  test6.out
test6.for:23.72:

             call bins(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12
                                                                    1
Error: Syntax error in argument list at (1)
test6.for:29.72:

        subroutine bins(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k1
                                                                    1
Error: Unexpected junk in formal argument list at (1)
test6.for:2.72:

        program test                                                    
                                                                    1
test6.for:31.72:

            integer k1, k2, k3, k4, k5                                 
                                                                    2
Error: Two main PROGRAMs at (1) and (2)
  

`

Я повторяю, что я не сталкиваюсь с какими-либо проблемами при компиляции, когда я включаю аргументы от k1 до k11 в оператор вызова, это просто введение 12-го аргумента, который вводит проблему. Любая помощь будет оценена.

Комментарии:

1. предположим, что вы используете fortran с фиксированной формой, вы не можете пройти мимо столбца 72.

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

Ответ №1:

Файлы с .для расширения or .f, по соглашению, рассматриваются как источник фиксированной формы. Заявления в строках фиксированной формы должны располагаться между столбцами 7 и 72 включительно. Обратите внимание на положение столбца в сообщении об ошибке — конец вашего оператора обрезается.

Исправленный источник формы также не чувствителен к пробелам. Все операторы parameter kxxx присваивания перед оператором вызова не выполняют то, что вы думаете.

Не используйте источник фиксированной формы, если вы не модифицируете существующий устаревший код.

Не используйте неявную типизацию, если вы не модифицируете существующий устаревший код (или, возможно, участвуете в каком-то эзотерическом применении универсального программирования). IMPLICIT NONE ваш лучший друг.