Question

I have defined an abstract base class measurementHandler < handle which defines the interface for all inherited classes. Two subclasses of this class are a < measurementHandler and b < measurementHandler.

I now have a function which should return a handle to an instance of either of these subclasses (depending on the function arguments) to it's caller. Consider something like this:

function returnValue = foobar(index)
    if index == 0
        returnValue = a();
    else
        returnValue = b();
    end
end

This function is enclosed in a MATLAB Function block in Simulink (2013a). When I try to simulate the system, I get the following error:

Type name mismatch (a ~= b).

Can anybody suggest a workaround for this which still allows me to take advantage of OOP & inheritance when using Simulink?

Était-ce utile?

La solution

This kind of pattern is possible in MATLAB Function block only if the "if" condition can be evaluated at compile time. The types cannot be switched at run-time. Can you make the index value a constant at the call site?

Autres conseils

The main reason to use this pattern was to iterate over a measurementHandler Array, while these all can have custom implementations. I was able to do this by unrolling the loop with the coder.unroll directive. Example for the enclosing MTALAB Function block:

function result = handleAllTheMeasurements(someInputs)
%#codegen
    for index = coder.unroll(1:2)
         measurementHandler = foobar(index);
         measurementHandler.handleMeasurement(someInputs);
    end
result = something;
end

This way, the for loop gets unrolled at compile time and the return type of the function is well defined for each separate call.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top