Ваш код не делает то, что вы хотите, потому что, когда вы говорите
out1(top)=str
в своем коде, вы в основном назначаете содержимое str
последнему символу out1
, что,учитывая ваш ввод 'abcd'
функции, выдает символ a
.Есть много лучших способов добиться того, чего вы хотите, и вот один из способов сделать это в современном Fortran:
! /11734130/preobrazovanie-funktsii-steka-s-c-v-fortran
module Stack_mod
integer, parameter :: MAX_STACK_SIZE = 30
type :: JaggedArray_type
character(:), allocatable :: Record
end type JaggedArray_type
type :: Stack_type
integer :: top = 0
type(JaggedArray_type) :: Array(MAX_STACK_SIZE)
contains
procedure, pass :: push
end type Stack_type
contains
subroutine push(Stack,record)
implicit none
class(Stack_type), intent(inout) :: Stack
character(*), intent(in) :: record
if (Stack%top>MAX_STACK_SIZE) then
write(*,"(*(g0,:,' '))") "Stack2 overflow: May be invalid prefix expression"
else
Stack%top = Stack%top + 1
Stack%Array(Stack%top)%record = record
write(*,"(*(g0,:,' '))") "this is the test",Stack%top,"is",Stack%Array(Stack%top)%record
end if
end subroutine push
end module Stack_mod
program testf1
use Stack_mod, only: Stack_type
implicit none
type(Stack_type) :: Stack
call Stack%push("abcd")
write(*,"(*(g0,:,' '))") "This is from the main program: ", Stack%Array(Stack%top)%record
end program testf1
Компиляция и запуск компилятором Fortran 2008 дает:
$gfortran -std=f2008 testf1.f90 -o main
$main
this is the test 1 is abcd
This is from the main program: abcd
Вы можете проверить это здесь онлайн: https://www.tutorialspoint.com/compile_fortran_online.php
Я надеюсь, что я не просто ответил на вопрос домашней работы здесь и что вы пытаетесь узнать что-то на StackOverflow.