Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Тонкости работы с массивами


Автор: Ибрагим 27.5.2006, 12:16
COMPLEX X(2,2),   Z(2,2)


SUBROUTINE ASSIGN (M,N,A,B)
COMPLEX A(M,N),  B(M,N)
DO 10 J=1,N
DO 10 I=1,M
10      B(I,J)=A(I,J)
RETURN
END

вызывается вот так:

CALL ASSIGN(2,2,Z,X) -это понятно, матрица Z копируется в X.

но есть и такой вызов

DO 10 K=1,N
10 CALL ASSIGN(2, 1, Z(1,K), X(1,K)  )

как понять, ведь нужно двумерные массивы передать, а Z(1,K), X(1,K) - это числа.
если уж на то пошло, то тогда зачем через параметр M передается двойка ???

и так постоянно: допустим, в формальных параметрах подпрограммы умножения двух матриц указаны: матрица раз, матрица два, кол. строк, кол. столбцов,
а в главной программе передается что левая пятка скажет, то число, то матрица, то вообще трехмерный - это-то как, там вообще же только два цикла по J и по I.







 smile  

Автор: Cr@$h 29.5.2006, 15:00
Цитата(Ибрагим @  27.5.2006,  13:16 Найти цитируемый пост)
но есть и такой вызов

DO 10 K=1,N
10 CALL ASSIGN(2, 1, Z(1,K), X(1,K)  )

как понять, ведь нужно двумерные массивы передать, а Z(1,K), X(1,K) - это числа.
если уж на то пошло, то тогда зачем через параметр M передается двойка ???

Похоже, что, передавая Z(1, K) и указывая M = 2, мы разрешаем подпрограмме ходить по массиву Z(1:2, K), т.е. заходить и на вторую строчку массива. Может, тогда ещё нельзя было передавать сечения массива, типа Z(1:2, K)... и здесь передается указатель на первый элемент нужного массива, а дальнейшие ограничения задаются в подпрограмме через M и N. Хотя, меня смущает вообще такая форма вызова -- при указанных размерах можно было просто передавать Z и X целиком. Приведённый вызов эквивалентен CALL ASSIGN(2, 2, Z, X  ), или даже CALL ASSIGN(2, 2, Z(1, 1), X(1, 1)  ). Исходный код зачем-то копирует массивы по столбцам? Возможно это необдуманная или принудительная оптимизация по столбцам...
Проверял всё на следующей проге:
Код

program Ibragim
    complex X(2,2), Z(2,2)
    
    Z = (3, 0)
    N = 2
    
    do k = 1, N
        call Assign( 2, 1, Z(1, K), X(1, K)  )
    end do

    print *, X
    read *

contains
    Subroutine Assign( M, N, A, B )
        complex A(M, N), B(M, N)

        B(1:M, 1:N) = A(1:M, 1:N)
    end subroutine Assign
end program Ibragim

Цитата(Ибрагим @  27.5.2006,  13:16 Найти цитируемый пост)
и так постоянно: допустим, в формальных параметрах подпрограммы умножения двух матриц указаны: матрица раз, матрица два, кол. строк, кол. столбцов,
а в главной программе передается что левая пятка скажет, то число, то матрица, то вообще трехмерный - это-то как, там вообще же только два цикла по J и по I.

На это лучше посмотреть в контексте.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)