diego sevilla’s weblog
it is better to remain silent and be thought a fool,
than to open your mouth and remove all doubt -- groucho marx

14/8/2006

Más de C++

Filed under: español, código/code — Diego Sevilla @ 1:32 — In English

Siento ser tan pesado, pero es en lo que estoy trabajando últimamente. En el último post incluí una manera de tratar de igual forma a un Pango::Rectangle y un Gdk::Rectangle teniendo en cuenta que tienen el mismo interfaz. Pues bien, se me ocurrió hacer una cosa parecida para encontrar el punto medio de un rectángulo. El punto medio se retorna como las coordenadas x e y de un nuevo rectángulo devuelto:

template <class Rect> Rect
middleOfRect(Rect& r)
{
    Rect _r;

    _r.set_x(r.get_x() + r.get_width() / 2);
    _r.set_y(r.get_y() + r.get_height() / 2);

    return _r;
}

Sé que estamos en verano y todo eso, pero precisamente por ello, os dejo un reto. Esta función tiene un problema que hace que en C++ no funcione con _ciertos_ valores de clase Rect (y no me refiero al hecho del redondeo en la división, etc.) ¿Sabéis cuál es? Mañana, si nadie lo ha sacado, publicaré la solución. Como pista diré que es un problema intrínseco de los templates de C++.

6 Comments »

  1. Es posible que el problema esta en la declaracion Rect _r; que puede que el constructor necesite parametros, y si no los tiene dara un error de compilacion, creo que la solucion estaría en utilizar un Pango::Rectangle o un Gdk::Rectangle en concreto, y utilizar su constructir, ejemplo;
    template { class Rect } Gdk::Rectangle
    middleOfRect(RectAMP r)
    {
    Gdk::Rectangle _r();
    // o como sea el constructor
    // tambien: return Gdk::Rectangle((r.get_x() + r.get_width() / 2),(r.get_y() + r.get_height() / 2));

    _r.set_x(r.get_x() + r.get_width() / 2);
    _r.set_y(r.get_y() + r.get_height() / 2);

    return _r;
    }

    Estoy en lo cierto??

    Comment by dlink — 14/8/2006 @ 11:59

  2. Hola, dlink:

    No, eso no me funciona, porque fuerzas a que se retorne un Gdk::Rectangle. Además, ambos, tanto Gdk::Rectangle como Pango::Rectangle tienen constructor por defecto, y no dan fallo ahí. Lo que yo quería conseguir es que se retorne un rectángulo del mismo tipo (uno de los dos mencionados) cuya x e y sean el centro del otro rectángulo. En unas horas tendré un rato y actualizo con más problemas y un solución que es la única que permite C++, por desgracia.

    Saludos!
    diego.

    Comment by Diego Sevilla — 14/8/2006 @ 12:34

  3. Bufff como estoy de c++
    ¿Pero esa funcion retorna algo?
    ¿Si lo que quieres es retornar el punto medio no sería más logico Point o algo así? Ya que _r parece que no tiene ni ancho ni alto.

    Comment by ^_^ — 14/8/2006 @ 21:52

  4. Vale, si que retorna. Buff no me acostumbraré nunca a esa forma de escribir las funciones.

    Comment by ^_^ — 14/8/2006 @ 22:23

  5. y que tal:
    template Rect
    middleOfRect(Rect r)
    {
    r.set_x(r.get_x() + r.get_width() / 2);
    r.set_y(r.get_y() + r.get_height() / 2);
    return r;
    }

    Comment by dlink — 17/8/2006 @ 20:12

  6. dlink: Eso obligaría a modificar el rectángulo que te pasan como entrada, lo cual está directamente relacionado con el problema verdadero: ¿qué pasa si Rect es en realidad “const Gtk::Rectangle”? Que el código no sirve… Voy a añadir un post.

    Saludos,
    diego.

    Comment by Diego Sevilla — 18/8/2006 @ 2:27

RSS feed for comments on this post. TrackBack URI

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Anti-Spam by WP-Morph 

Creative Commons License
This work is licensed under a Creative Commons License.
EWWV  AWStats  Site Meter 24 queries. 0.060 seconds. Powered by WordPress
406034 email messages processed in this box. 10858 were spam

0