You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GTK Fortran中获取Entry控件实数数值的问题及解决方法

问题:GTK Fortran Entry控件获取实数仅得到首字符,设置长度后崩溃

我有一个实数数组,在GTK Fortran的Entry控件中展示数值显示正常,但从Entry缓冲区获取数值时仅能得到该实数的第一个字符。尝试设置字符长度后程序崩溃。

原相关代码

Entry控件初始化代码

write(test,"(f0.4)") param_initValue(i)
scrollWid_initEntry(i) = gtk_entry_new_with_buffer(gtk_entry_buffer_new(test,-1))
call gtk_container_add(scrollWid_container(i), scrollWid_initEntry(i))
call g_signal_connect(scrollWid_initEntry(i), 'activate' // c_null_char, c_funloc(onChangeInit),c_loc(param_labelName(I)))

激活时的回调函数

subroutine onChangeInit(widget,datas)
    use GUI_botParam_paramValueData
    use, intrinsic :: iso_c_binding, only: c_ptr, c_int,c_f_pointer,c_char
    use gtk_sup, only: c_f_string_copy
    use :: gtk, only:  gtk_entry_get_buffer,gtk_entry_buffer_get_text,gtk_entry_buffer_get_length 
    implicit none
    type(c_ptr) :: widget,charac_newEntry
    character(len=20):: datas
    character(len=:),allocatable :: newEntry
    integer :: index,n,number
    do n=1,numberOfParam
        if (param_labelName(n) == datas) index = n
    end do
    charac_newEntry = gtk_entry_get_buffer(scrollWid_initEntry(index))
    call c_f_string_copy(gtk_entry_buffer_get_text(charac_newEntry),newEntry)
    
end 

解决方法(编辑#1)

改写后的回调函数

subroutine onChangeInit(widget,datas)
    use, intrinsic :: iso_c_binding, only: c_ptr, c_int,c_f_pointer,c_char
    use gtk_sup, only: c_f_string_copy
    use :: gtk, only:  gtk_entry_get_buffer,gtk_entry_buffer_get_text,gtk_entry_buffer_get_length,gtk_entry_get_text 
    implicit none
    type(c_ptr),value :: widget
    type(c_ptr) :: charac_newEntry
    character(len=20):: datas
    character(len=20):: newEntry
    integer :: index,n,number
    do n=1,numberOfBaseParam
        if (baseParam_labelName(n) == datas) index = n
    end do
    print*, index
    ! charac_newEntry = gtk_entry_get_buffer(base_scrollWid_initEntry(index))
    call c_f_string_copy(gtk_entry_get_text(base_scrollWid_initEntry(index)),newEntry)
    print*, trim(newEntry)
    
end subroutine onChangeInit

核心解决要点

  • 放弃通过缓冲区获取文本的方式,直接使用gtk_entry_get_text函数获取Entry控件的文本内容
  • 将接收转换后文本的Fortran字符变量设置为固定长度len=20,避免使用可分配字符时可能出现的内存问题

内容的提问来源于stack exchange,提问作者DongAlpha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:15:45