При включении отчетов о потенциальных различиях генератор кода сообщает о потенциальных различиях между поведением созданного кода и поведением кода MATLAB ®. Анализ и устранение потенциальных различий перед созданием автономного кода позволяет избежать ошибок и неправильных ответов в созданном коде.
Ниже приведены некоторые сообщения о потенциальных различиях:
In the generated code, the dimension to operate along is selected automatically, and might be different from MATLAB. Consider specifying the working dimension explicitly as a constant value.
Это ограничение применяется к функциям, принимающим рабочее измерение (измерение, по которому следует работать) в качестве входных данных. Если в MATLAB и в генерации кода рабочее измерение не предоставляется, функция выбирает его. В MATLAB функция выбирает первый размер, размер которого не равен 1. Для создания кода функция выбирает первое измерение, имеющее переменный размер или фиксированный размер, не равный 1. Если рабочее измерение имеет переменный размер и становится 1 во время выполнения, то рабочее измерение отличается от рабочего измерения в MATLAB. Поэтому при включенной проверке ошибок во время выполнения может возникнуть ошибка.
Например, предположим, что X является матрицей переменного размера с размерами 1x:3x:5. В созданном коде sum(X) ведет себя как sum(X,2). В MATLAB, sum(X) ведет себя как sum(X,2) если size(X,2) равно 1. В MATLAB, когда size(X,2) равно 1, sum(X) ведет себя как sum(X,3).
Чтобы избежать этой проблемы, укажите предполагаемое рабочее измерение явно как постоянное значение. Например, sum(X,2).
The generated code performs a general matrix multiplication. If a variable-size matrix operand becomes a scalar at run time, dimensions must still agree. There will not be an automatic switch to scalar multiplication.
Рассмотрим умножение A*B. Если генератору кода известно, что A является скалярным и B является матрицей, генератор кода производит код для умножения скалярной матрицы. Однако, если генератору кода известно, что A и B - матрицы переменного размера, они формируют код для общего умножения матрицы. Во время выполнения, если A оказывается скалярным, сгенерированный код не меняет своего поведения. Поэтому при включенной проверке ошибок во время выполнения может возникнуть ошибка несоответствия размеров.
For indexing a matrix with a matrix, matrix1(matrix2), the code generator assumed that the result would have the same size as matrix2. If matrix1 and matrix2 are vectors at run time, their orientations must match.
При индексировании матрица-матрица используется одна матрица для индексирования в другую матрицу. В MATLAB общее правило индексирования матрица-матрица состоит в том, что размер и ориентация результата соответствуют размеру и ориентации матрицы индекса. Например, если A и B - матрицы, size(A(B)) равняется size(B). Когда A и B являются векторами, MATLAB применяет специальное правило. Специальное правило векторно-векторной индексации заключается в том, что ориентация результата является ориентацией матрицы данных. Например, iA 1 на 5 и B равно 3 на 1, то A(B) 1 на 3.
Генератор кода применяет те же правила индексирования матрица-матрица, что и MATLAB. Если A и B являются матрицами переменного размера, для применения правил индексирования матрица-матрица, генератор кода предполагает, что size(A(B)) равняется size(B). Если, во время выполнения, A и B стать векторами и иметь разные ориентации, то предположение неверно. Поэтому при включенной проверке ошибок во время выполнения может возникнуть ошибка.
Чтобы избежать этой проблемы, используйте для индексирования оператор двоеточия. Например, предположим, что код намеренно переключается между векторами и регулярными матрицами во время выполнения. Можно выполнить явную проверку векторно-векторной индексации.
... if isvector(A) && isvector(B) C = A(:); D = C(B(:)); else D = A(B); end ...
Индексация в первой ветви указывает, что C и B(:) являются векторами времени компиляции. Поэтому генератор кода применяет правило индексации для индексации одного вектора другим вектором. Ориентация результата - это ориентация вектора данных, C.
For indexing a vector with a vector, vector1(vector2), the code generator assumed that the result would have the same orientation as vector1. If vector1 is a scalar at run time, the orientation of vector2 must match vector1.
В MATLAB специальным правилом для векторно-векторной индексации является то, что ориентация результата является ориентацией вектора данных. Например, если A 1 на 5 и B равно 3 на 1, то A(B) 1 на 3. Если, однако, вектор данных A является скаляром, то ориентация A(B) - ориентация вектора индекса B.
Генератор кода применяет те же правила векторно-векторной индексации, что и MATLAB. Если A и B являются векторами переменного размера, для применения правил индексирования генератор кода предполагает, что ориентация B соответствует ориентации A. Во время выполнения, если A скаляр и ориентация A и B не совпадают, тогда предположение неверно. Поэтому при включенной проверке ошибок во время выполнения может возникнуть ошибка во время выполнения.
Чтобы избежать этой проблемы, сделайте ориентации векторов совпадающими. Можно также индексировать отдельные элементы путем указания строки и столбца. Например, A(row, column).
The generated code assumes the loop index does not overflow on the last iteration of the loop. If the loop index overflows, an infinite loop can occur.
Предположим, что forЗначение -loop end равно или близко к максимальному или минимальному значению для типа данных индекса цикла. В сгенерированном коде последнее приращение или уменьшение индекса цикла может привести к переполнению переменной индекса. Переполнение индекса может привести к бесконечному циклу.
Когда проверки целостности памяти включены, если генератор кода обнаруживает, что индекс цикла может переполниться, он сообщает об ошибке. Проверка ошибок программного обеспечения является консервативной. Он может неправильно сообщить о переполнении индекса цикла. По умолчанию проверки целостности памяти включены для кода MEX и отключены для автономного кода C/C + +. Смотрите раздел Зачем тестировать функции MEX в MATLAB? (Кодер MATLAB) и Создание автономного кода C/C + +, который обнаруживает и сообщает об ошибках времени выполнения (кодер MATLAB).
Чтобы избежать переполнения индекса цикла, используйте обходные пути в этой таблице.
| Условия цикла, вызывающие потенциальное переполнение | Работа |
|---|---|
| Если цикл не должен охватывать весь диапазон целочисленного типа, перезаписайте цикл так, чтобы конечное значение не было равно максимальному значению целочисленного типа. Например, замените: N=intmax('int16')
for k=N-10:Nfor k=1:10 |
| Если цикл не должен охватывать весь диапазон целочисленного типа, перезаписайте цикл так, чтобы конечное значение не было равно минимальному значению целочисленного типа. Например, замените: N=intmin('int32')
for k=N+10:-1:Nfor k=10:-1:1 |
| Если цикл должен охватывать весь диапазон целочисленного типа, приведите тип начального, шагового и конечного значений цикла к большему целочисленному или двойному. Например, переписать: M= intmin('int16');
N= intmax('int16');
for k=M:N
% Loop body
endM= intmin('int16');
N= intmax('int16');
for k=int32(M):int32(N)
% Loop body
end |
| Перезаписать цикл таким образом, чтобы индекс цикла в последней итерации цикла был равен конечному значению. |