Re: Segmentation fault in creating basic app using GTK+ (with C)



Hi,

As Tadej told, your problem is that you are assign p->one and p->two 
to pointers that aren't initialized.

GtkWidget *textEntry;
GtkWidget *label;
GtkWidget *grid;
struct mulptr *p = (struct mulptr *)malloc(sizeof(struct mulptr));
p->one = textEntry; // here
p->two = label;     // and here, textEntry and label have a 
undefined >                     // value

but, I've some things to add:
 * note that you're allocating(malloc) but not freeing.
 * I recommend create a typedef of your struct to simplify things out.
 * I recommend use of GString over c-strings, quote from doc:

A GString is an object that handles the memory management of a C > 
string for you.

here is your code with modifications that I've said:

#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>


typedef struct
{
  GtkWidget *one;
  GtkWidget *two;
  GString   *str;
} mulptr;

int tofarenheit(int c)
{
  return (c*1.8 + 32);
}

void calculate(GtkWidget *widget, gpointer data)
{
  mulptr *p = (mulptr *) data;
  int res = 0, F;

  res = atoi(gtk_entry_get_text(GTK_ENTRY(p->one)));
  if(res)
  {
    F = tofarenheit(res);
    g_string_printf (p->str, "%d", F);
  }
  else
    g_string_overwrite (p->str, 0, "Invalid Input!");
  gtk_label_set_text(GTK_LABEL(p->two), p->str->str);
}

int main(int argc, char *argv[])
{
  // Decleration
  GtkWidget *window;
  GtkWidget *calButton;
  GtkWidget *grid;
  mulptr p;

  // Initilization
  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  //gtk_window_set_default_size(GTK_WINDOW(window), 480, 320);
  gtk_window_set_title(GTK_WINDOW(window), "Celcius to Ferenheit 
Converter");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  grid = gtk_grid_new();

  p.str = g_string_new ("Result here");
  p.two = gtk_label_new(p.str->str);
  p.one = gtk_entry_new();
  calButton = gtk_button_new_with_label("Calculate");

  // Adding widget to frame
  gtk_container_add(GTK_CONTAINER(window), grid);
  gtk_grid_attach(GTK_GRID(grid), p.one, 0, 0, 1, 1);
  gtk_grid_attach(GTK_GRID(grid), p.two, 1, 0, 1, 1);
  gtk_grid_attach(GTK_GRID(grid), calButton, 0, 1, 1, 1);


  // Signal Handlers
  g_signal_connect (window, "delete-event", G_CALLBACK 
(gtk_main_quit), NULL);
  g_signal_connect (calButton, "clicked", G_CALLBACK(calculate), &p);


  // Essentials
  gtk_widget_show_all(window);
  gtk_main();
  
  // Free
  g_string_free (p.str, TRUE);

  return 0;
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]