Фортран 77 преобразование в С ++ - PullRequest
3 голосов
/ 30 ноября 2010

У меня есть приложение на Fortran 77, которое использует общие объявления для «совместного использования» переменных памяти. В те времена, когда память была дорогой и ее трудно было найти, это был обходной путь.

Управляемое оборудование устанавливает флаги состояния. Эти флаги находятся в этих общих переменных.

Любые предложения о том, как реализовать общую функциональность в C ++?

Возможно, класс со всеми общедоступными переменными. Таким образом, любая программа, создающая экземпляр этого класса, будет иметь доступ к содержимому переменных Common.

Существуют ли какие-либо учебные пособия / руководства по конвертации Фортрана в C или C ++?

Спасибо

Ответы [ 6 ]

2 голосов
/ 30 ноября 2010

В этом учебнике по Фортрану для C / C ++ предлагается:

      FORTRAN:
           DOUBLE PRECISION X
           INTEGER A, B, C
           COMMON/ABC/ X, A, B, C

      C:
           extern struct{
               double x;
               int a, b, c;
           } abc_;

      C++:
         extern "C" {
           extern struct{
               double x;
               int a, b, c;
           } abc_;
         }

Вы помещаете структуру extern в файл .h, на который ссылаются файлы C / C ++, с помощью #include, и точно в один файл .c или .cpp вы помещаете именно то, что было в файле .h, но без "extern". "слово.

Я предполагаю, что то, с чего вам следует начать, является относительно кратким и непонятным, и вы хотите перевести его на C ++ таким образом, чтобы сохранить почти однозначное соответствие оригиналу.

2 голосов
/ 30 ноября 2010

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

Если вы хотите напрямую преобразовать общие блоки в C ++, вам придется создать целую кучу глобальных / статических переменных или использовать безымянное пространство имен.

Однако это нарушает сокрытие информации, и большинство людей посоветовали бы вам не бездумно использовать глобальные переменные.

В более общем плане вас может заинтересовать книга Бартона-Нэкмана Научно-технический отдел C ++: введение в расширенные методы и примеры . Это немного устарело, но это не должно иметь большого значения. Он учит вас C ++ для научных или инженерных приложений, предполагая, что у вас есть Fortran / процедурный опыт.

1 голос
/ 07 декабря 2010

Я знаю, что повторяю то, что сказал в комментарии, но я не думаю, что кто-то понял.

Фраза «управляемое оборудование» сигнализирует мне, что программа является своего рода драйвером устройства, и весьма вероятно, что устройство ожидает, что его флаги будут в определенной области памяти. Причина использования общего хранилища заключается в том, что различные модули могут обращаться к этим областям и обновлять их напрямую. Перевод их в C extern should работает, но вам действительно нужно получить документацию по интерфейсу устройства, чтобы убедиться, что вы делаете это правильно.

Потеря общего storgage, как предполагают некоторые авторы, просто не сработает при этих обстоятельствах. Наилучшим подходом, если у вас есть время и уверенность, было бы иметь статический класс, который обрабатывает все обновления в общем хранилище, и заменять все операции чтения и записи в общее хранилище на «get» s и «set» s на новый класс.

1 голос
/ 30 ноября 2010

По поводу моего комментария к ответу Александроса «естественная» транслитерация состоит в том, чтобы включить все в блоки common как статические классы в коде c ++.Результатом будет , а не - хороший код на C ++, но это даст место для начала рефакторинга.

Тем не менее, я бы обычно пытался связать внешний интерфейс C ++ с существующим внутренним сервером Fortranсначала и затем запустите процесс перевода, если он все еще кажется хорошей идеей.

0 голосов
/ 07 декабря 2010

Как ни странно, это может быть место, где c, как следует использовать битовое поле.

У него есть аппаратная часть, которая, вероятно, имеет различные регистры управления и флаги состояния, сопоставленные с некоторой фиксированной памятью.address.

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

Поскольку значения полей могут меняться безобратите внимание, что может понадобиться нарушающий квалификатор.

Было бы полезно, если бы спрашивающий предоставил больше информации о расположении общего блока и интерпретации данных внутри него.

0 голосов
/ 30 ноября 2010

Не делайте этого вообще, обычные блоки - анафема в наши дни.

...