我在VS社区2019解决方案中使用GTK fortran中的带文本的组合框。我正试图用";gtk_commo_box_text_get_active_text"和c_f_pointer将gchar转换回fortran字符。如果选择了某个内容而不是null,它将正常工作。当它为空时,我将收到如下崩溃:崩溃
我想这是因为指针指向null,无法访问,但最好我也能检测到没有选择任何内容。
因此,我想问一下,是否有一种更好、更简单的方法可以将gchar转换为fortran字符,或者有一种方法可以在不崩溃的情况下检测它为null。谢谢大家!
这些是我正在处理的代码:
botMain_systemChoosing = gtk_combo_box_text_new()
call gtk_container_add(bottomPanel_Main,botMain_systemChoosing)
call gtk_combo_box_text_append(botMain_systemChoosing,"1","system 1")
call gtk_combo_box_text_append(botMain_systemChoosing,"2","system 2")
call gtk_widget_show(botMain_systemChoosing)
type(c_ptr) :: currentSys
character(len=8),pointer :: string
currentSys = gtk_combo_box_text_get_active_text(botMain_systemChoosing)
call c_f_pointer(currentSys,string)
if (string == "system 1") then
print*, "1"
else
print*, "default"
end if
EDIT解决方案#1:
use, intrinsic :: iso_c_binding, only: c_ptr,c_associated
type(c_ptr) :: currentSys
character(len=8),pointer :: string
// returns a gchar
currentSys = gtk_combo_box_text_get_active_text(botMain_systemChoosing)
call c_f_pointer(currentSys,string)
if (.not. c_associated(currentSys)) then
print*, "null"
elseif (string == "system 1") then
print*, "1"
else
print*, "default"
end if
我没有gtk-fortran的经验,但我想你应该检查一下指针是否是associated
:
if (.not.associated(string)) then
print*, “null”
elseif (string == "system 1") then
print*, "1"
else
print*, "default"
end if
参见此示例:
program test_ptr
use iso_c_binding
implicit none
type(c_ptr) :: c = c_null_ptr
character(kind=c_char,len=1), pointer :: s(:)
call c_f_pointer(c,s,[10])
print *, 'fortran associated = ',associated(s),' c associated=',c_associated(c)
end program
它打印
fortran associated = F c associated= F