Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Тонкости работы с массивами, Передача массивов как параметров 
V
    Опции темы
Ибрагим
Дата 27.5.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



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  
PM MAIL   Вверх
Cr@$h
Дата 29.5.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Ибрагим @  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.

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

Это сообщение отредактировал(а) Cr@$h - 29.5.2006, 15:04
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.1033 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.