Предупреждающее сообщение (402): массив временно создан для аргумента

Я продолжал получать предупреждающее сообщение:

forrtl: warning (402): fort: (1): In call to I/O Read routine, an array temporary was created for argument #1

когда я запускаю следующие коды. Я перерыл старые сообщения о той же проблеме на форуме (см. здесь), но Я не был совсем уверен, что ответ применим к моей проблеме. Может ли кто-нибудь помочь мне избавиться от этого предупреждающего сообщения? Спасибо.

program main
    implicit none
    integer :: ndim, nrow, ncol
    real, dimension(:,:), allocatable :: mat
    ndim = 13
    ncol = 1
    allocate( mat(ncol,ndim))
    call read_mat( mat, 'matrix.txt' )    
contains
    subroutine read_mat( mat, parafile)
    implicit none
    real, dimension(:,:), intent(out) :: mat
    character(len=*), intent(in) :: parafile
    character(len=500) :: par
    character(len=80) :: fname1
    integer :: n, m, pcnt, iostat
    m = size(mat,dim=2)
    n = size(mat,dim=1)
    mat = 0.
    open( unit= 10, file=parafile, status='old', action='read', iostat=iostat )
    if( iostat==0 )then
        pcnt = 1
        write(fname1,'(a,i3,a)'),'(',m,'(f10.5))' 
        do 
            read( unit=10, fmt=*, iostat=iostat ) mat(pcnt,:)
            pcnt = pcnt + 1
            if( pcnt > n ) exit 
        enddo
    else
        print*, 'The file does not exist.'
    endif
    close( 10 )
    end subroutine read_mat 
end

person Li-Pin Juan    schedule 03.01.2015    source источник
comment
другое, возможно предпочтительное, исправление - изменить порядок массива на противоположный. Это, очевидно, зависит от того, насколько обширен код и как вы используете его в другом месте.   -  person agentp    schedule 03.01.2015


Ответы (1)


Это та же основная причина, что и в связанном вопросе. Ссылка mat(pcnt,:) относится к хранилищу элементов массива, которое не является непрерывным в памяти, поэтому, чтобы удовлетворить внутренние требования компилятора к коду среды выполнения, который фактически выполняет чтение, он выделяет некоторое непрерывное хранилище, читает в него, а затем копирует элементы. этого временного хранилища в окончательный массив.

Обычно в контексте относительно медленного оператора ввода-вывода накладные расходы, связанные с временным оператором, незначительны.

Самый простой способ предотвратить появление предупреждения — отключить соответствующую диагностику времени выполнения с помощью -check:noarg_temp_created или аналогичного. Но это своего рода кувалда — могут быть созданы временные аргументы, о которых вы действительно хотите знать.

Альтернативным обходным решением является явное указание элементов для чтения с помощью io-implied-do. Что-то типа:

read (unit=10, fmt=*, iostat=iostat) (mat(pcnt,i),i=1,m)

с соответствующим объявлением i.

person IanH    schedule 03.01.2015
comment
Интеловские проверки слишком многословны, я рекомендую отключить их, я не вижу смысла предупреждать для каждого отдельного конструктора массива в списке аргументов. - person Vladimir F; 04.01.2015
comment
где разместить параметр check:noarg_temp_created в Visual Studio? - person user32882; 06.08.2017