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. :-)

If not I'll change the example to hold two int arrays in the correct
scope and work with pointer type data.

regards
        Andreas

------------------------------------------------------------------------------

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

Reply via email to