История изменений
Исправление grem, (текущая версия) :
1. Да, тут можно и наружу вынести. Не помню почему решил всё в одно условие писать. Скорее всего проверял на одной строке, а потом размножил. В варианте на C++ ещё проверялось, что строка не меньше 80 символов, а то вдруг короче. Хотя в целом предполагается, что в читаемом файле нет ошибок заполнения. И из-за трёх проверок, решил, что особого смысла нет выносить одну наружу или делать последовательно вложенную структуру. Выполняется всё равно очень быстро.
2. Почему не питон? Потому, что на python, а после более аккуратно на C++ я это уже написал. В Python я не понял как создать класс содержащий массив структур. Поэтому класс содержал структуру, а снаружи был массив из членов этого класса, который заполнялся. В C++ с этим проблем не было.
Хотелось чуть попрактиковаться в Fortran. На самом деле, для работы со строками там, на мой взгляд, возможности богаче чем в чистом C - достаточно много встроенных функций: среди них: срезы (в python почти такие же); поиск внутри символа из набора символов, по подстроке, проверка на наличие символа не из набора символов - всё это как в прямом, так и в обратном направлении. Разве что сама строка фиксированной длины, поэтому в варианте на Fortran нет сравнения с длинной строки, она и так всё время 80 для переменной. Придётся динамически создавать строку нужной длины на основе среза. Что-то такое:
...
character(20) :: tmp = "O "
character(len=:), allocatable :: key
...
allocate( key, source = tmp(:len_trim(tmp)) )
print *, "_",tmp,"_"
print *, "_",key,"_"
...
_O _
_O_
«_» - для визуализации границ.
Опять же, если числа читать по формату, то можно сразу кучей в массив передавать, без циклов.
Исправление grem, :
1. Да, тут можно и наружу вынести. Не помню почему решил всё в одно условие писать. В варианте на C++ ещё проверялось, что строка не меньше 80 символов, а то вдруг короче. Хотя в целом предполагается, что в читаемом файле нет ошибок заполнения. И из-за трёх проверок, решил, что особого смысла нет выносить одну наружу или делать последовательно вложенную структуру. Выполняется всё равно очень быстро.
2. Почему не питон? Потому, что на python, а после более аккуратно на C++ я это уже написал. В Python я не понял как создать класс содержащий массив структур. Поэтому класс содержал структуру, а снаружи был массив из членов этого класса, который заполнялся. В C++ с этим проблем не было.
Хотелось чуть попрактиковаться в Fortran. На самом деле, для работы со строками там, на мой взгляд, возможности богаче чем в чистом C - достаточно много встроенных функций: среди них: срезы (в python почти такие же); поиск внутри символа из набора символов, по подстроке, проверка на наличие символа не из набора символов - всё это как в прямом, так и в обратном направлении. Разве что сама строка фиксированной длины, поэтому в варианте на Fortran нет сравнения с длинной строки, она и так всё время 80 для переменной. Придётся динамически создавать строку нужной длины на основе среза. Что-то такое:
...
character(20) :: tmp = "O "
character(len=:), allocatable :: key
...
allocate( key, source = tmp(:len_trim(tmp)) )
print *, "_",tmp,"_"
print *, "_",key,"_"
...
_O _
_O_
«_» - для визуализации границ.
Опять же, если числа читать по формату, то можно сразу кучей в массив передавать, без циклов.
Исходная версия grem, :
1. Да, тут можно и наружу вынести. Не помню почему решил всё в одно условие писать. В варианте на C++ ещё проверялось, что строка не меньше 80 символов, а то вдруг короче. Хотя в целом предполагается, что в читаемом файле нет ошибок заполнения. И из-за трёх проверок, решил, что особого смысла нет выносить одну наружу или делать последовательно вложенную структуру. Выполняется всё равно очень быстро.
2. Почему не питон? Потому, что на python, а после более аккуратно на C++ я это уже написал. В Python я не понял как создать класс содержащий массив структур. Поэтому класс содержал структуру, а снаружи был массив из членов этого класса, который заполнялся. В C++ с этим проблем не было.
Хотелось чуть попрактиковаться в Fortran. На самом деле, для работы со строками там, на мой взгляд, возможности богаче чем в чистом C - достаточно много встроенных функций: среди них: срезы (в python почти такие же); поиск внутри символа из набора символов, по подстроке, проверка на наличие символа не из набора символов - всё это как в прямом, так и в обратном направлении. Разве что сама строка фиксированной длины, поэтому в варианте на Fortran нет сравнения с длинной строки, она и так всё время 80 для переменной. Придётся динамически создавать строку нужной длины на основе среза. Что-то такое:
...
character(20) :: tmp = "O "
character(len=:), allocatable :: key
...
allocate( key, source = tmp(:len_trim(tmp)) )
print *, "_",tmp,"_"
print *, "_",key,"_"
...
_O _
_O_
«_» - для визуализации границ.