2015-05-06 64 views
3

我想这是我错过的一些愚蠢的东西,但我已经问过我的整个班级,没有人能够解决这个问题。在一个子程序中调用一个简单的程序,并且在矩阵的条目中执行循环读操作时遇到问题。简单阅读功能错误

program Householder_Program 

use QR_Factorisation 
use numeric_kinds 

complex(dp), dimension(:,:), allocatable :: A, Q, R, V 
integer :: i, j, n, m 

print *, 'Enter how many rows in the matrix A' 
read *, m 

print *, 'Enter how many columns in the matrix A' 
read *, n 

allocate(A(m,n), Q(m,n), R(n,n), V(n,n)) 

do i = 1,m 

    do j = 1,n 

     Print *, 'Enter row', i, 'and column', j, 'of matrix A' 
     read *, A(i,j) 

    end do 

end do 

call Householder_Triangularization(A,V,R,n,m) 

print *, R 

end program 

它会问我要A(1,1),但是当我在一个号码类型也不会问我要A(1,2),就会留下一个空行。当我试图把在第2个数字,就会报错,说:

Enter row   1 and column   1 of matrix A 
1 
2 
At line 22 of file HouseholderProgram.f90 (unit = 5, file = 'stdin') 
Fortran runtime error: Bad repeat count in item 1 of list input 

回答

4

你的变量A的类型是复杂的(数组)。这意味着,当您尝试执行元素值的列表控件输入时,您不能只指定一个数字。所以,在你的情况下,问题不在于程序,而在于输入。

从Fortran的2008标准,10.10.3

当下一个有效项的类型复杂的,输入形式由一个左括号后跟一个有序对由逗号分隔的数字输入字段中的(如果十进制编辑模式是POINT)或分号(如果十进制编辑模式是COMMA),然后是右括号。

然后,输入必须是类似于(1., 12.)的东西。

+0

非常感谢 – malonej

3

您正在阅读复杂数字(A是复杂的)!因此,您应该为代码指定复数...因为您只提供一个整数,程序不知道该怎么做。

提供(1,0)(2,0)而不是12将做的伎俩。

2

如果用户输入总是真实的,你想把它读成一个复杂类型的数组,你可以做这样的事情:

Print *, 'Enter row', i, 'and column', j, 'of matrix A' 
    read *, dummy 
    A(i,j)=dummy 

其中dummy声明real。这将使用户不​​必键入复数所需的括号。 (转换为复杂的是自动的)