Массив строк в Фортране 77

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

Вам нужно иметь файл setup.py в том же каталоге, что и файл, который вы запускаете, при условии, что файл имеет все шаги луча.

import setuptools

setuptools.setup(
              name='whatever-name',
              version='0.0.1',
              install_requires=[
                  'apache-beam==2.10.0',
                  'tensorflow-transform==0.12.0'
                  ],
              packages=setuptools.find_packages(),
              )

В файле python у меня было

options = PipelineOptions()

, которое нужно было изменить на:

options = PipelineOptions(setup_file="./setup.py")
7
задан Siu 7 April 2009 в 12:52
поделиться

3 ответа

Функциональный Timotei отправил, даст Вам длину строки пока часть строки, которой Вы интересуетесь, только содержит пробелы, которые, если Вы присваиваете значения в программе, должны быть верными, поскольку ФОРТРАН, как предполагается, инициализирует переменные, чтобы быть пустым и для символов, который означает пространство.

Однако, если Вы читаете в из файла, Вы могли бы взять другие управляющие символы в конце строк (особенно возврат каретки и/или символы перевода строки, \r и/или \n в зависимости от Вашей ОС). Необходимо также выбросить тех, которые в функции для получения корректной длины строки. Иначе Вы могли получить некоторые забавные операторы печати, поскольку те символы печатаются также.

Вот моя версия функции, которая проверяет на альтернативные пробельные символы в конце помимо пробелов.

  function strlen(st)
  integer           i,strlen
  character         st*(*)
  i = len(st)
  do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or.
 +  (st(i:i).eq.'\n').or.(st(i:i).eq.'\t'))
    i = i - 1
  enddo
  strlen = i
  return
  end

Если будут другие символы в разделе "мусора", то это все еще не будет работать полностью.

Предположение, что это действительно работает на Ваши данные, однако, можно затем изменить оператор записи для сходства с этим:

write(*,*) matname(matidx)(1:strlen(matname(matidx)))

и это распечатает просто фактическую строку.

Относительно того, необходимо ли использовать другой массив для содержания длин строки, которая ваше дело. strlen () функция является O (n), тогда как поиск длины в таблице является O (1). При нахождении длин этих статических строк часто это может улучшить производительность для вычислений длины однажды, когда они читаются в, хранят их в массиве и ищут их при необходимости в них. Однако, если бы Вы не замечаете замедление, я не волновался бы об этом.

4
ответ дан 7 December 2019 в 01:26
поделиться

Можно использовать эту функцию для получения длины (без пустого хвоста)

integer function strlen(st)
      integer       i
      character     st*(*)
      i = len(st)
      do while (st(i:i) .eq. ' ')
        i = i - 1
      enddo
      strlen = i
      return
      end

Добрался отсюда: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS: Когда Вы говорите: matname (matidx) это получает целую строку (256) символы... так, чтобы была Ваша строка плюс пробелы или мусор

5
ответ дан 7 December 2019 в 01:26
поделиться

В зависимости от компилятора, который Вы используете, Вы можете использовать trim() встроенная функция для удаления любого продвижения/конечных пробелов из строки затем обработайте его, как Вы обычно были бы, т.е.

character(len=25) :: my_string
my_string = 'AIR'
write (*,*) ':', trim(my_string), ':'

должен распечатать :AIR:.

Править: Еще лучше похоже, что существует a len_trim() функция, которая возвращает длину строки после того, как она была обрезана.

1
ответ дан 7 December 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: