У меня проблемы с передачей структур (указателей) за пределы исходной функции, в которой они были инициализированы.
Что я заметил: Чем дальше я получаю от функции, тем изначально я инициализировал структуру (когда я передаюструктура от одной функции до следующей в качестве указателя), я в основном начинаю терять данные (или ссылаться на данные).Когда я пытаюсь напечатать одно из целых чисел в структуре, оно даст мне правильное значение, затем переходит в мусор (возможно, в ячейку памяти ??), а затем снова выводит значение и снова мусор в случайном порядке.
Программа: в следующей программе я пытаюсь создать набор из 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-> start из этой функции только для того, чтобы она работала с перерывами без изменения ее значения.Я попытался добавить '&' к 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 () решить мою проблему?Если да, то где и как?Я пытался добавить его без успеха.Любая помощь будет оценена.Заранее спасибо.