На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Fortran , перекодить в др.язык
      Появилась необходимость перегнать старую прогу (1984г.) написанную на фортране на что угодно. необходимости вникать в смысл алгоритма нет, нужно просто перегнать прогу.
      Проблема в том, что не знаю я Фортрана. Подскажите пару книг с предметными указателями, а то скачал пару книг. там нет ничего подобного, что затрудняет процесс перекодинга =(

      если есть знающие Фортран, отпишитесь пжлст. хотелось бы спросить пару вещей по коду.
        Спрашивай. Зачем спрашивать разрешения спросить?
          Как меня учили в1980г - Фортран изучается за 4 часа теоретических занятий и 4 часа практических занятий. И в чем проблема? (Тем более, если знаете другие языки программирования).
            SergeyIT
            Фортран изучается столько же времени, как и другие языки программирования, не быстрее. Как и для других языков, получается побыстрее, если что-то уже знаешь

            Lamer#1
            Тебе надо узнать самые основы языка, остальное сможешь спросить.
            Знаю пару переводчиков FORTRAN->С, оба бесплатных, f2c (используется для перевода программ на сайте ВЦ МГУ) и forc (FORTRAN 77). Можешь попробовать в поисковиках
              По-моему, Fortran очень похож на Visual Basic. По крайней мере, мне, в своё время, не составило большого труда мигрировать.
              Сообщение отредактировано: Alexanbar -
                Взялся за работу. попытаюсь взять проблему наскоком.
                к примеру
                ExpandedWrap disabled
                  001 DIMENSION C[15,15],CI[15,15],FI[14]
                  002 INTEGER FI[160],US[160],KI,KL,KS

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

                и еще такой вопрос:
                ExpandedWrap disabled
                  013       DO I=1,N
                  014       ..IF(I<I0)
                  015       ....WRITE(1,140)I
                  016  140  ....FORMATE('x',I1)
                  017       ...ELSE
                  018       ....WRITE(1,141)I
                  019  141  ....FORMAT('x'I2)
                  020       ....END
                  021       ..TEXT('   ')
                  022       ..ENDI


                как я понял точки это вложенность.
                1. почему FORMATE и FORMAT по разному написали? и что эти команды означают?
                2. чем Text от Writez отличается?
                3. и примерно это будет выглядить на пасе/дельфе?! думаю если увижу аналогию пойму смысл команд =)
                  0. В Фортране существуен неявное описанеи типов: все переменные, имена которых начинаются с I...N - целые, а остальные - REAL*4 (в Паскале - single).
                  1. Думаю, опечатка (по крайней мере, я такого не знаю).
                  2. TEXT - первый раз вижу. Это какой-то странный Фортран.
                  3:
                  ExpandedWrap disabled
                    for i := 1 to n do begin
                      if i < i0 then begin
                        writeln(f1,'x',i:1); // f1 - файл - тот, что был ранее открыт open(unit=1,file='myfile.txt',form='formatted'), 'x' - вероятно, управляющий символ, назначения не помню
                      end else begin
                        writeln(f1,'x',i:2; // отличается только тем, что вывордится 2 знака вместо 1, для фортрана это важно (в отличие от Паскаля), т.к. в паскале длина записи числа увеличивается, если ее не хватает, а в фортране все число замещается звездочками
                      end; // здесь в фортране явно ошибка: должно быть ENDIF
                    // что таое TEXT - не знаю, возможно, какая-то специфическая консрукция компилятора. По крайней мере, процедуры или функции так не вызываются.
                    end; // а здесь вместо ENDI должно быть ENDDO

                  Да, по поводу FORMAT - это указание, каким образом надо выводить то, что описанов операторе WRITE, при этом в WRITE(N,M) M - это метка оператора FORMAT, а N - номер устройства (файл, консоль, принтер и т.п., причем консоль по умолчанию имеет номер 5, так что 1 должен быть файлом)
                  Вообще же FORMAT допускает столько различных возможностей, что считается самой сложной частью в Фортране.

                  В общем, конструкция на Фортране
                  ExpandedWrap disabled
                          open(unit = 1, file = 'MyFile.txt', form = 'formatted', status = 'new')
                          write(1,100)i ! выводим переменную i на устройство 1 по формату 100
                     100  format(1h,i4) ! первый символ управляющий - в данном случае просто пропускается
                  эквивалентна
                  ExpandedWrap disabled
                    var t : text; // эквивалентна квалификатору 'formatted'
                    ...
                    assign(t,'myfile.txt'); // эквивалентно file=
                    rewrite(t); // сходно с 'new'
                    writeln(i:4);
                  Сообщение отредактировано: andriano -
                    Цитата Lamer#1 @
                    взять проблему наскоком

                    Не советую. (Возможно по граблям ходить придется, если в программе много математики)
                    Лучше найдите описание Фортрана, который используется.
                    Это из опыта - сам когда-то переводил свои программы с Фортрана (FORTRAN-IV, а Ваш похоже более поздний).
                    Примеры:
                    - массивы в разных языках разным способом хранятся в памяти, хотя бы по строкам и столбцам;
                    - циклы даже в одном компиляторе могут по-разному компилиться, в зависимости от опции (то есть имеется опция где проверять переменную цикла в начале цикла или в конце);
                    - вычисляемый IF;
                    - имеются общие блоки - тоже надо понять их особенности;
                    - передача параметров в подпрограммы;
                    - в подпрограммах могут использоваться Entrypoins - тоже надо понять;
                    - и т.д.
                    А FORMAT - не самое сложное - обычно всех его возможностей не используют.
                      В общем большую половину сделал.. но при этом пропускал то что не понимал.

                      Можно пожалуйста конкретнее про структуру
                      ExpandedWrap disabled
                        015       ....WRITE(1,140)I
                        016  140  ....FORMAT('x',I1)

                      Что означают параметры Write, 1 и 140?!
                      после WRITE(1,140) стоит I, его видимо надо записать в файл.
                      И про параметры команды FORMAT.

                      Есть еще кусок кода с
                      ExpandedWrap disabled
                        Write(1,10)I
                        Format(/,'Номер опыта',13)

                      Возможно в предыдущем куске кода Х это не управляющий символ, а просто текст?
                        Lamer#1
                        За номерным идентификатором закреплен формат "140 ....FORMAT('x',I1)".
                        За номером "1" закреплен ,скорее всего, какой-то файл.
                        Конечным итогом является результат: запись значения переменной "I" в файл "1" форматом "140".

                        Добавлено
                        А вообщем в пару слов и не уложишься описанем инструкции Format. Если есть желание, могу скинуть литературу, где описан стандарт Ф90 вцелом, и инструкция Format в частности.
                          NetVir, был бы благодарен. Если можно на mdas@mail.ru.

                          А то что за формат 140 мне не известно к сожалению =( и в разных FORMAT разные форматы использованы = (

                          И всё же что такое 'х' ?! всё таки управляющий символ?
                          Сообщение отредактировано: Lamer#1 -
                            Lamer#1
                            Вы меня не поняли. За числом 140 закрепляется некоторый формат FORMAT('x',I1). И дабы в последующем не писать строки ввода/вывода типа Write([устройство ввода/вывода], '('x',I1)') [список идентификаторов переменных], достаточно писать Write([устройство вывода], 140) [список идентификаторов переменных]. Т.с. за числом 140 вы закрепили форматированную константу.
                            Сообщение отредактировано: NetVir -
                              NetVir, терь понял, почитал про форматы. Разобрался чуток с ними. И всё таки так и осталось для меня неизвестным строка
                              FORMAT('x'I2)
                              Понял что записывается целое число в 2 поля (I2), в что за 'x'?

                              Не означает ли это что, выведется 'x' и что передается в WRITE(...)<переменная>?!
                                Lamer#1
                                Чесно говоря, не могу дать утвердительный ответ на ваш вопрос. Скорее всего, этот "х" указывает на регулирование позиции вывода целого числа. Проверьте почту. Я вам выслал стандарт Ф90.
                                  NetVir, да я видел, Спасибо. на данный момент качается. Просто в коде встречаются подобные строки
                                  ExpandedWrap disabled
                                    FORMAT(/,'Cтандартное отклонение переменной',I3,': ',E5)

                                  поэтому навело меня на мысль что FORMAT('x'I2) сделает
                                  Цитата
                                  выведется 'x' и что передается в WRITE(...)<переменная>?!
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0596 ]   [ 15 queries used ]   [ Generated: 1.05.24, 11:07 GMT ]