#include <stdio.h>
typedef struct Printer Printer;
struct Printer
{
void (*print_string)(char*);
void (*print_int)(int);
void (*print_double)(double);
void (*print_endline)(void);
};
/* предполагается, что эти функции реализованы в отдельном файле
и не видны, поэтому могут иметь какие угодно имена,
просто тут в Ideone нет поддержки нескольких файлов
*/
void Printf_print_string
(char *s
) { printf("%s", s
); } void Printf_print_int
(int i
) { printf("%d", i
); } void Printf_print_double
(double d
) { printf("%f", d
); } void Printf_print_endline
(void) { printf("\n"); }
const Printer Printf = {
Printf_print_string,
Printf_print_int,
Printf_print_double,
Printf_print_endline
};
void Happy_print_string
(char *s
) { printf("%s ;-)", s
); } void Happy_print_int
(int i
) { printf("%d =)", i
); } void Happy_print_double
(double d
) { printf("%f B-]", d
); } void Happy_print_endline
(void) { printf("Bye! ^_^\n"); }
const Printer HappyPrinter = {
Happy_print_string,
Happy_print_int,
Happy_print_double,
Happy_print_endline
};
void print_all(Printer *p, char *s, int i, double d)
{
p->print_string(s);
Printf.print_string("\n\t");
p->print_int(i);
Printf.print_string("\n\t");
p->print_double(d);
Printf.print_string("\n\t");
p->print_endline();
Printf.print_string("\n");
}
int main(void)
{
print_all(&Printf, "printf", 1, 2.3);
print_all(&HappyPrinter, "Hello!", 1, 2.3);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCBQcmludGVyIFByaW50ZXI7CgpzdHJ1Y3QgUHJpbnRlcgp7Cgl2b2lkICgqcHJpbnRfc3RyaW5nKShjaGFyKik7Cgl2b2lkICgqcHJpbnRfaW50KShpbnQpOwoJdm9pZCAoKnByaW50X2RvdWJsZSkoZG91YmxlKTsKCXZvaWQgKCpwcmludF9lbmRsaW5lKSh2b2lkKTsKfTsKCi8qINC/0YDQtdC00L/QvtC70LDQs9Cw0LXRgtGB0Y8sINGH0YLQviDRjdGC0Lgg0YTRg9C90LrRhtC40Lgg0YDQtdCw0LvQuNC30L7QstCw0L3RiyDQsiDQvtGC0LTQtdC70YzQvdC+0Lwg0YTQsNC50LvQtQogICDQuCDQvdC1INCy0LjQtNC90YssINC/0L7RjdGC0L7QvNGDINC80L7Qs9GD0YIg0LjQvNC10YLRjCDQutCw0LrQuNC1INGD0LPQvtC00L3QviDQuNC80LXQvdCwLAogICDQv9GA0L7RgdGC0L4g0YLRg9GCINCyIElkZW9uZSDQvdC10YIg0L/QvtC00LTQtdGA0LbQutC4INC90LXRgdC60L7Qu9GM0LrQuNGFINGE0LDQudC70L7QsgogICAqLwp2b2lkIFByaW50Zl9wcmludF9zdHJpbmcoY2hhciAqcykgeyBwcmludGYoIiVzIiwgcyk7IH0Kdm9pZCBQcmludGZfcHJpbnRfaW50KGludCBpKSB7IHByaW50ZigiJWQiLCBpKTsgfQp2b2lkIFByaW50Zl9wcmludF9kb3VibGUoZG91YmxlIGQpIHsgcHJpbnRmKCIlZiIsIGQpOyB9CnZvaWQgUHJpbnRmX3ByaW50X2VuZGxpbmUodm9pZCkgeyBwcmludGYoIlxuIik7IH0KCmNvbnN0IFByaW50ZXIgUHJpbnRmID0gewoJUHJpbnRmX3ByaW50X3N0cmluZywKCVByaW50Zl9wcmludF9pbnQsCglQcmludGZfcHJpbnRfZG91YmxlLAoJUHJpbnRmX3ByaW50X2VuZGxpbmUKfTsKCnZvaWQgSGFwcHlfcHJpbnRfc3RyaW5nKGNoYXIgKnMpIHsgcHJpbnRmKCIlcyA7LSkiLCBzKTsgfQp2b2lkIEhhcHB5X3ByaW50X2ludChpbnQgaSkgeyBwcmludGYoIiVkID0pIiwgaSk7IH0Kdm9pZCBIYXBweV9wcmludF9kb3VibGUoZG91YmxlIGQpIHsgcHJpbnRmKCIlZiBCLV0iLCBkKTsgfQp2b2lkIEhhcHB5X3ByaW50X2VuZGxpbmUodm9pZCkgeyBwcmludGYoIkJ5ZSEgXl9eXG4iKTsgfQoKY29uc3QgUHJpbnRlciBIYXBweVByaW50ZXIgPSB7CglIYXBweV9wcmludF9zdHJpbmcsCglIYXBweV9wcmludF9pbnQsCglIYXBweV9wcmludF9kb3VibGUsCglIYXBweV9wcmludF9lbmRsaW5lCn07Cgp2b2lkIHByaW50X2FsbChQcmludGVyICpwLCBjaGFyICpzLCBpbnQgaSwgZG91YmxlIGQpCnsKCXAtPnByaW50X3N0cmluZyhzKTsKCVByaW50Zi5wcmludF9zdHJpbmcoIlxuXHQiKTsKCXAtPnByaW50X2ludChpKTsKCVByaW50Zi5wcmludF9zdHJpbmcoIlxuXHQiKTsKCXAtPnByaW50X2RvdWJsZShkKTsKCVByaW50Zi5wcmludF9zdHJpbmcoIlxuXHQiKTsKCXAtPnByaW50X2VuZGxpbmUoKTsKCVByaW50Zi5wcmludF9zdHJpbmcoIlxuIik7Cn0KCmludCBtYWluKHZvaWQpCnsKCXByaW50X2FsbCgmUHJpbnRmLCAicHJpbnRmIiwgMSwgMi4zKTsKCXByaW50X2FsbCgmSGFwcHlQcmludGVyLCAiSGVsbG8hIiwgMSwgMi4zKTsKCXJldHVybiAwOwp9Cg==