Есть много вещей, чтобы рассмотреть.
Есть два пути. Одним из них является прямое построчное преобразование в c. Под этим я подразумеваю каждое утверждение с Фортрана в эквивалентном утверждении с.
Другой путь - переписать, и с 500k loc + это будет гораздо больше работы.
При таком размере я бы, конечно, искал инструмент для перевода, например, f2c.
Проблемы с прямым портом ...
gotos переводит напрямую, вам нужно будет создать ярлыки для целей goto.
label10:;
goto label10;
Подписка на массив является потенциальной проблемой.
c основано на нуле, fortran - на основе 1, поэтому размеры массивов должны быть на единицу больше в коде fortran.
реальное * 4 a (10,20) становится
#define XMAX 10 + 1
#define YMAX 20 + 1
float a[XMAX][YMAX];
позволяя циклу быть написанным так.
for (x = 1; x <= XMAX; x++)
for (y = 1; y <= YMAX; y++)
a[x][y] = 0.0f;
c Доступ к массиву осуществляется в основном порядке строк, в то время как fortran - основной столбец.
это может быть проблемой производительности. если это станет проблемой, вы можете
чтобы решить это с помощью какого-то макроопределения, которое меняет порядок или индексы массива. Фактически, вы также можете сделать так, чтобы макрос вычитал по одному из каждого из индексов, чтобы он выглядел как массив на основе одного, фактически отображая массив на основе нуля.
real * 8 a (XMAX, YMAX)
а (4,2) = 3,14
#define A(X,Y) a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;
fortran unit io можно моделировать с помощью файлов типа stdio. если вы используете юнит 19, то
FILE *fp19 = fopen("file","mode");
Могут возникнуть проблемы с контролем каретки, если вы используете в ваших файлах контроль каретки fortran. На блоки 5 и 6 можно просто ссылаться с помощью stdin и stdout без fopen.
Многие форматы могут обрабатываться с помощью семейства функций printf. Возможно, вам придется добавить дополнительные циклы для работы с массивом fortran io.
ЗАПИСЬ (6, 200) (PROJ (z, 4), z = 1, 20)
int z;
for (z = 1, z <= 20; z++)
printf("%lf ", proj[z][4]);
o использование f2c, вероятно, самый быстрый способ сделать это. Тогда вы застряли с его RTL.
Выполнение прямого порта - вполне осуществимая вещь. Трудоемкий, но выполнимый
o если вы хотите сохранить его в долгосрочной перспективе, я бы порекомендовал переписать. Очень много времени, вероятно, быстрее, но более долговечно в обслуживании
К счастью, в любом случае у вас есть исходная программа, которую можно использовать в качестве основы для создания набора модульных тестов, помогающих в разработке.