2013-11-12 1 views
1

Я хотел бы иметь своего рода diffptr_t в fortran с iso_c_bindings. Результат измерения памяти должен быть подписанным int.diffptr_t fortran с iso_c_bindings

type(c_ptr) :: start,ref 
type(c_int) :: res 
start=c_loc(my_struct%a) 
ref=c_loc(my_struct%b%c) 
res=start-ref 

Ошибка компиляции:

This binary operation is invalid for this data type. 
An arithmetic or LOGICAL type is required in this context. 

Благодаря

ответ

1

Вы не можете сделать арифметику указателей в стандартном Fortran. Вы должны полагаться на двоичную корреспонденцию, зависящую от процессора, между указателями и целыми числами.

Кроме того, в Fortran нет целых без знака.

type(c_ptr) :: start,ref 
integer(c_int) :: res 

start = c_loc(my_struct%a) 
ref = c_loc(my_struct%b%c) 

res = int(transfer(start, 1_c_intptr_t) - transfer(ref, 1_c_intptr_t) , c_int) 

Там могут быть проблемы, если значения указателя крупнее, чем максимальное положительное значение для подписанного c_intptr_t.

+0

ОК спасибо, я не знал «передачи», – user2885778