[eside-ghost] Error raro al compilar..

Iker Perez de Albeniz - Txupete - txupete en gmail.com
Lun Sep 24 11:58:04 CEST 2007


ya he encontrado la solucion.. los explicaban en el manual de gtkmm
pero como no  sabia lo que ha explicado Jon Ander no lo entendia muy
bien y pase un poco del tema.. y ahora ya tiene sentido..

La solucion es usar la funcion Bind() de la siguiente manera:

ms_HSspeed.signal_value_changed ().connect(sigc::bind<int>(
sigc::mem_fun(*this, &configWindow::setSliderValue), 1));

modo:

sigc::bind(<casting del tipo de parametro a enviar>(clase que contiene
la funcion, funcion), parametro a enviar);

y la funcion se declara normal:

void configWindow::setSliderValue(int HSelect)
{
 std::ostringstream o;
 switch(HSelect){
               case 1: o << ms_HSspeed.get_value();
                               ms_Espeed.set_text(o.str());
                               break;
               case 2: o << ms_HSacceleration.get_value();
                               ms_Eacceleration.set_text(o.str());
                               break;
               case 3: o << ms_HSscanspeed.get_value();
                               ms_Escanspeed.set_text(o.str());
                               break;
               case 4: o << ms_HSscanacceleration.get_value();
                               ms_Escanacceleration.set_text(o.str());
                               break;
 }
}


El 24/09/07, Jon Ander Ortiz <jonbaine en gmail.com> escribió:
> Buenas:
>
> Lo que acabas de mandar esta bien... pero lo de antes no (de echo alfredo te
> dice la manera correcta de hacerlo...), me explico...
> C++ hace un tratamiento un tanto especial para los punteros a función, que
> funcionan de manera bastante diferente a los de C, en caso de que sean
> funciones estáticas (o forzando el linkado al modo "C", con la directiva
> extern "C" ) o funciones normales asociadas a una clase.
> Un puntero a función en C++, define la dirección dentro de un objeto del
> tipo al que pertenece, no es un ente "completo", por ello tienes que pasar
> el objeto sobre el que vas a ejecutar la acción (el *this que pones en todas
> las funciones es pasa eso), y no puedes pasar cuando estas pasando un
> puntero a función argumentos de la función que luego quieras ejecutar, ese
> es el error que cometes.
>
> En esta línea:
>
> ms_HSspeed.signal_value_changed ().connect(sigc::mem_fun(*this,
> &configWindow::setSliderValue(1)));
>
> Estás metiendo valores concretos en el puntero a función: setSliderValue
> (1)  Ese uno sobra !!! ;), es decir, que estas pasandole los argumentos en
> el puntero a función, cosa que no se puede hacer -->
> ms_HSspeed.signal_value_changed ().connect(sigc::mem_fun(*this,
>
> &configWindow::setSliderValue)); si el setSliderValue
> necesita argumentos echale un vistazo a como gestiona las llamadas en
> http://libsigc.sourceforge.net/libsigc2/docs/reference/html/group__mem__fun.html,
> que permite pasar punteros a función con varios paramentos, o sino haz lo
> que te ha pasado alfredo, haz una función que no tenga parametros y que haga
> lo que necesites.
>
> Ala y a compilar!!! XD y ojito con los punteros a funcion en C++ que son un
> tanto raritos XD
> Un saludete:
> Jonan
>
>
> El día 24/09/07, Iker Perez de Albeniz - Txupete - <txupete en gmail.com>
> escribió:
> >
> > >
> > > Se refiere a lo que estás poniendo ahí arriba, que está mal. No puedes
> pasar
> > > como parámetro la dirección de una llamada a un método. No sé si tienes
> algún
> > > otro error porque hace lustros (bueno, al menos 1) que no hago nada en
> GTK+,
> >
> > en principio esa es la forma de conectar los botones a una accion...
> > lo tengo hecho asi en mas sitios y me funciona perfectamente, por
> > ejemplo:
> >
> >
> >
> m_EVclose.signal_button_press_event().connect(sigc::mem_fun(*this,
> > &configWindow::closeWindow));
> >
> m_EVclose.signal_enter_notify_event().connect(sigc::mem_fun(*this,
> > &configWindow::closeImageIn));
> >         m_EVclose.signal_leave_notify_event
> ().connect(sigc::mem_fun(*this,
> > &configWindow::closeImageOut));
> > ..
> > .
> > ..
> > ..
> > .
> > bool configWindow::closeWindow(GdkEventButton*)
> > {
> >   hide(); //Closes the main window to stop the Gtk::Main::run().
> >   return true;
> > }
> >
> > bool configWindow::closeImageIn(GdkEventCrossing*)
> > {
> >   m_Iclose.set("./skin/cerrar-s.png");
> >   return true;
> > }
> >
> > bool configWindow::closeImageOut(GdkEventCrossing*)
> > {
> >
> >   m_Iclose.set("./skin/cerrar.png");
> >   return true;
> > }
> > _______________________________________________
> > eside-ghost mailing list
> > eside-ghost en deusto.es
> > https://listas.deusto.es/mailman/listinfo/eside-ghost
> >
>
>
> _______________________________________________
> eside-ghost mailing list
> eside-ghost en deusto.es
> https://listas.deusto.es/mailman/listinfo/eside-ghost
>


Más información sobre la lista de distribución eside-ghost