Discussion:
[Wxart2d-users_dev] MinGw not happy with SortonXs()
damateem
2014-02-14 16:09:59 UTC
Permalink
I'm using wxWidgets-3.0.0 with MinGW (tdm-gcc-4.8.1-3).

When building wxArt2D I get the following error.

C:\user_data\david\dajac\source_pool\wxArt2D\wxArt2D\packages\wxart2d\artbase\sr
c\drawer2d.cpp: In member function 'void a2dDrawer2D::FillPolygon(int,
wxRealPoi
nt*)':
C:\user_data\david\dajac\source_pool\wxArt2D\wxArt2D\packages\wxart2d\artbase\sr
c\drawer2d.cpp:2792:42: error: invalid conversion from 'int (*)(const
a2dAET**,
const a2dAET**)' to 'wxSortCompareFunction {aka int (*)(const void*,
const void*
)}' [-fpermissive]
m_AETlist.Sort( SortonXs );
^
In file included from
C:/user_data/david/dajac/source_pool/wxWidgets-3.0.0/inclu
de/wx/wx.h:17:0,
from
C:\user_data\david\dajac\source_pool\wxArt2D\wxArt2D\packa
ges\wxart2d\artbase\src\drawer2d.cpp:18:
C:/user_data/david/dajac/source_pool/wxWidgets-3.0.0/include/wx/list.h:320:14:
e
rror: initializing argument 1 of 'void
a2dAETList::Sort(wxSortCompareFunction)
' [-fpermissive]
void Sort( wxSortCompareFunction compfunc
) \

^
C:/user_data/david/dajac/source_pool/wxWidgets-3.0.0/include/wx/list.h:66:5:
not
e: in expansion of macro 'WX_DECLARE_LIST_XO'
WX_DECLARE_LIST_XO(elT*, liT, decl)
^
C:/user_data/david/dajac/source_pool/wxArt2D/wxArt2D/packages/wxart2d/include/wx
/artbase/artglob.h:323:1: note: in expansion of macro
'WX_DECLARE_LIST_WITH_DECL
'
WX_DECLARE_LIST_WITH_DECL( a2dAET, a2dAETList, class A2DARTBASEDLLEXP );
^
artbase\src\CMakeFiles\artbase.dir\build.make:57: recipe for target
'artbase/src
/CMakeFiles/artbase.dir/drawer2d.cpp.obj' failed
mingw32-make[2]: ***
[artbase/src/CMakeFiles/artbase.dir/drawer2d.cpp.obj] Error
1
CMakeFiles\Makefile2:222: recipe for target
'artbase/src/CMakeFiles/artbase.dir/
all' failed
mingw32-make[1]: *** [artbase/src/CMakeFiles/artbase.dir/all] Error 2
Makefile:115: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

To make the compiler happy, I changed the SortonXs() function to accept
void* parameters and explicitly cast to a2sAET** as follows.

static int SortonXs( const void* f, const void* s )
{
const a2dAET** first =(const a2dAET **)f;
const a2dAET** second =(const a2dAET **)s;

if ( ( *first )->m_xs < ( *second )->m_xs )
return -1;
else if ( ( *first )->m_xs > ( *second )->m_xs )
return 1;

return 0;
}

This hasn't been tested (beyond compiling) so I'm not sure it actually
gives the desired results. Beware if you have issues with filled polygons.

David

Loading...