2016-10-25 3 views
4

У меня есть интерактивная программа FORTRAN, которая требует различных входных данных от пользователя. Теперь я хочу сохранить вывод этой программы Fortran в переменную и использовать это значение в сценарии оболочки. Я пробовалВыход программы fortran в переменную

var=`./test` and var=$(./test) 

но в обоих случаях он не запрашивает пользователя для ввода и остается в режиме ожидания. Что мне делать? Кусок пример FORtran кода, как это

test.f 

    program test 
    character*1 resp1, resp3 
    integer resp2, ans 

    write(*,*) 'Think of a prime number less than 10' 
    write(*,*) 'Say whether it is odd or even' 
    write(*,*) 'Write o/e' 
    read(*,*) resp1 
    if (resp1 .EQ. 'e') then 
    ans=2 
    else 
    write(*,*) 'Is the number close to 4 or 8' 
    read (*,*) resp2 
    if (resp2 == 8) then 
    ans=7 
    else 
    write(*,*) 'Is the number greater than or less than 4' 
    write(*,*) 'Write g or l' 
    read (*,*) resp3 
    if (resp3 .EQ. 'l') then 
    ans=3 
    else 
    ans=5 
    end if 
    end if 
    end if 
    write(*,*) ans 
    end 

    Compiled as gfortran test.f -o test 

Затем я использовал скрипт как этот

test.sh 

var=`./test` 
echo "The answer you are looking for is " $var 

Я считаю, что есть что-то очень тривиальным, что я не могу найти. Пожалуйста, помогите мне.

P.S. Это всего лишь пример кода и скрипта, и мой фактический скрипт и код сильно отличаются.

+2

Сводные выходные данные и переменный выход объединены. Не уверен, что это возможно, но вы можете запросить у пользователя стандартную ошибку вместо стандартного вывода? Это сработает. –

+0

Позвольте мне попробовать. Вы имеете в виду использование $? ? –

+0

Я настоятельно рекомендую вам написать бесплатную форму Fortran. См .: http://www.fortran90.org/src/best-practices.html – jlokimlin

ответ

3

Jean-François Fabre является правильным.

program test 
character*1 resp1, resp3 
integer resp2, ans 

write(0,*) 'Think of a prime number less than 10' 
write(0,*) 'Say whether it is odd or even' 
write(0,*) 'Write o/e' 
read(5,*) resp1 
if (resp1 .EQ. 'e') then 
ans=2 
else 
write(0,*) 'Is the number close to 4 or 8' 
read (5,*) resp2 
if (resp2 == 8) then 
    ans=7 
else 
    write(0,*) 'Is the number greater than or less than 4' 
    write(0,*) 'Write g or l' 
    read (5,*) resp3 
    if (resp3 .EQ. 'l') then 
    ans=3 
    else 
    ans=5 
    end if 
end if 
end if 
write(6,*) ans 
end 

Вопросы являются STDERR (0) Ответы стандартного ввода (5), Результат стандартный вывод (6)

var=`./test` 

работает отлично после этого.

+0

0, 5 и 6? Просто из любопытства, что такое 1, 2, 3 и 4? –

+1

Большое спасибо. Оно работает. Я всегда использовал write (*, *). Сегодня я осознал важность чисел внутри. –

+1

@JamesBrown: Насколько я знаю, они могут быть определены как файлы. 0,5 и 6 - это просто старая конвенция, в значительной степени похожая на все остальное в Фортране: D https://en.wikipedia.org/wiki/Standard_streams –

Смежные вопросы