Я использую функцию (mxGetData()
), которая возвращает указатель void*
, и в зависимости от переменной i_type
Мне нужно обработать возвращенный массив как массив целых чисел, поплавков, двойников и т. Д. Прямо сейчас У меня есть большой переключатель для работы с каждым типом, но есть ли способ избежать переключения? Обратите внимание, что указатели uchr_dt
, int_dt
, flt_dt
и т. Д. Имеют разные типы.Попытка избежать переключения
switch(i_type){
case mxUINT8_CLASS:
uchr_dt = (unsigned char*)mxGetData(var);
break;
case mxINT32_CLASS:
int_dt = (int*)mxGetData(var);
break;
case mxUINT32_CLASS:
uint_dt = (unsigned int*)mxGetData(var);
break;
case mxSINGLE_CLASS:
flt_dt = (float*)mxGetData(var);
break;
case mxDOUBLE_CLASS:
dbl_dt = (double*)mxGetData(var);
break;
default:
Fatal_Error("Input type not supported.\n");
}
--- UPDATE ---
После этого мне просто нужно перебрать возвращенного массива. Мне понравилась идея иметь один void *p
, чтобы избежать переключения выше, но как я могу убедиться, что, когда я перебираю p
, указатель перемещается на нужную сумму? Если компилятор видит p
как double*
, но на самом деле это «char *» (например), он выйдет за пределы диапазона.
double myCopy[nData];
for(i=0; i<nData; i++)
myCopy[i] = (double) p[i];
Там всегда 'если (i_type == mxUINT8_CLASS) {...} еще если (...)'. –
Вам не нужно вводить пустоту * (hello lundin), которая может сделать более «общее» решение возможным.Вы также можете просто назначить * все * указатели (если вам не нужны их старые значения). Для нескольких назначений, которые все еще могут быть быстрее, чем условный переход, для коммутатора. Если i_type - это перечисление с небольшими значениями, вы можете хранить массив адресов указателей void (все '* _dt', cast to' void * '), которые индексируются перечислением типа и просто присваиваются правильному. Или держите массив указателей функций на однострочные, которые выполняют назначение. –
Вам нужно иметь два из этих массивов, доступных одновременно? Если нет, может также сохранить живой в общей форме и только специализировать его как-и-когда (т. Е. Внутри блока, где он используется). – Leushenko