FORTRAN: Перекрытие common-блоков

loki69

Есть одна прога- написана частично на фортране, частично на С, все это дело компиллируется частично ваткомовским компилером, частично интеловским, собирается ваткомовским линковщиком.Собирается все под вендой, но можно исхитриться и собрать под вендой, так чтобы работало под линуксом. К этой проге есть доп. функционал сделанный через dll, но с этим возникает на данном этапе проблема в плане работы такой фигни под линуксом+ интересует именно параллельный режим работы (через mpi).dll собрана из фортрановских исходников ваткомовскими средствами. не особо сложно было это все дело собрать в итоге вместе в 1 прогу без использования dll, но есть при этом проблемы - фортрановские коммон- блоки в оригинальной проге и доп. функционале частично перекрываются.Исправлять все переменные, которые перекрываются- не вариант. Есть ли какие-то хитрые средства, чтобы с одной стороны избежать перекрывания коммон- блоков, с другой стороны прогу собрать как 1 целое?
Сорри, возможно вопрос ламерский, но я не большой спец в проганье, а фортран я вообще знаю лишь очень поверхностно.

durka82

фортрановские коммон- блоки в оригинальной проге и доп. функционале частично перекрываются.Исправлять все переменные, которые перекрываются- не вариант.

Зачем исправлять переменные?
Что мешает переименовать перекрывающиеся комонблоки (все равно в какой части)?

loki69

Я говорю, что не спец в фортране, поэтому не знаю, что нужно исправить, а что не нужно. Вижу, например, в этих прогах блок /atoms/ а там массивы x, y и z, при компилляции на атомс он ругался.
То есть достаточно в одной из прог поставить /atoms1/ и все окей в этом плане станет? ( там на самом деле туча этих блоков, несколько десятков, переменных порядка сотни думаю одинаковых) Еще раз сорри, но в фортране я ламо полное.

durka82

Вижу, например, в этих прогах блок /atoms/ а там массивы x, y и z, при компилляции на атомс он ругался.

Это и есть имя комонблока.
То есть достаточно в одной из прог поставить /atoms1/ и все окей в этом плане станет?

Должно.

loki69

Спасибо, сейчас грепну их и перепишу!

BondarAndrey

В работе с common блоками, по крайней мере с g77 есть пара подводных камней.
1. Объявляте переменные в common'е нужно в порядке убывания их размера (в байтах). В противном случае g77 переупорядочит переменные в памяти, и при их чтении возникнет баальшой сурприз.
2. в common блоках можно отбрасывать последние переменные, например, неиспользуемые в данной подпрограмме. Будет предупреждение о разных размерах common'ов, но работать будет. Так могут возникать "перекрывающиеся" common'ы — с одинаковым именем, но разным набором переменных. Насколько это переносимо — не знаю.

durka82

Греп затянулся?
Оставить комментарий
Имя или ник:
Комментарий: