Я написал код Fortran с использованием MPI, так как я новичок в valgrind. Мне не удалось найти проблему. Я получаю эту ошибку при выполнении проверки:FORTRAN-Неверная запись о размере 4
==3040== Invalid write of size 4
==3040== at 0x804BFE0: MAIN__ (NS.f90:174)
==3040== by 0x804E190: main (NS.f90:321)
==3040== Address 0x5746f20 is 0 bytes after a block of size 8 alloc'd
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3040== by 0x804C5F3: MAIN__ (NS.f90:198)
==3040== by 0x804E190: main (NS.f90:321)
==3040==
==3041== Invalid write of size 4
==3041== at 0x804BFE0: MAIN__ (NS.f90:174)
==3040== Invalid write of size 4
==3040== at 0x804C036: MAIN__ (NS.f90:175)
==3040== by 0x804E190: main (NS.f90:321)
==3041== by 0x804E190: main (NS.f90:321)
==3041== Address 0x5748bbc is 0 bytes after a block of size 12 alloc'd
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3040== Address 0x5746f58 is 0 bytes after a block of size 8 alloc'd
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3040== by 0x804C729: MAIN__ (NS.f90:198)
==3040== by 0x804E190: main (NS.f90:321)
==3040==
==3041== by 0x804C5F3: MAIN__ (NS.f90:198)
==3041== by 0x804E190: main (NS.f90:321)
==3041==
==3040== Invalid write of size 4
==3040== at 0x804C087: MAIN__ (NS.f90:176)
==3040== by 0x804E190: main (NS.f90:321)
==3040== Address 0x5746f90 is 0 bytes after a block of size 8 alloc'd
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3040== by 0x804C862: MAIN__ (NS.f90:198)
==3040== by 0x804E190: main (NS.f90:321)
==3040==
==3041== Invalid write of size 4
==3041== at 0x804C036: MAIN__ (NS.f90:175)
==3041== by 0x804E190: main (NS.f90:321)
==3041== Address 0x5748bfc is 0 bytes after a block of size 12 alloc'd
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3041== by 0x804C729: MAIN__ (NS.f90:198)
==3041== by 0x804E190: main (NS.f90:321)
==3041==
==3040== Invalid write of size 4
==3040== at 0x804C1C5: MAIN__ (NS.f90:178)
==3040== by 0x804E190: main (NS.f90:321)
==3040== Address 0x5746fc8 is 0 bytes after a block of size 8 alloc'd
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3040== by 0x804C99B: MAIN__ (NS.f90:198)
==3040== by 0x804E190: main (NS.f90:321)
==3040==
==3041== Invalid write of size 4
==3041== at 0x804C087: MAIN__ (NS.f90:176)
==3041== by 0x804E190: main (NS.f90:321)
==3041== Address 0x5748c3c is 0 bytes after a block of size 12 alloc'd
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3041== by 0x804C862: MAIN__ (NS.f90:198)
==3041== by 0x804E190: main (NS.f90:321)
==3041==
==3040==
==3041== Invalid write of size 4
==3041== at 0x804C1C5: MAIN__ (NS.f90:178)
==3041== by 0x804E190: main (NS.f90:321)
==3041== Address 0x5748c7c is 0 bytes after a block of size 12 alloc'd
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
Line 174 до 178 содержит этот кусок кода:
A(I) = -0.5 * (0.5 * (1.0 + EPX) * CX(I-1, J) + DX)
B(I) = (1 + DX + 0.5 * EPX * CX(I, J))
C(I) = 0.5 * (0.5 * (1 - EPX) * CX(I+1, J) - DX)
R(I) = 0.5 * (0.5 * (1 + EPY) * CY(I, J-1) + DY) * OMEGA(I, J-1) + (1 - DY - 0.5 * EPY * CY(I, J)) * OMEGA(I, J) + 0.5 * (-0.5 * (1 - EPY) * CY(I, J+1) + DY) * OMEGA(I, J+1)
Может кто-нибудь сказать мне, что здесь не так? Я также получаю другие ошибки, как:
==3041== Invalid read of size 4
==3041== at 0x804C271: MAIN__ (NS.f90:183)
==3041== by 0x804E190: main (NS.f90:321)
==3041== Address 0x5748c40 is 4 bytes after a block of size 12 alloc'd
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
где линии 183 со ссылкой на:
R(N) = R(N) - C(N) * OMEGA(N+1, J)
Я был бы признателен, если кто-то может сказать мне, где проблема.
Вот блок кода:
A = 0.0
B = 0.0
C = 0.0
R = 0.0
X = 0.0
DO J = 1, M
DO I = 1, N
IF (U(I, J) > 0.0) THEN
EPX = 1.0
ELSE
EPX = -1.0
ENDIF
IF (V(I, J) > 0.0) THEN
EPY = 1.0
ELSE
EPY = -1.0
ENDIF
A(I) = -0.5 * (0.5 * (1.0 + EPX) * CX(I-1, J) + DX)
B(I) = (1 + DX + 0.5 * EPX * CX(I, J))
C(I) = 0.5 * (0.5 * (1 - EPX) * CX(I+1, J) - DX)
R(I) = 0.5 * (0.5 * (1 + EPY) * CY(I, J-1) + DY) * OMEGA(I, J-1) + (1 - DY - 0.5 * EPY * CY(I, J)) * OMEGA(I, J) + 0.5 * (-0.5 * (1 - EPY) * CY(I, J+1) + DY) * OMEGA(I, J+1)
ENDDO
R(1) = R(1) - A(1) * OMEGA(0, J)
R(N) = R(N) - C(N) * OMEGA(N+1, J)
ENDDO
Как объявляются/выделены A, B, C, R? – cup