c - 在 C 中传递结构时出现 GTK_Pointer 问题
问题描述
我在传递超出它们初始化的原始函数的结构(指针)时遇到问题。
我注意到:从最初初始化结构的函数中得到的越远(当我将结构从一个函数作为指针传递到下一个函数时),我基本上开始丢失数据(或对数据的引用)。当我尝试打印结构中的一个整数时,它会给我正确的值,然后交替进入垃圾(可能是内存位置??),然后再次打印出该值并再次随机垃圾。
程序:在下面的程序中,我试图创建一组 5 个标签,当我按下向上或向下按钮时,我可以在其中更改文本。标签附加到事件框上,目前,这些事件框将标签的文本打印到终端上。尝试检索文本时出现分段错误。
结果是当我尝试使用结构中的数据时出现段错误(更改结构中标签的文本等)
struct Alpha{
GtkWidget *alphalbl[5]; //array of label widgets
gchar *alpha[38]; //array of characters
gint start; //start position
gint pos; //current position
};
void createWindow(GtkWidget *widget, gpointer data){
struct Alpha alpha; //Initialization of structure
/* Create window, layout, notebook, menu, etc*/
createList(&alpha, &layer) //layer is a struct of fixed layouts
}
该结构在以下功能中起作用:
void createList(gpointer structalpha, gpointer structlayers){
GtkWidget *alphaup, *alphadn;
GtkWidget *alphabox[5];
struct Layers *layer = structlayers;
struct Alpha *alphalist = (struct Alpha *)structalpha;
gchar *alphal[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9","<","[]"};
layer->fixedl = gtk_fixed_new();
for (int a = 0; a < 38; a++) //Add chararray to struct
alphalist->alpha[a] = g_strdup(alphal[a]);
alphalist->start = 0;
for(int i = 0; i < 5; i++){
alphalist->alphalbl[i] = gtk_label_new(alphalist->alpha[i]);
alphabox[i] = gtk_event_box_new();
gtk_widget_set_size_request(alphabox[i], 20, 20);
gtk_widget_set_name(GTK_WIDGET(alphabox[i]), g_strdup_printf("%d",i));
gtk_container_add(GTK_CONTAINER(alphabox[i]), alphalist->alphalbl[i]);
gtk_widget_set_events(alphabox[i], GDK_BUTTON_PRESS_MASK);
//g_signal_connect(alphabox[i], "button_press_event", G_CALLBACK(setLetter), (alphalist->alphalbl[i])); //originally tried sending just the single label
g_signal_connect(alphabox[i], "button_press_event", G_CALLBACK(setLetter), &alphalist); //<--struct does not send correctly
}
alphaup = gtk_button_new_with_label("^");
gtk_widget_set_size_request(alphaup, 50, 20);
g_signal_connect(alphaup, "clicked", G_CALLBACK(alphaUp), alphalist); //<--struct does not send correctly
alphadn = gtk_button_new_with_label("v");
gtk_widget_set_size_request(alphadn, 50, 20);
g_signal_connect(alphadn, "clicked", G_CALLBACK(alphaDown), alphalist); //<--struct does not send correctly
for(int y = 0; y < 5; y++)
gtk_fixed_put(GTK_FIXED(layer->fixedl), alphabox[y], 5, (50 + (y*15)));
}
该结构不再适用于(在 setLetter 中)。“->”仍然可以找到变量,但是当我运行代码时会出现分段错误,除非我注释掉 gtk_get_text ... 我尝试在回调中向 alphalist 添加一个“&”但没有成功。
void setLetter(GtkWidget *alphabox, gpointer alphal){
struct Alpha *alphalist = alphal;
gchar *charnum;
int num;
charnum = (gtk_widget_get_name(alphabox));
num = atoi(charnum);
g_print(gtk_label_get_text(GTK_LABEL(alphalist->alphalbl[num])));
g_free(charnum);
}
是否为结构正确分配了内存?调用 malloc() 会解决我的问题吗?如果是这样,在哪里以及如何?我试过添加它但没有成功。任何帮助将不胜感激。先感谢您。
解决方案
好吧,我确实得到了一个可以在 main 之外运行的测试程序。我将不得不稍微修改它以适应我之前所做的。需要注意的是,在原始程序中传递结构时,我会得到编译器错误,除非使用 gpointer 完成。以前这里有一个函数类型错误。在这里它工作得很好。我还包含了该结构的构造函数。我会看看我是否可以得到原始修改和工作。谢谢...
#include <gtk/gtk.h>
struct Alpha{
GtkWidget *label[5];
gchar *num[10];
gint start;
};
struct Alpha *Alpha_new(void){
struct Alpha *p = g_malloc(sizeof *p);
}
void Alpha_delete(struct Alpha *p, gpointer data){
g_free(p);
}
void createWindow(GtkWidget **window, struct Alpha *alpha, gint x, gint y);
void setLabel(struct Alpha *alpha, GtkWidget *button);
void printNum(struct Alpha *alpha);
void main(int argc, char** argv) {
GtkWidget *window;
struct Alpha *alpha;
alpha = Alpha_new();
gtk_init(&argc, &argv);
createWindow(&window, alpha, 600, 400);
gtk_widget_show_all(window);
gtk_main();
}
void createWindow(GtkWidget **window, struct Alpha *alpha, gint x, gint y){
GtkWidget *fixed, *label, *button;
gchar *num[] = {"0","1","2","3","4","5","6","7","8","9"};
*window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(*window), x, y);
fixed = gtk_fixed_new();
label = gtk_label_new("Struct Test");
gtk_fixed_put(GTK_FIXED(fixed), label, 280, 50);
button = gtk_button_new_with_label("TEST");
gtk_fixed_put(GTK_FIXED(fixed), button, 280, 250);
for(int y = 0; y < 10; y++)
alpha->num[y] = g_strdup(num[y]);
for(int a = 0; a < 10; a++)
g_print(alpha->num[a]);
g_print("----");
printNum(alpha);
for(int i = 0; i < 5; i++){
alpha->label[i] = gtk_label_new(alpha->num[i]);
gtk_fixed_put(GTK_FIXED(fixed), (alpha->label[i]), 310, (100 + (15*i)));
}
alpha->start = 1;
gtk_container_add(GTK_CONTAINER(*window), fixed);
g_signal_connect_swapped(button, "clicked", G_CALLBACK(setLabel), alpha);
g_signal_connect_swapped(*window, "destroy", G_CALLBACK(Alpha_delete), alpha);
}
void printNum(struct Alpha *alpha){
for(int i = 0; i < 10; i++)
g_print(alpha->num[i]);
}
void setLabel(struct Alpha *alpha, GtkWidget *button){
int start = alpha->start;
for(int i = 0; i < 5; i++){
if(i + start > 9)
gtk_label_set_text(GTK_LABEL(alpha->label[i]), alpha->num[(i + (start-10))]);
else
gtk_label_set_text(GTK_LABEL(alpha->label[i]), alpha->num[(i + start)]);
}
(alpha->start)++;
if(alpha->start == 10)
alpha->start = 0;
}
推荐阅读
- java - 如何使 Spring Projections 与 @OneToOne 关系一起工作?
- react-native - 使用 React Navigation 防止在选项卡更改时重新渲染
- r - 在 R 中绘制 geom_line 和 geom_ribbon 时如何添加不连续性?
- regex - 修改 Go 正则表达式,使其不拾取最后一个字符
- amazon-web-services - 使用 aws cognito 链接/连接 Google oidc 外部提供商
- fetch - 来自 DOM 的代理 webpack-dev-server
- spring - 如何在 Spring 中为非安全端点传递 Authorizatoin 标头
- python - Catplot 与 Seaborn,并排
- linux - 如何使用awk从目录中的多个文件中查找文件内容中包含字符串“abcd”的文件名
- c# - 将单字符字符串转换为 char