Ruby Extension - параметры по умолчанию - C (СИ)

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

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

Приветствую! Насколько я помню, в С в методах нельзя сделать параметры по умолчанию. Я же пытаюсь перенести ruby код в С(Ruby Extension) и оригинальный метод имеет два необязательных параметра. Подскажите, что можно сделать? Пример:
#include "ruby.h"
VALUE Test = Qnil;
VALUE method_just_test();
void Init_test(){
  Test = rb_define_module("Test");
  rb_define_method(Test, "just_test", method_just_test, 7);
}
VALUE method_just_test(VALUE self, VALUE id, VALUE icon, VALUE text, VALUE name, VALUE state, VALUE trigger, VALUE trig_par){
  printf("ЙА ТЕКСТ!\n");
}
То же, но в ruby:
module Test
  def just_test(id, icon, text, name, state, trigger=nil, trig_par=nil)
    #Что-то делает
  end
end

Решение задачи: «Ruby Extension - параметры по умолчанию»

textual
Листинг программы
#include <stdio.h>
 
/*
  emulating function with default arguments
 
  int f(float x, double y,         int z,              char k);
          (any)     (any)   (default = 12)      (default = 'k')
*/
 
typedef struct
{
  float x;
  double y;
  int z;
  char k;
} TFunctionArgs;
 
int BaseFunction(float x, double y, int z, char k)
{
  printf("args(x,y,z,k) : %.2f %.4f %d %c\n", x, y, z, k);
 
  return z;
}
 
int WrapperFunction(TFunctionArgs args)
{
  float exportX = args.x;
  double exportY = args.y;
  int exportZ = args.z ? args.z : 12;
  char exportK = args.k ? args.k : 'k';
 
  return BaseFunction(exportX, exportY, exportZ, exportK);
}
 
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
 
#define f(...) WrapperFunction((TFunctionArgs){__VA_ARGS__})
 
int main(void)
{
  f(2, 4);
  f(8, 15, 2, 'z');
  return 0;
}

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

В этом коде:

  1. Создается структура TFunctionArgs, которая содержит четыре поля: x, y, z и k. Типы данных этих полей: float, double, int и char соответственно.
  2. Определяется функция BaseFunction, которая принимает четыре аргумента типа float, double, int и char. Внутри функции происходит вывод значений этих аргументов на консоль.
  3. Определяется функция WrapperFunction, которая принимает один аргумент типа TFunctionArgs. Внутри функции происходит приведение аргумента к типу float, double, int и char и передача этих значений в функцию BaseFunction.
  4. Используется директива препроцессора #pragma GCC diagnostic ignored-Wmissing-field-initializers``, которая игнорирует предупреждение компилятора о пропущенных инициализаторах.
  5. Определяется макрос f(...), который расширяется в вызов функции WrapperFunction с аргументом, сформированным из переменных, переданных в макрос через запятую.
  6. В функции main происходит вызов макроса f с двумя аргументами (2 и 4) и с тремя аргументами (8, 15 и 2) и ('z').
  7. Возвращаемое значение функции BaseFunction в обоих случаях равно 2.

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


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

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

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