invalid conversion ...



  • Hallo,
    ich bin dabei, ein etwas älteres Programm unter gcc 3.3 compilierfähig zu machen. Vermutlich gab es bei älteren Compilern keine Probleme. Nun denn, einiges konnte ich beheben, doch bei dem folgenden verliere ich den Durchblick:

    g++ -c ui_mgr.c
    ui_mgr.c: In function `void ui_event_mouse_func(int, int, int, int)':
    ui_mgr.c:231: error: invalid conversion from `int' to `winsys_mouse_button_t'
    

    Die angemeckerte Stelle im Programm:

    void ui_event_mouse_func( int button, int state, int x, int y ) {
    ...
    
        if ( state == WS_MOUSE_DOWN ) {
    	trigger_mouse_button_cbs( mouse_down_cbs, button, x, y ); // Zeile 231
        } else {
    	trigger_mouse_button_cbs( mouse_up_cbs, button, x, y );
        }
    ...
    }
    

    Die betroffene Funktion steht im selben Modul oberhalb:

    static void trigger_mouse_button_cbs
    	( hash_table_t table, winsys_mouse_button_t button, int x, int y )
    {
        hash_search_t iter;
        ui_callback_data_t *cb_data;
    
        begin_hash_scan( table, &iter );
        while ( next_hash_entry( iter, NULL, (hash_entry_t*)&cb_data ) ) {
    	((mouse_button_event_cb_t)cb_data->cb)( 
    	    cb_data->widget, (winsys_mouse_button_t) button, x, y );
    
    	if ( is_mode_change_pending() ) { break;}
        }
        end_hash_scan( iter );
    }
    

    Der inkompatible Typ schließlich ist in einem anderen Modul folgendermaßen festgelegt:

    typedef enum {
        WS_LEFT_BUTTON = GLUT_LEFT_BUTTON,
        WS_MIDDLE_BUTTON = GLUT_MIDDLE_BUTTON,
        WS_RIGHT_BUTTON = GLUT_RIGHT_BUTTON 
    } winsys_mouse_button_t;
    

    Wo hakt es, und wo kann ich eingreifen, um die Sache stimmig zu machen?

    Reinhard



  • In C konntest du noch implizit von int nach enum casten, in C++ brauchst du dafür einen expliziten Cast:

    trigger_mouse_button_cbs( mouse_down_cbs, (winsys_mouse_button_t)button, x, y );
    

    (oder noch besser - du deklarierst den zweiten Parameter deiner Funktion gleich mit dem richtigen Typ, dann mußt du nichts konvertieren)



  • Ja, dein erster Vorschlag funktioniert. Das Umdeklarieren des Parameters hatte ich schon versucht, aber da bekam ich gehörig Krach mit den anderen Modulen, die nun ebenfalls angepasst werden wollten (sind insgesamt mehr als 70 Module, das Programm ist nicht von mir). Regelrechter Rattenschwanz.

    Danke
    Reinhard


Anmelden zum Antworten