2016-11-15 2 views
0

Я хочу читать числа из текстового файла. Это могут быть скаляры или массивы.Перегрузка скалярами и массивами

Так как я называю

real, dimension(2) :: test 
call self%ReadRealToVariable('(2F10.0)',test) 

или

real :: test 
call self%ReadRealToVariable('(F10.0)',test) 

Функция импорта выглядит

subroutine ReadRealToVariable(self,Format,VarOut) 
    implicit none 

    ! Declaring Part 
    class(FileImporter) :: self 
    real, dimension(:), intent(out) :: VarOut 
    character(len=*), intent(in) :: Format 
    real, dimension(size(VarOut)) :: Value 

    ! Executing Part 
    call self%ReadValueToVariable(Format,Value) 

end subroutine ReadRealToVariable 

Проблема теперь что когда я пытаюсь импортировать скаляр, я получаю несоответствие размеров между скаляром и рангами (1). Я полностью понимаю, почему эта проблема возникает. Теперь вопрос в том, как с этим справиться:

  1. Есть ли способ гибко распределить переменную как для скаляра, так и для массива?

  2. Или я должен просто инициализировать все скаляры как real, dimension(1) :: test?

+0

Большое спасибо! – THo

+0

Только на стороне комментирования: когда я увидел перегрузку, я ожидал увидеть перегрузку функций, где вы пишете две версии своей функции: одну для скаляра и одну для массива, а также общее имя интерфейса или общую связанную процедуру для обоих , который должен работать отлично. – innoSPG

+0

Я сделал это так. Мое намерение состояло в том, чтобы в модуле не было большого фрагмента кода два раза, но я думаю, что это путь. – THo

ответ

2

В интересах наличия ответа на вопрос, что люди могут увидеть ...

1) Нет, ни одного дня не будет в состоянии выделить скаляр, если прошло скаляр, и массив, если передан массив. Можно объединить различные подпрограммы за общим интерфейсом и сделать , как если бы одна процедура вела себя так, как хочет OP. Это может быть достаточно хорошим. OP, похоже, понял это, и, возможно, есть несколько других вопросов здесь о SO об общих интерфейсах, поэтому я больше не буду писать здесь по этой теме.

2) Конечно, можно рассматривать скаляры как массивы ранга 1 размера 1 для целей написания подпрограммы для чтения значений из файла. Будь то хотелось бы распространять это на всей кодовой базе, я не уверен. С другой стороны, я вижу ситуации, когда наличие массива ранга 1 размера 1 полезно в том смысле, что массивы размера 0 полезны, например, для обработки случаев краев без сложных условностей.

Смежные вопросы