2012-09-28 3 views
1

포맷되지 않은 빅 엔디안 바이너리 파일에서 다양한 종류의 데이터를 읽는 대신 모노럴 코드를 사용합니다. 일반적으로 코드는 환경 변수 GFORTRAN_CONVERT_UNIT = 'native; big_endian : 60-70,80-89'를 설정하고 그 단위 숫자 중 하나를 사용하여 빅 엔디안 데이터 파일을 여는 bash 스크립트에서 실행됩니다. 이것은 Fedora와 RHEL에서 잘 작동합니다. 그러나, 나는, 오픈 수세, 그리고 아치 리눅스 (우분투 리눅스 민트 포함 및 파생 상품) 데비안에 프로그램을 실행 한 때 얻을 포트란 코드가 어떤 실행하지 못했습니다 전에 다음의 malloc 오류 :GFORTRAN_CONVERT_UNIT 환경 변수가 일부 플랫폼에서 작동하지 않습니까?

malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted 

추가하는 방법에 대해

쓰기 프로그램 :

[email protected]:~/temp> cat test_write.f90 
program test_write 
implicit none 

integer, parameter :: NUM = 10 
integer :: i 

open (unit=88,form='unformatted',convert='big_endian') 
do i = 1,NUM 
    write (88) i 
end do 

close (88) 

end program test_write 

읽기 프로그램 :

,536 문제를 보여 저는 두 포트란 프로그램, 하나는 간단한 빅 엔디안 데이터 파일을 작성하고, 하나 읽어 썼다
[email protected]:~/temp> cat test_read.f90 
program test_read 
implicit none 

integer, parameter :: NUM = 10 
integer :: readInt 
integer :: i 

open (unit=88,form='unformatted') 
do i = 1,NUM 
    read (88) readInt 
    write (*,*) readInt 
end do 

close (88) 

end program test_read 

프로그램을 실행 (이 GCC 4.7.1 사용하여 32 비트 오픈 수세 12.2에, 또한 우분투 32 비트와 함께 실패) : 그것은하려고 있기 때문에

[email protected]:~/temp> ./test_write 
[email protected]:~/temp> ./test_read 
    16777216 
At line 10 of file test_read.f90 (unit = 88, file = 'fort.88') 
Fortran runtime error: End of file 
[email protected]:~/temp> GFORTRAN_CONVERT_UNIT='native;big_endian:88' ./test_read 
test_read: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted 
[email protected]:~/temp> 

물론, 첫 번째 시도가 실패 리틀 엔디안 읽기로 빅 엔디안 파일을 읽지 만 두 번째 시도가 작동해야합니다. 사실 많은 시스템에서 작동합니다. 체리를 선택하는 대신 GFORTRAN_CONVERT_UNIT = 'big_endian'을 설정하면 모든 시스템에서 작동합니다.

모 놀리 식 코드가 64 비트 서버에 있고 환경 변수가 관계없이 작동해야하므로 32 비트 대 64 비트 문제라고 생각하지 않습니다 ... 32 비트에서 실행 중입니다. 그게 내 노트북에있는 것이기 때문에.

아이디어가 있으십니까?

+0

나를 위해 gfortran 4.4.3 우분투 10.04 x86_64뿐만 아니라 gfortran 4.6.4 우분투 12.04 x86_64에서 작동합니다. – janneb

+0

문제는 libgfortran이 단위 예외 목록을 보유하기 위해 메모리를 할당하는 방식에있는 것처럼 보입니다. 할당되지 않은 메모리에 액세스하지 못하도록 libgfortran/runtime/environ.c 파일을 변경했으며 malloc 오류가 사라졌습니다. GFortran 개발자도 내 문제를 재현 할 수 있었고이를 조사 할 것입니다. –

+0

왜 downvoted입니까? –

답변

관련 문제