Вызов функции с определенным контекстом - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Я ищу способ сообщить функции контекст вызова любым возможным способом, используя исключительно ANSI C. Я поясню что имею ввиду: Представим что, у нас имеется некоторая структура, которая помимо всего прочего хранит указатели на функции, мы можем менять эти значения динамически, но к сожалению не имеем возможности внутри функции получить доступ к полям структуры. Один из вариантов, который бы так же подошел это реализовать лямбда функции или функции с дефолтными значениями. Я знаю, что их нет в Си. Я ищу способ с эмитировать такое поведение. Еще один из вариантов попытаться создать врапер для

некоторого класса

функций. Вероятно можно многого добиться используя макросы, но чет то я уже устал играть с ними в этот пазл поэтому прошу вашего совета. Понимаю вопрос обширный, но меня заинтересуют любые ваши идеи по существу.

Решение задачи: «Вызов функции с определенным контекстом»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
/* imitation of class TAbstractContainer -- START */
 
typedef struct
{
  int (*Push)(int data);
  int element;
} TAbstractContainer;
 
int PushToAbstractContainer(int data)
{
  /* some specific code here */
  printf("In PushToAbstractContainer, data = %d\n", data);
  return 0;
}
 
TAbstractContainer* CreateAbstractContainer(void)
{
  TAbstractContainer *temp = malloc(sizeof(*temp));
  temp->Push = PushToAbstractContainer;
  return temp;
}
 
/* imitation of class TAbstractContainer -- END */
 
 
 
 
/* imitation of class TSpecializedContainer -- START */
 
typedef struct
{
  int (*Push)(int data);
  int element;
  struct TSpecializedContainer* next;
} TSpecializedContainer;
 
int PushToSpecializedContainer(int data)
{
  /* some code here */
  printf("In PushToSpecializedContainer, data = %d\n", data);
  return 3;
}
 
TSpecializedContainer* CreateSpecializedContainer(void)
{
  TSpecializedContainer* temp = malloc(sizeof(*temp));
  temp->element = 2;
  temp->Push = PushToSpecializedContainer;
  temp->next = NULL;
  return temp;
}
/* imitation of class TSpecializedContainer -- START */
 
int main(void)
{
  TAbstractContainer* ac = CreateAbstractContainer();
  TSpecializedContainer* sc = CreateSpecializedContainer();
 
  ac->Push(13);
 
  sc->Push(444);
 
  return 0;
}

Объяснение кода листинга программы

  1. Код начинается с заголовка файла и импортирования необходимых библиотек.
  2. Определяется структура TAbstractContainer с указанием метода Push и переменной element.
  3. Определяется функция PushToAbstractContainer, которая имитирует метод Push для TAbstractContainer.
  4. Определяется функция CreateAbstractContainer, которая создает экземпляр TAbstractContainer и возвращает указатель на него.
  5. Определяется структура TSpecializedContainer, которая расширяет TAbstractContainer и добавляет переменную next для хранения указателя на следующий элемент в связанном списке.
  6. Определяется функция PushToSpecializedContainer, которая имитирует метод Push для TSpecializedContainer.
  7. Определяется функция CreateSpecializedContainer, которая создает экземпляр TSpecializedContainer и возвращает указатель на него.
  8. В функции main создаются экземпляры TAbstractContainer и TSpecializedContainer.
  9. Метод Push вызывается для TAbstractContainer с аргументом 13.
  10. Метод Push вызывается для TSpecializedContainer с аргументом 444.
  11. Функция main возвращает 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы