GTK_Pointer выдает при передаче структур в C - PullRequest
0 голосов
/ 31 мая 2018

У меня проблемы с передачей структур (указателей) за пределы исходной функции, в которой они были инициализированы.

Что я заметил: Чем дальше я получаю от функции, тем изначально я инициализировал структуру (когда я передаюструктура от одной функции до следующей в качестве указателя), я в основном начинаю терять данные (или ссылаться на данные).Когда я пытаюсь напечатать одно из целых чисел в структуре, оно даст мне правильное значение, затем переходит в мусор (возможно, в ячейку памяти ??), а затем снова выводит значение и снова мусор в случайном порядке.

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

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Ну, я получил тестовую программу для работы с основной.Я должен немного изменить это, чтобы соответствовать тому, что я делал ранее.Следует отметить, что при передаче структур в исходной программе я получаю ошибки компилятора, если это не сделано с помощью 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;

 }
0 голосов
/ 31 мая 2018

g_signal_connect(alphabox[i], "button_press_event", G_CALLBACK(setLetter), &alphalist); //<--struct does not send correctly

In createlist alphalist - это указатель на структуру Alpha .Вы пытаетесь передать указатель на это, то есть указатель на указатель на структуру Alpha .Это определенная ошибка, потому что это точное значение размещено в стеке и больше не действует при возврате из createlist.


Если первый блок кода не является main но функция, та же проблема появляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...