LINUX.ORG.RU

[fortran] непонятная ошибка

 


0

0

Доброго дня уважаемые

возникла слудующая проблема при компиляции программы выскакивает такая ошибка

gfortran-4.2                  -c  input_block_1.f90
input_block_1.f90:63.25:

 CALL ijk_to_i_j_k(i_j_k,i_j_k_fid,grid_size)
                        1
Error: Type/rank mismatch in argument 'j' at (1)
make: *** [input_block_1.o] Ошибка 1

не могу понять вчем тут дело ведь здесь даже нет такой пременной как j

P.S. все аргументы уже по пробовал перенабрать не помогло

Ответ на: комментарий от true_admin

дело в том что в других файлах с такими именами переменных все работает

и даже в этом файле раньеше всеречаются эти переменные и все рабртает

SherKhan
() автор топика
Ответ на: комментарий от true_admin

вот кусок кода на который ругается

 USE module_ijk_to_i_j_k          ,ONLY:ijk_to_i_j_k
 USE module_common_grid_conversion,ONLY:grid_size
 USE module_common_masks          ,ONLY:domain_dimension
 
 IMPLICIT NONE

 INTEGER,INTENT(in)                :: i_j_k,size
 INTEGER,INTENT(out)               :: i,j,k
 INTEGER,DIMENSION(:),POINTER,SAVE :: i_j_k_fid             ! LOCAL
 LOGICAL,SAVE                      :: first_entry = .TRUE.

!---------------------------------------

 IF (domain_dimension==1) STOP "Error i_j_k_to_ijk: Not implemented yet for 1D."

 IF (first_entry) ALLOCATE(i_j_k_fid(domain_dimension))
 IF (first_entry) first_entry = .FALSE.

 CALL ijk_to_i_j_k(i_j_k,i_j_k_fid,grid_size) ! вот тасамая строчка

а вот подпрограмма на которую ругается (она находится в другом файле который компилитися нормально)

 SUBROUTINE ijk_to_i_j_k(l,i_j_k,grid_size)                                    !
   IMPLICIT NONE                                                               !
   INTEGER :: i,j,k,lp,l                                                       !
   INTEGER, DIMENSION(:), POINTER :: grid_size                                 !
   INTEGER, DIMENSION(:), POINTER :: i_j_k                                     !
   IF (SIZE(grid_size) == 3) THEN                                              !
    k = (l-1)/PRODUCT(grid_size(1:2)) + 1                                      !
    lp= l - (k-1)*PRODUCT(grid_size(1:2))                                      !
    j = (lp-1)/grid_size(1) + 1                                                !
    i = lp - (j-1)*grid_size(1)                                                !
    i_j_k(1) = i                                                               !
    i_j_k(2) = j                                                               !
    i_j_k(3) = k                                                               !
   ELSE IF (SIZE(grid_size) == 2) THEN                                         !
    j = (l-1)/grid_size(1) + 1                                                 !
    i = l - (j-1)*grid_size(1)                                                 !
    i_j_k(1) = i                                                               !
    i_j_k(2) = j                                                               !
   ELSE IF (SIZE(grid_size) == 1) THEN                                         !
    i = l                                                                      !
    i_j_k(1) = i                                                               !
   END IF                                                                      !
 END SUBROUTINE ijk_to_i_j_k   

ps рограмма не моя взята от сюада http://www.nextnano.de/

SherKhan
() автор топика
Ответ на: комментарий от true_admin

> А в фукнции ijk_to_i_j_k нет аргумента j? Думаю, дело в этом. Типы не совпадают.

Ничего не понимаю в фортране, но разве j — это не целое по-умолчанию?

k_andy ★★★
()
Ответ на: комментарий от SherKhan

Либо уточните ссылку, либо покажите, что в модуле module_ijk_to_i_j_k написано относительно ijk_to_i_j_k.

mky ★★★★★
()
Ответ на: комментарий от mky

Либо уточните ссылку, либо покажите, что в модуле module_ijk_to_i_j_k написано относительно ijk_to_i_j_k.

там нужна регистрация вот то что я скачал http://omploader.org/vMnRydA

если не сложно попробуйте тоже скомпилировать

SherKhan
() автор топика
Ответ на: комментарий от SherKhan

У меня gfortran-4.1.2 (CentOS). Вываливает такую же ошибку.

Проблема в том, что в коде есть две подпрограммы с именем ijk_to_i_j_k(). Одна с тремя аргументами, описана в файле i_j_k_to_ijk_geo.f90, а другая с 5 аргументами описана в том файле, который не компилируется (input_block_1.f90).

Вроде в Frotran90 можно было делать подпрограммы с одинаковым именем, но разным числом аргументов, и компилятор сам разбирается какую вызвать, но я такое не употреблял, поэтому не могу пока точно сказать, что это --- бага gfortran или неправильный код.

mky ★★★★★
()
Ответ на: комментарий от mky

Пока не могу разобраться, пора спать.

Если вам нужно скомпилировать, пока могу предложить только вручную переименовать функции, а именно внести следующие изменения (файл:строка содержимое):

input_block_1.f90:45 USE module_ijk_to_i_j_k          ,ONLY:ijk_to_i_j_k, ijk_to_i_j_k_sf=>ijk_to_i_j_k
input_block_1.f90:63 CALL ijk_to_i_j_k_sf(i_j_k,i_j_k_fid,grid_size)
discretize_sg_box_int.f90:185 USE mod_extract_sg_parameters,ONLY:get_sg_material_parameters, get_sg_material_parameters_lf=>get_sg_material_parameters
discretize_sg_box_int.f90:276 CALL get_sg_material_parameters_lf(num_qr,num_sg,num_deg,chargeC,i_phys,j_phys,k_phys, &

В USE операторе мы локально переопределяем имя функции, а в CALL используем локальное переопределённое имя. То есть _sf, _lf это от балды, а вот «=>» это синтаксис языка.

Ну, в Makefile добавить строку «%.o : %.mod», хотя это вы наверное нашли в гугле.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.