Ayuda!!!! gtk y c

Iniciado por _--ziarox--__, 5 Febrero 2016, 02:04 AM

0 Miembros y 1 Visitante están viendo este tema.

_--ziarox--__

Cómo mando parametros a una funcion en c desde gtk con g_signal_connect()?.
nesecito mandar una dirreccion de una pila y un elemento de tipo void.

furciorifa

¿Podrías ser más específico ?

_--ziarox--__

#2
En esta funcion donde al dar click en el boton push me llama a la funcion fun_push necesito enviarle la direccion de la pila donde agregare un elemento y el elemento a agregar.

g_signal_connect(G_OBJECT (push),"clicked",G_CALLBACK (fun_push),(gpointer)pila_Y_elem_a_agregar)


pero no logro enviarlos juntos, eh logrado enviarlos por separado pero no es lo que necesito




algo como esto:

GtkWidget *multidatos[2];
    multidatos[1] = store;
    multidatos[0] = field;
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(add_do), (gpointer)multidatos);

pero en ves de enviar widgets necesito enviar direcciones y un entero

Eternal Idol

Declara una estructura propia con punteros a esos tipos de datos. Tene en cuenta el ambito de la estructura, normalmente no podes pasar un puntero a una variable local a un callback ya que al terminar la funcion que llamo a g_signal_connect esa variable desaparece y en add_do accederias a memoria indefinida/invalida (con usar memoria dinamica se soluciona).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

_--ziarox--__

es esta la funcion de llamada:


g_signal_connect(G_OBJECT (puch),"clicked",G_CALLBACK (push),(gpointer)(estructura));


y esta la funcion que es llamada:

void push(Pila *p, void *elem) {
  //primero verifica que la pila no esté llena
  if(!esLlena(*p)) {
  int inicio = p->tope * p->tamelem, i;
  for(i = 0; i < p->tamelem; i++) {
  //guarda el elemento en la direccion de memoria correspondiente,
  //evitando sobreescribir los elementos existentes
    *(p->almacenamiento + inicio + i) = *((byte *)(elem + i));
  }
  //incrementa tope
  p->tope = p->tope + 1;
  printf("\nEl tope es: %d\n",p->tope);
}
}


esta seria la estructura a enviar?
contiene un apuntador a pila y un elemento de tipo void


typedef struct Enviar{
//apuntador a pila, para enviar la pila por referencia.
Pila *Pila_enviar;
//elemento a enviar, de tipo void porque se puede enviar
//un elemento de cualquier tipo(cadena, caracter, entero o flotante).
void elemento;
} Enviar;

sería correcto enviar la estructura Enviar?

Eternal Idol

La estructura en si misma parece ser correcta. Ahora yo nunca use GTK asi que no se que parametros se esperan en sus callbacks, si me guio por el ejemplo del enlace siguiente (GtkWidget *widget, gpointer data) vas a tener que crear una funcion callback de ese estilo que llame a push tomando Pila_enviar y elemento de gpointer (con un casting a puntero del tipo Enviar).

https://www.cs.bu.edu/~hwxi/ATS/EXAMPLE/GTK/HelloWorld.c
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón