2017-01-28 2 views
1

Это книга 80-х годов, авторы - французский, К. Яблон и Дж. Симон. У меня есть эта книга в переводе на русский язык. Название «Применение ЭВМ для численного моделирования в физике» означает «Применение ECM для численного моделирования в физике», где ECM означает «Электронная вычислительная машина» (не уверен, как она переведена на английский язык, но на русском языке они называли компьютеры под этим именем). Я пытался использовать эту книгу в цифровой форме на русском, английском или французском языках, но ничего не нашел. Если это помогает в любом случае вот фотографии этого в русском языке:Синтаксические ошибки из старого кода, скопированного из книги

https://drive.google.com/open?id=0B2MCX8tD_-VNLTh3dWx0ejJIZW8

Вот код точно так, как напечатано в книге

parameter nn = 100 
    dimension a(nn), b(nn), c(nn), d(nn), x(nn), u(nn) 
    dimension xex(nn), test(nn) 
    common /thomas/ bet(nn), gam(nn) 
    common /perm/ ip(10) 

    call iniper(10, -1) 
    call inhuni(-1) 
    read 222, iter, ifin 
    print 1000, iter, ifin 
    fifin = 1./float(ifin) 
    fiter = 1./float(iter) 
    pi = 3.14159265 
    pi2 = pi * pi 
    xa = 1. 
    xc = 1. 
    read 111, rb 
1 continue 
    read 222, n 
    print 5000, n 
    if(n .gt. nn) stop "alerte" 
    xb = 2. - rb * p12/(float(n + 1) ** 2) 
    print 2000, xa, xb, xc 
    print 3200 
    ermoy = 0. 
    n1 = n - 1 
    do 10 k = 1, n 
     a(k) = xa 
     b(k) = xb 
     c(k) = xc 
10 continue 
    it = 0 
50 continue 
    if (it .eq. ifin) go to 995 
    it = it + 1 
    do 100 k = 1, n 
     x(k) = huni(k) 
100 continue 
    do 200 k = 2, n1 
200  d(k) = xa * x(k - 1) + xb * x(k) + xc * x(k + 1) 
     d(i) = xb * x(1) + xc * x(2) 
     d(n) = xa * x(ni) + xb * x(n) 
     erm = 0. 
     do 150 l = 1, iter 
      call tom(a, b, c, d, 1, n, u) 
      err = 0. 
      anopm = 0. 
      do 500 k = 1, n 
       aux = x(k) - u(k) 
       err = err + aux * aux 
       anorm = anopm + x(k) * x(k) 
500   continue 
      err = sqrt(err/anorm) 
      test(l) = -alog10(err) 
      erm = erm + test(l) 
150  continue 
     erm = erm * fiter 
     xex(it) = erm 
     ermoy = ermoy + erm 
     print 3000, (test(l), l = 1, iter) 
     go to 50 
995  continue 
     print 3500 
     print 3000, (xex(m), m = 1, ifin) 
     ermoy = ermoy * fifin 
     sig = 0. 
     do 996 m = 1, ifin 
      aux = tex(m)/ermoy - 1. 
      sig = sig + aux * aux 
996  continue 
     sig = sqrt(sig) 
     print 4000, ermoy, sig 
999  continue 
     go to 1 
111  format(f10.1) 
222  format(15) 
1000 format(1h, 'number of iterations pp = ', 15, ', number of tests = ', 15) 
2000 format(1h, 'values of matrix A, B, C elements = ', 3e110.4) 
3000 format(1h, 10e12.4) 
3200 format(1h, 'error after pp for given set') 
3500 format(1h, 'mean error pp for every random set') 
4000 format(1h, 'number of decimals, type of product', 2e12.5,11) 
5000 format(1h, 'size of inverse tridiagonal system', 15) 
    end 

    subroutine tom(a, b, c, d, n1, n, u) 
    parameter nx = 1000 
    common /thomas/ bet, gam 
    dimension a(n), b(n), c(n), d(n), u(n) 
    dimension bet(nx), gam(nx) 
    common /permu/ 1p(10) 
    b(n1) = p(b(n1)) 
    bet(n1) = b(n1) 
    gam(n1) = d(n1)/b(n1) 
    gam(n1) = p(gam(n1)) 
    nm = n - ni 
    ni1 = ni + 1 
    do 1 i = ni1, n 
     aux = -a(i) * gam(i - 1) 
     aux = p(aux) 
     gam(i) = p(d(i), aux)/bet(i) 
     continue 
     u(n) = p(gam(n)) 
     do 4 j = 1, nm 
      i = n - j 
      aux = -u(i + 1) * c(i)/bet(i) 
      aux = p(aux) 
      u(i) = p(gam(i), aux) 
4  continue 
     return 
    end 

Я попытался собрать его с помощью ifort и здесь выход

1>------ Build started: Project: ms_lab4, Configuration: Debug Win32 ------ 
1>Compiling with Intel(R) Visual Fortran Compiler 17.0.1.143 [IA-32]... 
1>main.f90 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(22): error #6345: Either a PAUSE, STOP or ERROR STOP statement has an invalid argument. [ALERTE] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(84): error #6885: A dangling constant exists. [15] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(83): error #6885: A dangling constant exists. [11] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(78): error #6181: An extra comma appears in the format list. [,] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(78): error #6885: A dangling constant exists. [15] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(77): error #6885: A dangling constant exists. [15] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(92): error #5143: Missing mandatory separating blank 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(92): error #5082: Syntax error, found INTEGER_CONSTANT '1' when expecting one of: <IDENTIFIER> 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(102): error #6351: The number of subscripts is incorrect. [P] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(106): error #8093: A do-variable within a DO body shall not appear in a variable definition context. [I] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(109): error #6351: The number of subscripts is incorrect. [P] 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(99): error #6321: An unterminated block exists. 
1>c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90(99): error #6323: This label is not defined in this scoping unit. [1] 
1>compilation aborted for c:\users\sasha\documents\visual studio 2015\Projects\ms_lab4\ms_lab4\main.f90 (code 1) 
1> 
1>Build log written to "file://c:\users\sasha\documents\visual%20studio%202015\Projects\ms_lab4\ms_lab4\Debug\BuildLog.htm" 
1>ms_lab4 - 14 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Затем я попытался скомпилировать программу с gfortran

gfortran -c main.f90 
main.f90:2.4: 

    parameter nn = 100 
    1 
Error: Unclassifiable statement at (1) 
main.f90:22.22: 

    if(n .gt. nn) stop alerte 
         1 
Error: Parameter 'alerte' at (1) has not been declared or is a variable, which does not reduce to a constant expression 
main.f90:77.18: 

222  format(15) 
        1 
Error: Unexpected element ')' in format string at (1) 
main.f90:78.52: 

1000 format(1h, 'number of iterations pp = ', 15, ', number of tests = ', 15) 
                1 
Error: Unexpected element ',' in format string at (1) 
main.f90:83.68: 

4000 format(1h, 'number of decimals, type of product', 2e12.5,11) 
                    1 
Error: Unexpected element ')' in format string at (1) 
main.f90:84.60: 

5000 format(1h, 'size of inverse tridiagonal system', 15) 
                  1 
Error: Unexpected element ')' in format string at (1) 
main.f90:88.4: 

    parameter nx = 1000 
    1 
Error: Unclassifiable statement at (1) 
main.f90:92.18: 

    common /permu/ 1p(10) 
        1 
Error: Syntax error in COMMON statement at (1) 
main.f90:106.21: 

      i = n - j 
        1 
main.f90:99.19: 

    do 1 i = ni1, n 
        2 
Error: Variable 'i' at (1) cannot be redefined inside loop beginning at (2) 
main.f90:112.7: 

    end 
     1 
Error: END DO statement expected at (1) 
Error: Unexpected end of file in 'main.f90' 

Тогда я подумал, что, возможно, мне не следует скомпилировать его с расширением *.f90, потому что код старше 90. Я переименовал файл в main.for и попытался скомпилировать его с gfortran.

gfortran -c main.for 
main.for:2.5: 

    parameter nn = 100 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:3.5: 

    dimension a(nn), b(nn), c(nn), d(nn), x(nn), u(nn) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:3.5: 

    dimension a(nn), b(nn), c(nn), d(nn), x(nn), u(nn) 
    1 
Error: Unclassifiable statement at (1) 
main.for:4.5: 

    dimension xex(nn), test(nn) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:4.5: 

    dimension xex(nn), test(nn) 
    1 
Error: Unclassifiable statement at (1) 
main.for:5.5: 

    common /thomas/ bet(nn), gam(nn) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:5.5: 

    common /thomas/ bet(nn), gam(nn) 
    1 
Error: Unclassifiable statement at (1) 
main.for:6.5: 

    common /perm/ ip(10) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:6.5: 

    common /perm/ ip(10) 
    1 
Error: Unclassifiable statement at (1) 
main.for:8.5: 

    call iniper(10, -1) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:8.5: 

    call iniper(10, -1) 
    1 
Error: Unclassifiable statement at (1) 
main.for:9.5: 

    call inhuni(-1) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:9.5: 

    call inhuni(-1) 
    1 
Error: Unclassifiable statement at (1) 
main.for:10.5: 

    read 222, iter, ifin 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:10.5: 

    read 222, iter, ifin 
    1 
Error: Unclassifiable statement at (1) 
main.for:11.5: 

    print 1000, iter, ifin 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:11.5: 

    print 1000, iter, ifin 
    1 
Error: Unclassifiable statement at (1) 
main.for:12.5: 

    fifin = 1./float(ifin) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:13.5: 

    fiter = 1./float(iter) 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:14.5: 

    pi = 3.14159265 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:15.5: 

    pi2 = pi * pi 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:16.5: 

    xa = 1. 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:17.5: 

    xc = 1. 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:18.5: 

    read 111, rb 
    1 
Error: Non-numeric character in statement label at (1) 
main.for:18.5: 

    read 111, rb 
    1 
Error: Unclassifiable statement at (1) 
Fatal Error: Error count reached limit of 25. 

PS код начинается на странице 127 на фото IMG_0192, как вы можете видеть, что есть комментарий раздел на русском языке, я бы попытался перевести его или любую другую страницу, если это помогает

+1

Он выглядит как стандартный исходный формат f66/77, за исключением того, что многие поля, которые должны начинаться в столбце 7 или далее, являются в столбце 5. – tim18

+0

Я уверен, что эти форматы должны быть буквой «I5» i, а не пятнадцатью. – agentp

+0

Глядя на исходные изображения, они имеют четкую цифру - я подозреваю, что это ошибка в книге. Я также отмечаю, что в оригинале была куча продолженных строк, которые вы выбрали для разворота, поэтому вы, вероятно, прошли мимо col 72. – agentp

ответ

4

Есть целые несколько вопросов, в том числе несколько примеров ошибок транскрипции при подготовке печатного текста (который должен вас пугать):

  • Как уже говорилось, код (приблизительно) установленной формы. Компиляторам обычно требуется расширение файла .f или .for, чтобы идентифицировать файл как источник фиксированной формы. Различные столбцы в фиксированной форме имеют особое значение - вам нужно будет убедиться, что ваша транскрипция (и их транскрипция!) Правильно правит. Примечательно, что утверждения должны начинаться в столбце семь (и заканчиваться в столбце 72 или перед столбцом 72), числовые метки операторов должны быть где-то в столбцах с 1 по 5. Непустой/ненулевой символ в столбце шесть является символом продолжения - в изображениях оригинального источника есть несколько из них (они используют * в качестве символа продолжения, но печатный текст часто имеет неправильный столбец) в спецификациях формата, возможно, вы уже учли их с помощью вашего перевода (но убедитесь, что ваши заявления теперь не превышают столбец 72!).

  • Одна из фиксированных исходных форм - это то, что вне контекста символа пробелы в операторах несущественны. Это может создать существенную путаницу, для авторов кода, кодовых считывателей и компиляторов кода. По стандарту вступительный оператор будет фактически разбираться с соответствующим компилятором Fortran в качестве неуместного оператора присваивания переменной parameternn. Вероятно, это было утверждение параметра, синтаксисом которого является parameter(nn=100). Аналогичная постановка появляется в подпрограмме. Синтаксис в источнике может поддерживаться любым компилятором, который они использовали в качестве (непоследовательного) расширения для языка.

  • Поскольку источник использует неявное типирование, обратите внимание, что ошибки транскрипции в именах переменных могут оставаться незамеченными. Вам также необходимо будет рассмотреть возможность такого рода ошибок в любых числовых литералах.Вам нужно будет тщательно изучить источник, чтобы увидеть, что это действительно имеет смысл. Случаи, которые я взял, включают в себя спецификацию формата 15 в выражении 222, который, вероятно, должен быть I5, а переменная с именем 1P в стандартной спецификации блока, ведущего 1 не должна быть там. Кроме того, в некоторых спецификациях формата используются дескрипторы редактирования hollerith, что не имеет большого смысла - я подозреваю, что запятая и пробел были заменены.

Во многих случаях вам необходимо будет перепроектировать намерение оригинального автора.

0

Похоже, что вы не отформатировали его правильно для фиксированного формата, что означает, что столбец 1 зарезервирован для буквы C - означает, что вся строка является комментарием или числом в качестве маркера перехода, столбец 6 зарезервирован для маркер в случае многострочного кода и столбца с 7 по 72 для действительного кода, см. эту ссылку. wiki https://de.wikibooks.org/wiki/Fortran:_FORTRAN_77:_Programmaufbau

Смежные вопросы