Hi,
You don't say what kind of system you're on, but what you're
seeing is typical if your stack limit is set too low. If
you're on a UNIX box, try using the "limit" or "ulimit"
command to raise the stacksize to the maximum allowable
value.
-P.
On Tue, 4 Jan 2000, Yunkai Zhou wrote:
>
> Hi Everybody,
>
> First of all, Happy New Year!
>
> I ran into "Segmentation fault" for big "n" when trying to overload
> operators, the results I got are all correct for "n" not too big.
> After several tests I found my problem can be simplified as the the
> following simple test program:
>
> for example, if n < 700, the program works fine,
> but if n >= 800, I got "Segmentation fault"
>
> the other problem is:
> if I comment out the line: print *, 'max_diff=', maxval(A-S)
> then the program works for bigger n, for example, n=1000 is fine,
> but for even larger n, say n > 1500, there is still
> "Segmentation fault"
>
> my other observation is:
> if I change A, Q, S into allocatable arrays, with dimension
> (n, n), n from user input, then there seems not any problem
> (to save your trouble of typing, I also attached the code using
> allocatable array at the end)
>
> I am a beginner of Fortran90, so I don't know what essentially
> goes wrong with the following program, your assistance will be
> highly appreciated.
>
> --
> Yunkai Zhou
> Computational & Applied Math Dept
> Rice University
>
>
>
> !=================================================================
>
> Program TEST
>
> Implicit None
>
> Call auto_array_test
>
> Contains
>
> Subroutine auto_array_test()
>
> Integer, Parameter :: n =1000
> !! please change n here and recompile
>
> Double Precision, Dimension(n,n) :: A, Q, S
> Integer :: i
>
> print *, 'n =', n
>
> do i =1,n
> call random_number(A(i,:))
> end do
>
> S = A; Q =A
> A = dtest(Q,S)
> S = S + Q
> print *, 'max_diff=', maxval(A-S)
>
> ! S = S + Q - A
> ! print *, 'max_diff=', maxval(S)
>
> End Subroutine auto_array_test
>
>
> Function dtest(A,B)
>
> Double Precision, Intent(IN) :: A(:,:)
> Double Precision, Intent(IN) :: B(:,:)
> Double Precision :: dtest(size(A,1),size(B,2))
>
> dtest = A + B
>
> End Function dtest
>
>
> End Program TEST
>
>
>
> !=================================================================
>
> Program TEST2
>
> Implicit None
> Call auto_array_test
>
> Contains
>
> Subroutine auto_array_test()
>
> Double Precision, Dimension(:,:), Allocatable :: A, Q, S
> Integer :: n, i
>
> print *, 'input n = '
> read *, n
>
> Allocate(A(n,n), Q(n,n), S(n,n))
>
> do i =1,n
> call random_number(A(i,:))
> end do
>
> S = A; Q =A
> A = dtest(Q,S)
> S = S + Q
> print *, 'max_diff=', maxval(A-S)
>
> Deallocate(A,Q,S)
>
> End Subroutine auto_array_test
>
> Function dtest(A,B)
>
> Double Precision, Intent(IN) :: A(:,:)
> Double Precision, Intent(IN) :: B(:,:)
> Double Precision :: dtest(size(A,1),size(B,2))
>
> dtest = A + B
>
> End Function dtest
>
> End Program TEST2
>
--
** Whether the playing field is level depends on the coordinate system. ***
********* Peter S. Shenkin; Schrodinger, Inc.; (201)433-2014 x111 *********
*********** [log in to unmask]; http://www.schrodinger.com ***********
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|