mxCreateNumericArray error: cannot convert from 'const size_t *' to 'const int *'

11 views (last 30 days)
I am trying to compile a piece of downloaded code using Matlab 2017a on Windows 10:
// memory for HOG features
int out[3];
out[0] = max(blocks[0]-2, 0);
out[1] = max(blocks[1]-2, 0);
out[2] = 27+4+1;
mxArray *mxfeat = mxCreateNumericArray(3, out, mxDOUBLE_CLASS, mxREAL);
double *feat = (double *)mxGetPr(mxfeat);
Matlab keeps reporting error:
>> compile
compiling features.cc
Building with 'Microsoft Visual C++ 2015 Professional'.
Error using mex
features.cc
E:\...\HOG\ihog-master\internal\features.cc(47): error C2440: 'initializing': cannot convert from
'const size_t *' to 'const int *'
E:\...\HOG\ihog-master\internal\features.cc(47): note: Types pointed to are unrelated; conversion
requires reinterpret_cast, C-style cast or function-style cast
E:\...\HOG\ihog-master\internal\features.cc(67): error C2664: 'mxArray
*mxCreateNumericArray_730(std::size_t,const size_t *,mxClassID,mxComplexity)': cannot convert argument 2 from 'int [3]' to 'const
size_t *'
E:\...\HOG\ihog-master\internal\features.cc(67): note: Types pointed to are unrelated; conversion
requires reinterpret_cast, C-style cast or function-style cast
Error in compile (line 5)
mex -O internal/features.cc -output internal/features
I have followed a previous post to change int to mwSize, but got the same shorter error:
>> compile
compiling features.cc
Building with 'Microsoft Visual C++ 2015 Professional'.
Error using mex
features.cc
E:\...\HOG\ihog-master\internal\features.cc(47): error C2440: 'initializing': cannot convert from
'const size_t *' to 'const int *'
E:\...\HOG\ihog-master\internal\features.cc(47): note: Types pointed to are unrelated; conversion
requires reinterpret_cast, C-style cast or function-style cast
Error in compile (line 5)
mex -O internal/features.cc -output internal/features
>>
I have tried every means to change the type, but with no luck. Could you please give me some help to work around this? Thanks a lot!
  1 Comment
Jan
Jan on 27 Feb 2018
@zzzhhh: "I have followed a previous post to change int to mwSize" does not explain clearly, what you have done. Please post the code.

Sign in to comment.

Accepted Answer

Jan
Jan on 27 Feb 2018
Edited: Jan on 27 Feb 2018
According to the documentation, mxCreateNumericArray requires a const mwSize array as input for the dimensions:
mxArray *mxCreateNumericArray(mwSize ndim, const mwSize *dims,
mxClassID classid, mxComplexity ComplexFlag);
const mwSize out[3] = {max(blocks[0]-2, 0),
max(blocks[1]-2, 0),
27+4+1};
mxArray *mxfeat = mxCreateNumericArray(3, out, mxDOUBLE_CLASS, mxREAL);
UNTESTED I do not have access to a compiler currently.
  5 Comments
Jan
Jan on 28 Feb 2018
qzzzhhh: You are welcome. We had several equivalent threads here, where assumptions about int, mwSize and size_t let the compilation fail or even worse the code crash. In some cases I was convinced also, that an int should work, but after using mwSize and size_t the code worked reliably.

Sign in to comment.

More Answers (0)

Categories

Find more on MATLAB Compiler in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!