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