boost::gil und 64bit



  • Hallo.
    Ich möchte ein Programm (es ist sehr ähnlich dem resize-Beispiel von boost http://www.boost.org/doc/libs/1_52_0/libs/gil/example/resize.cpp) mittels einem 64bit Bompiler compilieren.

    kleiner code-auszug:

    boost::gil::bgr8_image_t img;
    boost::gil::jpeg_read_image(path+file,img);
    boost::gil::rgb8_image_t square100x100(usewidth,useheight);
    
    boost::gil::resize_view(const_view(img), view(square100x100), bilinear_sampler());
    

    Leider bekomme ich folgendes Fehlermeldung:

    In file included from image.cpp:137:
    /coding/boost/gil/extension/numeric/sampler.hpp: In function »bool boost::gil::sample(boost::gil::bilinear_sampler, const SrcView&, const boost::gil::point2<F>&, DstP&) [with DstP = boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector3<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t>, boost::mpl::range_c<int, 0, 3> > >, SrcView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<const boost::gil::bgr8c_pixel_t*> > >, F = double]«:
    /coding/boost/gil/extension/numeric/resample.hpp:53:   instantiated from »void boost::gil::resample_pixels(const SrcView&, const DstView&, const MapFn&, Sampler) [with Sampler = boost::gil::bilinear_sampler, SrcView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<const boost::gil::bgr8c_pixel_t*> > >, DstView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> > >, MapFn = boost::gil::matrix3x2<double>]«
    /coding/boost/gil/extension/numeric/resample.hpp:125:   instantiated from »void boost::gil::resample_subimage(const SrcMetaView&, const DstMetaView&, double, double, double, double, double, const Sampler&) [with Sampler = boost::gil::bilinear_sampler, SrcMetaView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<const boost::gil::bgr8c_pixel_t*> > >, DstMetaView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> > >]«
    /coding/boost/gil/extension/numeric/resample.hpp:136:   instantiated from »void boost::gil::resize_view(const SrcMetaView&, const DstMetaView&, const Sampler&) [with Sampler = boost::gil::bilinear_sampler, SrcMetaView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<const boost::gil::bgr8c_pixel_t*> > >, DstMetaView = boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> > >]«
    image.cpp:285:   instantiated from here
    /coding/boost/gil/extension/numeric/sampler.hpp:105: Fehler: keine passende Funktion für Aufruf von »boost::gil::point2<int>::point2(boost::gil::point2<long int>)«
    /coding/boost/gil/utilities.hpp:75: Anmerkung: Kandidaten sind: boost::gil::point2<T>::point2(const boost::gil::point2<T>&) [with T = int]
    /coding/boost/gil/utilities.hpp:74: Anmerkung:                  boost::gil::point2<T>::point2(T, T) [with T = int]
    /coding/boost/gil/utilities.hpp:73: Anmerkung:                  boost::gil::point2<T>::point2() [with T = int]
    

    image.cpp Zeile 137:

    #include "boost/gil/extension/numeric/sampler.hpp"
    

    image.cpp Zeile 285

    boost::gil::resize_view(const_view(img), view(square100x100), bilinear_sampler());
    

    Das Problem an sich habe ich eigentlich auch gefunden in der sampler.hpp

    point2<int> p0(ifloor(p)); // the closest integer coordinate top left from p
    

    ifloor ist die böse Funktion bzw. std::ptrdiff_t:

    inline point2<std::ptrdiff_t> ifloor(const point2<float >& p)  { return point2<std::ptrdiff_t>(ifloor(p.x),ifloor(p.y)); }
    inline point2<std::ptrdiff_t> ifloor(const point2<double>& p)  { return point2<std::ptrdiff_t>(ifloor(p.x),ifloor(p.y)); }
    

    Ein möglicher workaround könnte folgender sein:

    point2<int> p0(ifloor(p));
    

    wird folgend ersetzt

    point2<int> p0(ifloor(p).x, ifloor(p).y );
    

    ABER sollte das die Lösung sein?
    Laut der boost Versionhistory werden ja auch alle Libs mit 64bit compilern getestet. Habe ich hier noch einen Fehler in meiner boost-Umgebung oder ist das ein bug in der boost?

    Danke für die Hilfe!



  • Wo wird in dem verlinkten Beispiel point2<int> verwendet? O.o
    Und warum verwendest du nicht einfach point2<ptrdiff_t>?
    (bzw. auto, wenn du einen C++11 Compiler hast dun dir point2<ptrdiff_t> zu viel tipparbeit ist)

    Du solltest bedenken, dass int auch bei einem 64-Bit-Kompilat immer noch 32 Bit groß ist.
    Das heißt entweder, dir gehen Informationen verloren, wenn du von point2<ptrdiff_t> nach point2<int> umwandelst,
    oder du kennst den Wertebereich und weißt, dass jeder Wert in einen int passt.
    In letzterem Fall wirst du wohl trotzdem den workaround nutzen müssen.

    PS.: Mach bei dem workaround aus

    point2<int> p0(ifloor(p).x, ifloor(p).y );
    

    lieber

    point2<int> p0(ifloor(p.x), ifloor(p.y) );
    


  • DrakoXP schrieb:

    Wo wird in dem verlinkten Beispiel point2<int> verwendet? O.o

    wird im boost-source boost/gil/extension/numeric/resample.hpp:103 verwendet

    DrakoXP schrieb:

    Du solltest bedenken, dass int auch bei einem 64-Bit-Kompilat immer noch 32 Bit groß ist.
    Das heißt entweder, dir gehen Informationen verloren, wenn du von point2<ptrdiff_t> nach point2<int> umwandelst,
    oder du kennst den Wertebereich und weißt, dass jeder Wert in einen int passt.

    Da mein Programm bist vor kurzem nur in einer 32bit Umgebung gelaufen ist, denke ich, dass auch in einer 64bit Umgebung ein int Wert ausreicht.

    DrakoXP schrieb:

    In letzterem Fall wirst du wohl trotzdem den workaround nutzen müssen.

    PS.: Mach bei dem workaround aus

    point2<int> p0(ifloor(p).x, ifloor(p).y );
    

    lieber

    point2<int> p0(ifloor(p.x), ifloor(p.y) );
    

    hmm, warum ist die von dir vorgeschlagene Variante besser?

    Ev. sollte ich nochmal betonen, dass ich boost/gil/extension Sourcecode verändern muss, damit es compilefähig ist, ist sowas normal oder eher nicht.


Anmelden zum Antworten