This is a shortcut, it avoid to use a struct to store the int. Sometimes for
an example it is better to have less code, this way you only see the
interesting part. But of course this is not a good example for newbies.

2010/5/19 Brett Nash <n...@nash.id.au>

> On Tue, 18 May 2010 22:01:57 +0200
> Andreas Volz <li...@brachttal.net> wrote:
>
> > Hello,
> >
> > I noticed a problem in the Elementary GenList example code:
> >
> > static Elm_Genlist_Item_Class itc1;
> > char *gl_label_get(const void *data, Evas_Object *obj, const char
> > *part) {
> >    char buf[256];
> >    snprintf(buf, sizeof(buf), "Item # %i", (int)data);
> >    return strdup(buf);
> > }
> >
> > static void
> > gl_sel(void *data, Evas_Object *obj, void *event_info)
> > {
> >    printf("sel item data [%p] on genlist obj [%p], item pointer
> > [%p]\n", data, obj, event_info);
> >    printf ("data val: %i\n", (int) data);
> > }
> >
> > void
> > test_genlist(void *data, Evas_Object *obj, void *event_info
> > {
> >    int i;
> >    ...
> >
> >    for (i = 0; i < 2000; i++)
> >      {
> >         gli = elm_genlist_item_append(gl, &itc1,
> >                                       (void *)i/* item data */,
> >                                       NULL/* parent */,
> >                                       ELM_GENLIST_ITEM_NONE,
> >                                       gl_sel/* func */,
> >                                       (void *)(i * 10)/* func data
> > */); ...
> > }
> >
> > While wrapping GenList to C++ I noticed that something really bad
> > happens here. The value of 'i' and 'i*10' is casted into a pointer
> > type and later casted back to int. I'm really sure this code isn't
> > covered by the C standard and not portable in any way. This code
> > needs the int type to have the same size as a pointer type. But there
> > may be architectures/compilers where this isn't the case. And even if
> > this works here it may bring someone to the idea to do the same with
> > other integral types where this won't work for sure. Not a smart idea
> > in a public example...
> >
> > If you think this is correct code and I'm wrong please enlighten
> > me. :-)
>
> It's technically not correct.  Yes it hits something undefined in there.
> Practically however it's only a problem if sizeof(int) > sizeof(ptr) or
> some weird platform which doesn't support odd pointers or something
> (cray I's?).  Don't think efl runs on any of those platforms ;-)
>
> Pratically it's fine.  A slight improvement may be to cast it to an
> intptr_t which will protect it against different size void/int's  (And
> will reduce warnings too).
>
> > If not I'll change the example to hold two int arrays in the correct
> > scope and work with pointer type data.
>
> Or do that ;-)
>
>
> ------------------------------------------------------------------------------
>
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>



-- 
Regards.
------------------------------------------------------------------------------

_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to