如何将gchar转换为fortran字符



我在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

最新更新