Sc3ric

Лаба9, стандартификация и требования

Apr 15th, 2023 (edited)
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.19 KB | None | 0 0
  1. //-------------------------
  2. //---------Общее-----------
  3. //-------------------------
  4.  
  5. /* Енам для передачи типа сообщения (в функцию калькуляции и колбэка)
  6. Для функции в длл
  7. Table 1 - переданы данные для рассчета первой таблицы
  8. Table 2 - переданы данные для рассчета второй таблицы
  9. Error - не используется
  10.  
  11. Для колбэк функции
  12. Table 1 - возвращены данные расчетов первой таблицы
  13. Table 2 - возвращены данные расчетов второй таблицы
  14. Error - ошибка вычислений
  15. */
  16. enum InfoType {
  17.     Table1,
  18.     Table2,
  19.     Error
  20. };
  21.  
  22. // Структура для передачи цвета
  23. struct Color {
  24.     int text;
  25.     int background;
  26. };
  27.  
  28. const Color my_color = { 13, 14 }; // мой цвет (от оракула)
  29.  
  30.  
  31. //-------------------------
  32. //----------DLL------------
  33. //-------------------------
  34.  
  35. /*
  36. То, как нужно реализовывать функции колбэка, фнейм, калькулятор
  37. Первое - должно быть у всех одинаковое - обозначение функции колбэк. параметры именно такие! название ОБЯЗАТЕЛЬНО меняем во избежание чихпуха!
  38. Далее просто объявление передаваемых функций фнейм и калькулятор
  39. */
  40. typedef void(*FCallback)(InfoType type, Color c, ...); // тип функции колбэка: название типа - FCallback, обязательные параметры - тип сообщения, цвет из длл, необязательные - параметры для вывода строки первой таблицы/второй таблицы/ошибки
  41.  
  42. extern "C" __declspec(dllexport) const char* FName(); // возвращаем f*номер варианта* (у меня вариант 22 - я возвращаю "f22")
  43. extern "C" __declspec(dllexport) void calculator(InfoType type, FCallback romashov_i, ...); // основная функция для вычисления результата функций
  44.  
  45. // Функция рекурентного вычисления заданной функции
  46. double family_func(double x, double acc, double a /* параметр a опциональный, если он у вас не используется, можно не писать */); // где family – ваша фамилия, func название вычисляемой функции (результат функции FName)
  47.  
  48. // Эта функция просто нужна, меньше вопросов
  49. double myf_3530902_20001(double x, double acc, double a /* параметр a опциональный, если он у вас не используется, можно не писать */) {
  50.     return family_func(x, acc, a);
  51. }
  52.  
  53. // Библиотечное вычисление заданной функции
  54. double myf_math(double x, double a /* параметр a опциональный, если он у вас не используется, можно не писать */);
  55.  
  56. // Парсинг динамического количества параметров
  57. // Парсинг параметров зависит от InfoType!!!
  58. extern "C" __declspec(dllexport) void calculator(InfoType info, FCallback romashov_i, ...) {
  59.     if (info == Table1) { // если выводим таблицу 1, парсим аргументы x_start, x_end, delta_x, accuracy(точность), a(константа)
  60.         va_list args; // создаем лист аргументов
  61.         va_start(args, romashov_i); // запихиваем туда все аргументы, которые идут после функции колбэка - у меня она названа romashov_i (последний параметр, обозначенный конкретно, после него уже идет неопределенное число параметров; нам просто нужно указать параметр, после которого идет неопределенное количество аргументов для дальнейшего их парса)
  62.  
  63.         // параметры передаем именно в таком порядке!!!!! соответственно при вызове данной функции в клиентском коде, подаем аргументы в этом же порядке
  64.         double x_start = va_arg(args, double); // считываем первый аргумент с типом дабл
  65.         double x_end = va_arg(args, double); // и т.д.
  66.         double delta_x = va_arg(args, double);
  67.         double accuracy = va_arg(args, double);
  68.         double a = va_arg(args, double); // эта строчка пишется только если параметр a действительно используется в вычислении. Если же нет, то можно не писать эту строчку
  69.         va_end(args);
  70.         int rowNumber = 1; // Счетчик номера текущей строки
  71.  
  72.         //...
  73.         // Идет вычисление значений функции для всех x в [x_start;x_end] с шагом delta_x и точностью accuracy. При возможности вычисления (аргумент входит в область допустимых значений) вызываем функцию колбэк примерно таким образом:
  74.         // romashov_i(Talbe1, my_color, rowNumber++, x, my_f_res, math_f_res, delta);
  75.         // В случае ошибки, если функцию от данного аргумента невозможно вызываем функцию колбэка с примерно такими параметрами:
  76.         // romashov_i(Error, my_color, rowNumber++, x);
  77.         //...
  78.     }
  79.     else if (info == Table2) { // если выводим таблицу 2, парсим аргументы x_ideal, a
  80.         va_list args;
  81.         va_start(args, romashov_i);
  82.         double x_ideal = va_arg(args, double);
  83.         double a = va_arg(args, double); // эта строчка пишется только если параметр a действительно используется в вычислении. Если же нет, то можно не писать эту строчку
  84.         va_end(args);
  85.         int rowNumber = 1; // Счетчик номера текущей строки
  86.  
  87.         //...
  88.         // Идет вычисление значений функции для x_ideal с точностью accuracy в [1e-1;1e-7] с шагом 1e-1. При возможности вычисления (аргумент входит в область допустимых значений) вызываем функцию колбэк примерно таким образом:
  89.         // romashov_i(Talbe2, my_color, rowNumber++, accuracy, my_f_res, math_f_res, delta);
  90.         // В случае ошибки, если функцию от данного аргумента невозможно вызываем функцию колбэка с примерно такими параметрами:
  91.         // romashov_i(Error, my_color, rowNumber++, accuracy);
  92.         //...
  93.     }
  94. }
  95.  
  96.  
  97. //-------------------------
  98. //-------Консольное--------
  99. //-------------------------
  100.  
  101. // Реализация функции колбэк
  102. void romashov_i(InfoType type, Color color, ...) {
  103.     // Ставим цвет вывода человека из длл - color
  104.     if (type == Table1) {
  105.         //...
  106.         // Получение аргументов по аналогии с длл, вывод строки
  107.         //...
  108.     }
  109.     else if (type == Table2) {
  110.         //...
  111.         // Получение аргументов по аналогии с длл, вывод строки
  112.         //...
  113.     }
  114.     else if (type == Error) {
  115.         //...
  116.         // Получение аргументов по аналогии с длл, вывод ошибки в строке
  117.         // Строка с ошибкой должна выглядеть примерно так: |3|2|Error|Error|Error|
  118.         // То есть первые 2 значения в таблице - номер строки и значение x (для первой таблицы) или accuracy (для второй таблицы). Остальное наполнение - на ваше усмотрение, но нужно сделать так, чтобы было понятно, что при вычислении произошла ошибка
  119.         //...
  120.     }
  121.     // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
  122. }
  123.  
  124. // Функция вывода шапки таблицы 1. func_name - название вашей функции ("sh", "f22" и т.д.)
  125. void printTable1Header(string func_name) {
  126.     // Ставим свой цвет вывода!
  127.  
  128.     //...
  129.     // Выводим шапку таблицы 1. Ее возможный вид: |#|x|sh_my(x)|sh_math(x)|delta|
  130.     //...
  131.  
  132.     // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
  133. }
  134.  
  135. // Аналогичный вывод шапки второй таблицы
  136. void printTable2Header(string func_name);
  137.  
  138. // Функция вывода конца таблицы
  139. void printTableBottom() {
  140.     // Ставим свой цвет вывода!
  141.    
  142.     //...
  143.     // Выводим низ таблицы
  144.     //...
  145.  
  146.     // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
  147. }
  148.  
  149. int main() {
  150.     //...
  151.     // Проверка на наличие запрашиваемой длл
  152.     // Проверка на существование функции FName
  153.     // Проверка на существование функции calculator
  154.     // И дальше по заданию
  155.     //...
  156.  
  157.     return 0;
  158. }
  159.  
Advertisement
Add Comment
Please, Sign In to add comment