Постановка задачи:
На входе блока в Simulink матрица размером G[3][4] и две константы, имеющие смысл номера строки (i) и столбца (j), соответственно. На выходе блока элемент матрицы G(i,j). Подавая различные константы в пределах размера матрицы, меняется на выходе G(i,j).
Суть проблемы:
Если смоделировать такое устройство с помощью блока MATLAB Function, прописав туда простейший m-код
Код
function C = fcn(i,j,G)
C = G(i,j);
end
C = G(i,j);
end
все будет работать как надо
Но если реализовать эту задачу с помощью С MEX S-function, прописав в .с
Код
#include "doubleIt.h"
void fcn (int i, int j, double G[3][4], double *C)
{
*C = G[i][j];
}
void fcn (int i, int j, double G[3][4], double *C)
{
*C = G[i][j];
}
И создав файл .mexw32 с помощью Legacy code tool, я получаю на выходе не тот элемент, номер которого я заказывал с помощью констант i и j, а другой элемент, принадлежащий матрице G.
Конечно, я учитываю то, что нумерация в С идет с 0, а не с 1 , как в Матлабе.
Поясняющий рисунок, на котором сверху эта задача решается в MATLAB Function, а снизу в С MEX S-function. Матрица одна и там и там, разумеется.

Задавая различные i и j получаю следующие результаты на выходе С MEX S-function
i j G(i,j)
[0] [0] 1
[1] [0] 6
[2] [0] 11
[3] [0] 6
[0] [1] 5
[0] [2] 9
[0] [3] 2
[0] [4] 6
[0] [5] 10
Что интересно: Если менять только номер j-ого элемента, а i=0, то выпадают числа матрицы последовтаельно перебирая мтарицу сверху вниз и слева направо. Даже при условии, что в моей мтарице j<4, можно ввести j>4 и получить число на выходе.
Возможно что-то в самом файле S-функции, который я компилирую не так. Есть опасения по-поводу указателей.
Код
static void mdlOutputs(SimStruct *S, int_T tid)
{
/*
* Get access to Parameter/Input/Output/DWork/size information
*/
int16_T *u1 = (int16_T *) ssGetInputPortSignal(S, 0);
int16_T *u2 = (int16_T *) ssGetInputPortSignal(S, 1);
real_T *u3 = (real_T *) ssGetInputPortSignal(S, 2);
real_T *y1 = (real_T *) ssGetOutputPortSignal(S, 0);
/*
* Call the legacy code function
*/
fcn ( *u1, *u2, u3, y1);
}
{
/*
* Get access to Parameter/Input/Output/DWork/size information
*/
int16_T *u1 = (int16_T *) ssGetInputPortSignal(S, 0);
int16_T *u2 = (int16_T *) ssGetInputPortSignal(S, 1);
real_T *u3 = (real_T *) ssGetInputPortSignal(S, 2);
real_T *y1 = (real_T *) ssGetOutputPortSignal(S, 0);
/*
* Call the legacy code function
*/
fcn ( *u1, *u2, u3, y1);
}
Кто разбирается,скажите,пожалуйста,в чем может быть дело.