Mathew
Mathew

Reputation: 1460

matlab coder requirements stricter than normal matlab

Consider the following matlab program:

function results = prog()
    opts.x = 1;
    if ~isfield(opts, 'y'); opts.y = 1; end
    'asdf'
return

I am able to run this program successfully in matlab however when I try to use coder to convert it to C I get the following error:

This structure does not have a field 'y'; new fields cannot be added when structure has been read or used.

I would like to know if there is a way to convert to C using coder (or possible some other tool) that does not use a stricter compiler as seems to be the case with coder as I am using it. I am using matlab version R2019B.

Please note that this is just one of many examples of how coder is using a stricter compiler than normal matlab. I have a fairly large program that I would like to convert to C and I don't want to have to go through each error (there are over 100).

Upvotes: 1

Views: 150

Answers (1)

David Fink
David Fink

Reputation: 126

Like Daniel mentioned, optional fields of structs don't exist in C, which is why MATLAB Coder errors on that code.

To make this code work with MATLAB Coder, opts could always have property y, but make it variable-sized and initialized to empty:

function results = prog()
    opts.x = 1;
    opts.y = [];
    coder.varsize('opts.y');
    if isempty(opts.y); opts.y = 1; end
    'asdf'
end

Or you could create another options variable optsWithY that will have field y, even if opts doesn't:

function results = prog()
    opts.x = 1;
    optsWithY = opts;
    if ~isfield(opts, 'y'); optsWithY.y = 1; end
    'asdf'
end

This could even be moved into a helper function and assigned back to opts:

function results = prog()
    opts.x = 1;
    opts = addOpt(opts, 'y', 1);
    'asdf'
end

function newOpts = addOpt(opts, field, defaultValue)
    newOpts = opts;
    if ~isfield(opts, field)
        newOpts.(field) = defaultValue;
    end
end

The difference between this and the original code is partial assignment opts.y = ... vs complete assignment opts = ....

Or like Cris mentioned, MATLAB Compiler will be a lot closer to MATLAB (though you won't get C code)

Upvotes: 2

Related Questions