Итерация по массиву символов FORTRAN - PullRequest
1 голос
/ 04 июня 2011

Хорошо, у меня проблемы со следующим кодом Fortran 90. Тестировщик программы должен создать массив символов с именем input, инициализировать все записи пробелом, затем получить от пользователя некоторую строку и сохранить ее на входе. Предполагается, что функция getLength возвращает последний индекс функции, который не является пробелом; так что если пользователь ввел строку «Привет, как дела?», то getLength (input) должен вернуть 11. Он должен работать, начиная с конца данного массива, и отмечая, где появляется первый непробельный символ , Когда я на самом деле пытаюсь запустить его, gfortran говорит: «Ошибка: возвращает несоответствие типа функции getLength в (1) (REAL (4) / INTEGER (4)). мне это исправить? Заранее спасибо!

    program tester
    implicit none
    character(len = 1000) :: input
    external getLength
    do i = 1, 1000
        input(i) = " " 
    end do
    read *, input
    print *, getLength(input)
    end program

    integer function getLength(array) result (length)
    character(len=1000) :: array
    integer :: lenTemp = 1000
    do while (array(lenTemp:lenTemp) == ' ')
        lenTemp = lenTemp - 1
    end do
    length = lenTemp
    end function

1 Ответ

1 голос
/ 04 июня 2011

не похоже, что вы объявляете тип вашей внешней функции getLength, поэтому компилятор предполагает, что getLength имеет тип по умолчанию REAL(4).Рассмотрите возможность замены external getLength на что-то с типом, подобным INTEGER, EXTERNAL :: getLength.

Кроме того, вероятно, не мешало бы включить IMPLICIT NONE в определение функции для большей ясности.Кроме того, с помощью того, как Fortran обрабатывает символьные строки, вы должны просто инициализировать ввод переменной либо пустой строкой, либо одним пробелом.Fortran всегда будет заполнять оставшуюся часть строки пробелами, если вы не заполните ее полностью.Вы действительно должны сделать что-то вроде CHARACTER(LEN=1000) :: input = '', чтобы правильно инициализировать input.

...