Использовать трубу между FORTRAN и переполнением стека

Я пытаюсь передать большой объем данных (двойные числа) из программы FORTRAN в программу C ++ с использованием метода pipe.

Я последовал за http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx для части C ++. Но для части FORTRAN (которая является дочерним процессором) я не знаю, как правильно записывать данные. Нужно ли записывать все числа на консоли, используя WRITE(*,*) а затем прочитать его с помощью программы C ++?

Мой код FORTRAN для записи данных:

        DO 281 I=1,NDOF
DO 280 J=1,UBW
IF (S(I,J).NE.0) THEN
WRITE (*, 2770) I,(J+I-1)
WRITE (*,2760) (S(I,J))
ENDIF
280    CONTINUE
281    CONTINUE

Я не думаю, что моя часть на Фортране верна, потому что запись на консоли занимает много времени! (Это даже становится медленнее, чем передача данных по файлу !!!)
Любое предложение приветствуется.

0

Решение

Вы упомянули запись в файлы. Задумывались ли вы об использовании двоичного вывода из программы на Фортране и двоичного ввода на стороне C ++ с использованием fread? Это значительно быстрее, так как в этом нет никакого анализа. Если это все еще медленно, то трубы на самом деле не решат вашу проблему со скоростью.

Если силы, которые настаивают на том, что вы используете форматированный вывод и каналы, пусть будет так. Скажем, ваша фортранская программа называется fort, а ваша c ++ программа — cpp. Чтобы проверить ваш Fortran выход

fort > xxx.txt

На стороне C ++ вам не нужно использовать createpipe, если это просто односторонняя связь, вы можете просто использовать stdin. Таким образом, это довольно легко проверить с помощью

type xxx.txt | cpp

Когда все работает, используйте

fort | cpp

Использование обработки файла / канала MS может быть быстрее, но вам все равно нужно прочитать данные в буфер и выполнить sscanf, что и делает C I / O, так что вы также можете просто использовать C I / O и scanf из stdin. Если вы делаете это в двоичном формате, вся часть scanf может быть опущена. Преимущество использования стандартного содержимого состоит в том, что вы можете потом легко перенести его на Unix или другую операционную систему.

Другой альтернативой является преобразование программы на Фортране в библиотеку и вызов ее из C ++. Таким образом, вы просто возитесь с массивами вместо ввода-вывода.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru