Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //-------------------------
- //---------Общее-----------
- //-------------------------
- /* Енам для передачи типа сообщения (в функцию калькуляции и колбэка)
- Для функции в длл
- Table 1 - переданы данные для рассчета первой таблицы
- Table 2 - переданы данные для рассчета второй таблицы
- Error - не используется
- Для колбэк функции
- Table 1 - возвращены данные расчетов первой таблицы
- Table 2 - возвращены данные расчетов второй таблицы
- Error - ошибка вычислений
- */
- enum InfoType {
- Table1,
- Table2,
- Error
- };
- // Структура для передачи цвета
- struct Color {
- int text;
- int background;
- };
- const Color my_color = { 13, 14 }; // мой цвет (от оракула)
- //-------------------------
- //----------DLL------------
- //-------------------------
- /*
- То, как нужно реализовывать функции колбэка, фнейм, калькулятор
- Первое - должно быть у всех одинаковое - обозначение функции колбэк. параметры именно такие! название ОБЯЗАТЕЛЬНО меняем во избежание чихпуха!
- Далее просто объявление передаваемых функций фнейм и калькулятор
- */
- typedef void(*FCallback)(InfoType type, Color c, ...); // тип функции колбэка: название типа - FCallback, обязательные параметры - тип сообщения, цвет из длл, необязательные - параметры для вывода строки первой таблицы/второй таблицы/ошибки
- extern "C" __declspec(dllexport) const char* FName(); // возвращаем f*номер варианта* (у меня вариант 22 - я возвращаю "f22")
- extern "C" __declspec(dllexport) void calculator(InfoType type, FCallback romashov_i, ...); // основная функция для вычисления результата функций
- // Функция рекурентного вычисления заданной функции
- double family_func(double x, double acc, double a /* параметр a опциональный, если он у вас не используется, можно не писать */); // где family – ваша фамилия, func название вычисляемой функции (результат функции FName)
- // Эта функция просто нужна, меньше вопросов
- double myf_3530902_20001(double x, double acc, double a /* параметр a опциональный, если он у вас не используется, можно не писать */) {
- return family_func(x, acc, a);
- }
- // Библиотечное вычисление заданной функции
- double myf_math(double x, double a /* параметр a опциональный, если он у вас не используется, можно не писать */);
- // Парсинг динамического количества параметров
- // Парсинг параметров зависит от InfoType!!!
- extern "C" __declspec(dllexport) void calculator(InfoType info, FCallback romashov_i, ...) {
- if (info == Table1) { // если выводим таблицу 1, парсим аргументы x_start, x_end, delta_x, accuracy(точность), a(константа)
- va_list args; // создаем лист аргументов
- va_start(args, romashov_i); // запихиваем туда все аргументы, которые идут после функции колбэка - у меня она названа romashov_i (последний параметр, обозначенный конкретно, после него уже идет неопределенное число параметров; нам просто нужно указать параметр, после которого идет неопределенное количество аргументов для дальнейшего их парса)
- // параметры передаем именно в таком порядке!!!!! соответственно при вызове данной функции в клиентском коде, подаем аргументы в этом же порядке
- double x_start = va_arg(args, double); // считываем первый аргумент с типом дабл
- double x_end = va_arg(args, double); // и т.д.
- double delta_x = va_arg(args, double);
- double accuracy = va_arg(args, double);
- double a = va_arg(args, double); // эта строчка пишется только если параметр a действительно используется в вычислении. Если же нет, то можно не писать эту строчку
- va_end(args);
- int rowNumber = 1; // Счетчик номера текущей строки
- //...
- // Идет вычисление значений функции для всех x в [x_start;x_end] с шагом delta_x и точностью accuracy. При возможности вычисления (аргумент входит в область допустимых значений) вызываем функцию колбэк примерно таким образом:
- // romashov_i(Talbe1, my_color, rowNumber++, x, my_f_res, math_f_res, delta);
- // В случае ошибки, если функцию от данного аргумента невозможно вызываем функцию колбэка с примерно такими параметрами:
- // romashov_i(Error, my_color, rowNumber++, x);
- //...
- }
- else if (info == Table2) { // если выводим таблицу 2, парсим аргументы x_ideal, a
- va_list args;
- va_start(args, romashov_i);
- double x_ideal = va_arg(args, double);
- double a = va_arg(args, double); // эта строчка пишется только если параметр a действительно используется в вычислении. Если же нет, то можно не писать эту строчку
- va_end(args);
- int rowNumber = 1; // Счетчик номера текущей строки
- //...
- // Идет вычисление значений функции для x_ideal с точностью accuracy в [1e-1;1e-7] с шагом 1e-1. При возможности вычисления (аргумент входит в область допустимых значений) вызываем функцию колбэк примерно таким образом:
- // romashov_i(Talbe2, my_color, rowNumber++, accuracy, my_f_res, math_f_res, delta);
- // В случае ошибки, если функцию от данного аргумента невозможно вызываем функцию колбэка с примерно такими параметрами:
- // romashov_i(Error, my_color, rowNumber++, accuracy);
- //...
- }
- }
- //-------------------------
- //-------Консольное--------
- //-------------------------
- // Реализация функции колбэк
- void romashov_i(InfoType type, Color color, ...) {
- // Ставим цвет вывода человека из длл - color
- if (type == Table1) {
- //...
- // Получение аргументов по аналогии с длл, вывод строки
- //...
- }
- else if (type == Table2) {
- //...
- // Получение аргументов по аналогии с длл, вывод строки
- //...
- }
- else if (type == Error) {
- //...
- // Получение аргументов по аналогии с длл, вывод ошибки в строке
- // Строка с ошибкой должна выглядеть примерно так: |3|2|Error|Error|Error|
- // То есть первые 2 значения в таблице - номер строки и значение x (для первой таблицы) или accuracy (для второй таблицы). Остальное наполнение - на ваше усмотрение, но нужно сделать так, чтобы было понятно, что при вычислении произошла ошибка
- //...
- }
- // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
- }
- // Функция вывода шапки таблицы 1. func_name - название вашей функции ("sh", "f22" и т.д.)
- void printTable1Header(string func_name) {
- // Ставим свой цвет вывода!
- //...
- // Выводим шапку таблицы 1. Ее возможный вид: |#|x|sh_my(x)|sh_math(x)|delta|
- //...
- // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
- }
- // Аналогичный вывод шапки второй таблицы
- void printTable2Header(string func_name);
- // Функция вывода конца таблицы
- void printTableBottom() {
- // Ставим свой цвет вывода!
- //...
- // Выводим низ таблицы
- //...
- // Сбрасываем цвет вывода на дефолтный - который стоял в консоли до этого (не ваш!)
- }
- int main() {
- //...
- // Проверка на наличие запрашиваемой длл
- // Проверка на существование функции FName
- // Проверка на существование функции calculator
- // И дальше по заданию
- //...
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment