Команда Fortran77 write(0,*) DLL не сбрасывается в консоль R GUI

У меня есть исходный код Fortran77 с множеством команд печати в виде:

запись( идентификатор_файла, метка) некоторая переменная

Этот код F77 скомпилирован с помощью «R CMD SHLIB code.f» в DLL, которая вызывается из R. Если в коде F77 fileID является обычным текстовым файлом, команда работает нормально. Однако в случае стандартного вывода консоли, то есть fileID = 0 , R создает временный файл «fort.0» вместо отображения вывода в окне консоли R GUI.

Эта проблема возникает только в моей 64-битной версии Windows. В 32-разрядной и 64-разрядной версиях Linux выходные данные для fileID = 0 правильно отображаются в консоли.

Я уже пробовал команду flush.console(). Нет успеха.

Может кто знает как решить эту проблему? Переписать команды write(0,*) из F77 в R, к сожалению, нельзя.

Спасибо!


person erf99    schedule 08.03.2016    source источник


Ответы (1)


Вы не должны использовать собственные методы печати в модулях расширения, загруженных в R. Написание расширений R говорит следующее:

6.5.1 Печать с FORTRAN

Во многих системах можно использовать операторы FORTRAN 'запись' и 'печать', но вывод может плохо чередоваться с выводом C и будет невидим на интерфейсах GUI. Они не портативны, и их лучше избегать.

Для упрощения вывода информации из кода FORTRAN предусмотрены три подпрограммы.

 subroutine dblepr(LABEL, NCHAR, DATA, NDATA)
 subroutine realpr(LABEL, NCHAR, DATA, NDATA)
 subroutine intpr (LABEL, NCHAR, DATA, NDATA)

Здесь LABEL — символьная метка длиной до 255 символов, NCHAR — ее длина (которая может быть равна «-1», если нужно использовать всю метку), а DATA — массив длиной не менее NDATA соответствующего типа (' двойная точность», «вещественное» и «целое число» соответственно). Эти подпрограммы печатают метку в одной строке, а затем печатают ДАННЫЕ, как если бы это был R-вектор, в последующих строках. Они работают с нулевым NDATA, поэтому их можно использовать только для печати этикетки.

Я знаю сторону C/C++ намного лучше, и там мы, безусловно, должны использовать Rprintf() и др., чтобы выходные данные хорошо взаимодействовали с собственным потоком вывода R.

person Dirk Eddelbuettel    schedule 08.03.2016
comment
Большое спасибо, Дирк! Так что в принципе мне просто повезло, что он работает под линуксом. Но у меня нет шансов сделать его пуленепробиваемым в графическом интерфейсе Windows. У меня есть возможность переключиться с F77 на простой C (через перевод f2c). В C я мог бы просто заменить все fprintf() на Rprintf(). Как вы думаете, это может сработать? - person erf99; 08.03.2016
comment
Для настоящего решения на Fortran, вероятно, стоит пост r-devel или посмотреть, не вмешается ли настоящий программист на Fortran. Я даже не играю в него по телевизору ... Для стороны C, определенно - некоторые люди также играют с макросами . Я заменил, как вы предлагаете, и Rprintf() и REprintf() работают нормально. - person Dirk Eddelbuettel; 08.03.2016
comment
Еще раз спасибо, Дирк! Затем я попробую версию C, это может быть самый простой вариант. Жаль, однако, что в Linux запись (0, *) работает безупречно с консольным потоком. - person erf99; 08.03.2016