Invalid Conversion
Raf Vermeulen

I've got this here code (C++, Allegro and AGUP for the GUI) that's an utter bastard to get to work.

1 
2int translate()
3{
4 alert("You pushed my button!", "Isn't this a useful feature?", 0,
5 "&Yes", "&Definitely", 'y', 'd');
6 
7 return D_O_K;
8}
9 
10 
11 
12(...)
13 
14DIALOG main_dlg[] =
15{
16 /* (dialog proc) (x) (y) (w) (h) (fg)(bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
17
18 /* this element just clears the screen, therefore it should come before the others */
19 { d_agup_clear_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
20
21 
22 
23 { d_agup_edit_proc, 100, 75, 160, 8, 0, 0, 0, 0, LENGTH, 0, word_1, NULL, NULL },
24 { d_agup_push_proc, 100, 95, 100, 20, 0, 0, 0, 0, 0, 0, str_trans, 0, translate },
25 { quit_proc, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0 },
26
27 /* the next two elements don't draw anything */
28 { d_yield_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
29 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
30};

What it does while compiling, is giving this error message:

Quote:

invalid conversion from `int (*)()' to `void*'

It points to the main_dlg declaration, and seems to be caused by the d_agup_push_proc part.

Now, I've checked an example code that does work:

1int surprise()
2{
3 alert("You pushed my button!", "Isn't this a useful feature?", 0,
4 "&Yes", "&Definitely", 'y', 'd');
5 
6 return D_O_K;
7}
8 
9(...)
10 
11#define DIS D_DISABLED
12#define SEL D_SELECTED
13 
14 
15DIALOG main_dlg[] =
16{
17 /* proc x y w h fg bg key flags d1 d2 dp dp2 dp3 */
18 { d_agup_clear_proc, 0, 0, 320, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
19 
20 /* First column */
21 { d_agup_check_proc, 5, 25, 100, 12, 0, 0, 0, SEL, 0, 0, (void *)"check box", 0, 0 },
22 { d_agup_radio_proc, 5, 50, 100, 12, 0, 0, 0, SEL, 1, 0, (void *)"radio 1", 0, 0 },
23 { d_agup_radio_proc, 5, 75, 100, 12, 0, 0, 0, 0, 1, 0, (void *)"radio 2", 0, 0 },
24 { d_agup_shadow_box_proc, 5, 100, 100, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
25 { d_agup_slider_proc, 5, 125, 100, 12, 0, 0, 0, 0, 100, 50, 0, 0, 0 },
26 { d_agup_edit_proc, 5, 150, 100, 14, 0, 0, 0, 0, 100, 0, buf2, 0, 0 },
27 { d_agup_list_proc, 5, 175, 100, 50, 0, 0, 0, 0, 2, 0, lister, sel2, 0 },
28 
29 /* Buttons */
30 { d_agup_button_proc, 110, 25, 100, 20, 0, 0, 0, 0, 0, 0, (void *)"button", 0, 0 },
31 { d_agup_push_proc, 110, 50, 100, 20, 0, 0, 0, 0, 0, 0, (void *)"button", 0, surprise },
32 { d_agup_button_proc, 215, 25, 100, 20, 0, 0, 0, DIS, 0, 0, (void *)"button", 0, 0 },
33 { d_agup_button_proc, 215, 50, 100, 20, 0, 0, 0, DIS|SEL, 0, 0, (void *)"button", 0, 0 },
34 
35 /* Misc */
36 #define ICON_DIALOG 12
37 { d_agup_icon_proc, 240, 75, 50, 50, 0, 0, 0, 0, 2, 2, 0, 0, 0 },
38 { d_agup_text_proc, 240, 130, 75, 12, 0, 0, 0, 0, 0, 0, (void *)"A", 0, 0 },
39#if (ALLEGRO_VERSION == 4) && (ALLEGRO_SUB_VERSION == 0)
40 /* Allegro 4.0 had a severely broken ctext_proc. */
41 { d_agup_ctext_proc, 240 + 75 / 2, 150, 0, 12, 0, 0, 0, 0, 0, 0, (void *)"B", 0, 0 },
42#else
43 { d_agup_ctext_proc, 240, 150, 75, 12, 0, 0, 0, 0, 0, 0, (void *)"B", 0, 0 },
44#endif
45 { d_agup_rtext_proc, 240, 170, 75, 12, 0, 0, 0, 0, 0, 0, (void *)"C", 0, 0 },
46 { d_agup_textbox_proc, 110, 75, 100, 150, 0, 0, 0, 0, 0, 0, buf3, 0, 0 },
47 { d_agup_slider_proc, 215, 75, 12, 100, 0, 0, 0, 0, 100, 50, 0, 0, 0 },
48 { d_agup_box_proc, 215, 185, 100, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
49 { d_agup_slider_proc, 215, 213, 100, 12, 0, 0, 0, DIS, 100, 0, 0, 0, 0 },
50 { d_agup_menu_proc, 5, 5, 310, 12, 0, 0, 0, 0, 0, 0, menubar, 0, 0 },
51 { quit_proc, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0 },
52 { d_agup_text_proc, 0, 232, 320, 8, 0, 0, 0, 0, 0, 0, version, 0, 0 },
53 { d_yield_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
54 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
55};

That does work. I don't see what I've done wrong :? Anybody able to help me out on this one?

umperio

Try an explicit cast on both the string and procedure (void *).

Kitty Cat

C++ is a lot more strict on casting. Non-void pointers need to be cast to void* (in this case, the translate function pointer you're passing).

Raf Vermeulen

That worked. Thanks so much, you two:)

Thread #581712. Printed from Allegro.cc