FILE *LCD_stdout = new FILE();
int (*ptr)(char, FILE *) = ROBOT::__LCD_putchar;
fdev_setup_stream(LCD_stdout, ptr, NULL, _FDEV_SETUP_WRITE );
stdout = LCD_stdout;
дает мне ошибку:
In member function 'SUBSYS_OPENSTAT ROBOT::LCD_open()':
LCD.cpp:108: error: argument of type 'int (ROBOT::)(char, __file*)' does not match 'int (*)(char, __file*)'
Я посмотрел на ряд решений через переполнение стека и еще много чего. . * не разрешает это, попытался назначить указатель указателя, и я чувствую, что, скорее всего, не смогу разрешить его без разрешения неправильных представлений.
Ошибка компилятора говорит вам именно так в чем дело:
аргумент тип
'int (ROBOT::)(char, __file*)'
не совпадает'int (*)(char, __file*)
…потому что указатели на функции-члены не совместимы с указателями на функции, не являющиеся членами, по нескольким причинам.
Один из вариантов — создать отдельную свободную функцию, но это зависит от того, где находится объект ROBOT. Например, если у вас есть глобальный объект ROBOT, вы можете сделать следующее
ROBOT globalRobot;
int callback(char c, FILE* f)
{
return globalRobot.__LCD_putchar(c, f);
}
FILE *LCD_stdout = new FILE();
fdev_setup_stream(LCD_stdout, callback, NULL, _FDEV_SETUP_WRITE );
stdout = LCD_stdout;
Если будет только один объект робота, и он является переменной-членом другого изменения класса globalRobot
быть указателем и устанавливать его после создания объекта ROBOT (возможно, конструктор ROBOT)
Это не проверено, так как я не знаю внутренностей робота, но все выглядит хорошо.