プログラムを終了すると、この未処理の例外が発生します。
Unhandled exception at 0x102fe274 (msvcr100d.dll) in Parameters.exe: 0xC0000005: Access violation reading location 0x00000005.
デバッガーは、次の行の crtdll.c というモジュールで停止します。
onexitbegin_new = (_PVFV *) DecodePointer(__onexitbegin);
コール スタックの一番上の行は次のとおりです。
msvcr100d.dll!__clean_type_info_names_internal(__type_info_node * p_type_info_root_node=0x04a6506c) 行 359 + 0x3 バイト C++
その後、プログラムは IDE を閉じるまでメモリに残ります。
私はマネージ言語での開発に慣れているので、コードのメンテナンスに何か問題があると思います。コード自体は、メモリ マップされたファイルを読み取り、それをポインターに関連付けます。
SUBROUTINE READ_MMF ()
USE IFWIN
USE, INTRINSIC :: iso_c_binding
USE, INTRINSIC :: iso_fortran_env
INTEGER(HANDLE) file_mapping_handle
INTEGER(LPVOID) memory_location
TYPE(C_PTR) memory_location_cptr
INTEGER memory_size
INTEGER (HANDLE) file_map
CHARACTER(5) :: map_name
TYPE(C_PTR) :: cdata
integer :: n = 3
integer(4), POINTER :: A, C
real(8), POINTER :: B
TYPE STRUCT
integer(4) :: A
real(8) :: B
integer(4) :: C
END TYPE STRUCT
TYPE(STRUCT), pointer :: STRUCT_PTR
memory_size = 100000
map_name = 'myMMF'
file_map = CreateFileMapping(INVALID_HANDLE_VALUE,
+ NULL,
+ PAGE_READWRITE,
+ 0,
+ memory_size,
+ map_name // C_NULL_CHAR )
memory_location = MapViewOfFile(file_map,
+IOR(FILE_MAP_WRITE, FILE_MAP_READ),
+ 0, 0, 0 )
cdata = TRANSFER(memory_location, memory_location_cptr)
call c_f_pointer(cdata, STRUCT_PTR, [n])
A => STRUCT_PTR%A
B => STRUCT_PTR%B
C => STRUCT_PTR%C
RETURN
END
c-pointer の使用が終わったら、その c-pointer の割り当てを解除する必要がありますか? 私はそれを調べましたが、Fortranでそれを行う方法がわかりません...
助けてくれてありがとう!