Перенаправление stdout на LCD: указатель класса члена

    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*)'

Я посмотрел на ряд решений через переполнение стека и еще много чего. . * не разрешает это, попытался назначить указатель указателя, и я чувствую, что, скорее всего, не смогу разрешить его без разрешения неправильных представлений.

0

Решение

Ошибка компилятора говорит вам именно так в чем дело:

аргумент тип 'int (ROBOT::)(char, __file*)' не совпадает 'int (*)(char, __file*)

…потому что указатели на функции-члены не совместимы с указателями на функции, не являющиеся членами, по нескольким причинам.

1

Другие решения

Один из вариантов — создать отдельную свободную функцию, но это зависит от того, где находится объект 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)

Это не проверено, так как я не знаю внутренностей робота, но все выглядит хорошо.

0