Неправильное количество входных или выходных аргументов Scilab API
Программа выдает ошибку "Wrong number of input or output arguments: 3 inputs and 1 output expected.". Перепробовал уже много вариантов, но не понимаю в каких параметрах именно проблема. Подскажите, пожалуйста.
Код программы:
#include "api_scilab.h"
#include "Scierror.h"
#include "BOOL.h"
#include "localization.h"
#include <math.h>
static const char fname[] = "transcendental_solver";
double f(double x) {
return sin(x) - pow(x, 2);
}
double bisection(double a, double b, double tol) {
double c;
while ((b - a) / 2.0 > tol) {
c = (a + b) / 2.0;
if (f(c) == 0.0)
return c;
else if (f(c) * f(a) < 0)
b = c;
else
a = c;
}
return (a + b) / 2.0;
}
int transcendental_solver(scilabEnv env, int nin, scilabVar* in, int nopt, scilabOpt* opt, int nout, scilabVar* out) {
double a, b, tol, root;
/* Проверяем количество входных и выходных аргументов */
if (nin != 3 || nout != 1) {
Scierror(77, _("%s: Wrong number of input or output arguments: 3 inputs and 1 output expected.\n"), fname);
return 1;
}
/* Проверяем типы входных аргументов */
if (scilab_isDouble(env, in[0]) == 0 || scilab_isDouble(env, in[1]) == 0 || scilab_isDouble(env, in[2]) == 0) {
Scierror(999, _("%s: Wrong type for input argument. Double expected.\n"), fname);
return 1;
}
/* Получаем данные из входных аргументов */
scilab_getDouble(env, in[0], &a);
scilab_getDouble(env, in[1], &b);
scilab_getDouble(env, in[2], &tol);
/* Вычисляем корень методом бисекции */
root = bisection(a, b, tol);
/* Создаем выходной аргумент и копируем результат */
out[0] = scilab_createDoubleMatrix2d(env, 1, 1, 0);
double* rootPtr = NULL;
scilab_getDoubleArray(env, out[0], &rootPtr);
rootPtr[0] = root;
return 0;
}
Компиляция:
files = ["transcendental_solver.c"]; // Список ваших исходных файлов
ilib_build('build_lib', ['transcendental_solver', 'transcendental_solver'], files, []);
exec loader.sce;
// Задаем начальные значения для метода бисекции
a = 0;
b = 2;
tolerance = 1e-6;
// Вызываем функцию для решения трансцендентного уравнения
root = transcendental_solver(a, b, tolerance);
// Выводим результат
disp(root);
Вывод Scilab:
Запуск программы:
загрузка исходного окружения
-->files = ["transcendental_solver.c"]; // Список ваших исходных файлов
-->ilib_build('build_lib', ['transcendental_solver', 'transcendental_solver'], files, []);
Формируется файл шлюза
Формируется файл загрузки
Формируется Makefile
ilib_gen_Make: Копирование файлов компиляции (Makefile*, libtool...) в TMPDIR
ilib_gen_Make: Копирование libbuild_lib.cpp в TMPDIR
ilib_gen_Make: Копирование libbuild_lib.h в TMPDIR
ilib_gen_Make: Копирование libbuild_lib.hxx в TMPDIR
ilib_gen_Make: Копирование transcendental_solver.c в TMPDIR
ilib_gen_Make: Изменение Makefile в TMPDIR.
Выполняется Makefile
Формируется файл очистки
-->exec loader.sce;
Разделяемый архив загружен.
Компоновка завершена.
-->a = 0;
-->b = 0;
-->tolerance = 1e-6;
-->root = transcendental_solver(a, b, tolerance);
transcendental_solver: Wrong number of input or output arguments: 3 inputs and 1 output expected.