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
相关产品推荐
相关产品推荐

