Совместимость с PHP - операторы печати не отображаются в командной строке

У меня проблемы с тем, что PHP не возвращает операторы печати из Fortran. Идея состоит в том, что PHP выполняет команду для компиляции файла Fortran, а затем запускает его.

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

Как получить командную строку для печати операторов, вложенных в файл Fortran?

PHP-скрипт

$<?php
// This is a script to test interoperability between Fortran and PHP
$ExecutionStringOne = "gfortran C:\Users\****\Desktop\Programs\Fortran_Programs\FibSequence.f95 -o C:\Users\****\Desktop\Programs\Fortran_Programs\FibSequenceTest";
$ExecutionStringTwo = "C:\Users\*****\Desktop\Programs\Fortran_Programs\FibSequenceTest.exe";
exec ($ExecutionStringOne);
exec ($ExecutionStringTwo);
?>

Код Фортрана:

! This program will calculate the first 7 numbers in the Fibonacci sequence with user input as well as error checking
    Program FibSequence
        implicit none
        ! Defining our global variables 
        Integer :: acceptValue, n_terms          ! Accept Value: 0, 1 - This tracks whether input is correct (0 False, 1 True) , N_terms: Number of terms
        real    :: timeForSubRoutineStart, timeForSubRoutineEnd, totalTime ! Tracks execution time of subroutine
        write(*,*) "Please input an amount of terms to calculate sequentially to - This number can be between 1 and 7"
        read *, n_terms
        if (n_terms > 0 .AND. n_terms <= 7) then
            acceptValue = 1                      ! This is true therefore run program (This isnt really needed but for consistency)
            Call calculateSequence(n_terms)
        else
            acceptValue = 0                      ! This is false therefore run the read again and keep doing so until the output is correct
            do while ( acceptValue == 0 )
                write(*,*) "Invalid number please enter one within the given range - Range ( 1 - 7 )"
                read *, n_terms
                if (n_terms > 0 .AND. n_terms <= 7) then 
                    acceptValue = 1                     !Yay correct input
                    Call calculateSequence(n_terms)
                else
                    write(*,*) "Invalid number, try again" !Boo invalid input
                end if 
            end do
        end if
    End Program
    
    Subroutine calculateSequence(NumberOfTerms)
        Integer :: pt1 = 0, pt2 = 1
        Integer :: pt3
        Call CPU_TIME(timeForSubRoutineStart)
        i = NumberOfTerms
        
        do while (i > 0)
            pt3 = pt1
            pt1 = pt1 + pt2
            pt2 = pt3
            i = i-1
            write(*,*) "Point A Equals", pt1, "Point B Equals", pt2, "Calculated Next Number", pt3
            write(*,*) "Current Term = ", i
            write(*,*) "This program calculated this many points ", NumberOfTerms
            write(*,*) "End" 
        end do
        Call CPU_TIME(timeForSubRoutineEnd)
        totalTime = timeEnd - timeBegin
        write(*,*) "This program took ", totalTime, " seconds to execute"
    end Subroutine calculateSequence

введите здесь описание изображения

EDIT — добавлено новое изображение, касающееся проблемы @roygvib Предлагается ECHO, которое теперь возвращает некоторые операторы печати

введите здесь описание изображения


person HRD1997BFBE    schedule 27.06.2020    source источник
comment
Возможно, эта строка кода Фортрана (Integer :: pt1 = 0, pt2 = 1) предназначена для инициализации pt1 и pt2 при каждом вызове calculateSequence() (как в C или подобных языках)?   -  person roygvib    schedule 27.06.2020
comment
И согласно этой странице (php.net/manual/en/function.exec. php), нам может понадобиться echo перед exec() или добавить выходной аргумент в exec()? (У меня нет опыта работы с PHP, поэтому просто догадываюсь...)   -  person roygvib    schedule 27.06.2020
comment
@roygvib Я попробую использовать echo, чтобы посмотреть, решит ли это довольно привередливую проблему, лол. Чтобы решить вопрос с целым числом, подпрограмма работает по назначению. Я отлаживал, думая о том, что происходит, чего нельзя увидеть в окне терминала. При добавлении неправильных чисел Все, что меньше 0 и больше 7, программа перейдет на новую строку, указывающую, что программа пытается выполнить read*, n_terms еще раз, и это можно проверить, посмотрев на Main() программы, которую она никогда не выполнит подпрограмму, пока не будет введен правильный номер, и затем завершит работу.   -  person HRD1997BFBE    schedule 28.06.2020
comment
@roygvib Я прочитал эту страницу пару раз и понял, что, возможно, мне нужно было включить переменную для возврата данных, но возвращать нечего - это серия операторов печати, поэтому я зашел в тупик.   -  person HRD1997BFBE    schedule 28.06.2020
comment
Интересно, что System() здесь прекрасно работает.. :) Кстати, причина, по которой я спросил о строке Integer::pt1 = 0, pt2 = 1, заключается в том, что Fortran неявно добавляет атрибут SAVE (который похож на static в C- как языки). Таким образом, приведенное выше объявление эквивалентно Integer, save :: pt1 = 0, pt2 = 1, а значения pt1 и pt2 сохраняются среди нескольких вызовов (т. е. они не инициализируются 0 и 1). после второго звонка!). Это печально известная особенность Фортрана (ИМО), и мы должны быть очень осторожны...   -  person roygvib    schedule 28.06.2020


Ответы (1)


С помощью пользователей @roygvib я смог найти решение проблемы.

PHP несколько разных способов выполнения файлов и команд. Один из них, который использовался в наборе задач, - это exec(), который будет выполнять программу и не возвращать никаких результатов.

С другой стороны, существует System(), который запустит данные команды и исполняемый файл и вернет любой вывод, который существует в течение времени жизни выполнения программы.

TLDR: использование System вместо Exec решило проблемы, которые у меня были.

system ($ExecutionStringOne);
system ($ExecutionStringTwo);

person HRD1997BFBE    schedule 28.06.2020