Я получаю это необработанное исключение, когда выхожу из своей программы:
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 байта С++
Затем программа остается в памяти, пока я не закрою 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-указатели, когда закончу с ними? Я изучил это, но не вижу, как я это делаю на Фортране...
Спасибо за любую помощь!
integer(4)
иreal(8)
могут быть или не быть 4- и 8-байтовыми числами. Это типы 4 и 8, которые зависят от процессора (компилятора). См. stackoverflow.com/questions/ 3170239/ и stackoverflow.com/questions/10520819/what-does-real8-mean а> - person M. S. B.   schedule 28.03.2013iso_fortran_env
, у вас есть доступ к надежному и переносимому способу запроса чисел определенного размера. Для 4-байтовых целых чисел:integer (int32)
; для 8-байтовых вещественных чисел:real (real64)
. По крайней мере, если ваш компилятор имеет версию Fortran 2008 среды ISO Fortran Environment. - person M. S. B.   schedule 29.03.2013