Я скомпилировал код с помощью компилятора gfortran и AOCC flang, но он не работает для обоих. Что-то не так?
program find_sub_indx
implicit none
!decl
character(len =30) :: main_string, sub_string
integer :: index_1 , index_2
logical :: back
!defn
main_string = "this is the main string"
sub_string = "a"
back = .false.
index_1 = INDEX(main_string, sub_string, back) !why does this not work
index_2 = INDEX("this is the main string","a", .false.) !this works why?
print *, "index_1 is " , index_1, index_2
end program find_sub_indx
Ожидаемый результат:
index_1 is 14 14
Фактический результат:
index_1 is 0 14
Есть ли какая-то стандартная ссылка для изучения фортрана, поскольку я не смог найти правильное определение встроенной функции, использованное выше.
При первой попытке использовать index
INDEX(main_string, sub_string, back)
переменные main_string
и sub_string
имеют длину 30. После присваивания
sub_string = "a"
переменная sub_string
имеет значение, начинающееся с a
но имеет 29 конечных пробелов после этого.
Итак, функция оценивается как
INDEX(main_string, 'a ', back)
Эта подстрока, конечно, не найдена в main_string
, и результат правильный 0
.
Вместо этого вы можете использовать
INDEX(main_string, TRIM(sub_string), back) !or
INDEX(main_string, sub_string(1:1), back)
или объявить sub_string
длиной 1
.
Буквенная константа "a"
во второй попытке имеет длину 1 и не имеет этих завершающих пробелов.
Вы можете прочитать стандарты языка (ссылки найдены здесь), но документация вашего компилятора, вероятно, также содержит такие описания.
@SameeranJoshi Если вам нужна книга, я бы порекомендовал oxfordscholarship.com/view/10.1093/oso/9780198811893.001.0001/…
Спасибо, есть ли какая-то стандартная ссылка для изучения фортрана, так как я не смог найти правильное определение встроенной функции, использованное выше.