Main Content

C/C++ 코드 생성 시 변수 정의에 대한 모범 사례

코드 생성에 사용되는 MATLAB® 코드는 특정 제한 사항을 준수해야 합니다. 변수를 정의할 때 다음 모범 사례에 따라 변수 사용을 최적화하고 코드에서 오류가 발생하지 않도록 하십시오.

변수를 사용하기 전에 명시적으로 정의하기

C/C++ 코드를 생성하려면 변수 값과 속성을 작업에 사용하거나 출력값으로 반환하기 전에 먼저 이들을 명시적으로 정의해야 합니다. 그렇게 함으로써 변수를 정의하지 않을 때 발생하는 오류를 방지할 수 있습니다.

참고

정의한 변수는 기본적으로 지역 변수가 되며 함수 호출 간에 유지되지 않습니다. 변수를 영속 변수로 만들려면 persistent 함수를 사용하십시오.

새 변수를 초기화하면 생성 코드에 복사본이 중복되어 생성될 수도 있습니다. 자세한 내용은 Eliminate Redundant Copies of Variables in Generated Code 항목을 참조하십시오.

모든 실행 경로에서 변수 정의하기

모든 실행 경로(예: if 문으로 지정된 실행 경로)에서 변수를 정의해야 합니다. 변수를 함수에 대한 입력값으로 사용하기 전에 변수를 정의하는 다음 MATLAB 코드를 살펴 보겠습니다.

...
if c <= 0
  x = 11;
end
% Later in your code ...
if c > 0
% Use x in the function foo
  foo(x);
end
...
코드는 c <= 0인 경우에만 x에 값을 할당하고 c > 0인 경우에만 x를 사용합니다. c 값에 따라 이 코드는 MATLAB에서 오류 없이 작동할 수 있습니다. 그러나 이 MATLAB 코드에서 C/C++ 코드를 생성하려고 하면 코드 생성이 실패합니다. c > 0인 경우, 코드 생성기가 실행 경로에서 x가 정의되지 않았음을 감지하기 때문입니다.

이 코드를 코드 생성에 적합하게 만들려면 먼저 x를 정의한 후 사용합니다.

x = 0;
...
if c <= 0
  x = 11;
end
% Later in your code ...
if c > 0
% Use x in the function foo
  foo(x);
end
...

모든 구조체 필드 정의하기

모든 실행 경로에서 각 구조체 필드도 정의해야 합니다. 다음 MATLAB 코드를 살펴보겠습니다.

...
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Use s in the function foo
foo(s);
...
if 문의 첫 번째 부분은 필드 a만 사용하고 else 문은 필드 ab를 사용합니다. 이 코드는 MATLAB에서 작동하지만 C/C++ 코드 생성 중에 컴파일 오류를 생성합니다. 이 오류를 방지하려면 구조체를 사용한 후에 이 구조체에 필드를 추가하지 마십시오. 자세한 내용은 코드 생성을 위한 구조체 정의 항목을 참조하십시오.

이 코드를 C/C++ 코드 생성에 적합하게 만들려면 먼저 s를 정의한 후 사용합니다.

...
% Define fields in structure s
s = struct("a", 0, "b", 0);
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Use s in the function foo
foo(s);
...

변수 속성 재할당 시 주의할 점

초기 할당 후 클래스, 크기 또는 실수/복소수 여부 값을 다르게 하여 특정 변수를 재할당할 수 있습니다. 변수 속성 재할당 항목을 참조하십시오. 그러나 초기 할당 후에 변수 유형을 재할당할 경우 코드 생성 중에 코드가 종종 컴파일 오류를 반환합니다. 일반적으로, 각 변수에 특정한 클래스, 크기, 유형, 실수/복소수 여부를 할당하십시오.

변수의 숫자 데이터형 정의하기

double형은 MATLAB의 디폴트 숫자 데이터형입니다. 다른 데이터형의 변수를 정의하려면 올바른 접두사 또는 연산자를 사용하여 정의에서 데이터형을 명시적으로 정의해야 합니다. 코드에서 다른 데이터형에 할당된 변수를 사용하면 유형 불일치 오류가 발생할 수 있으므로 사용 중인 데이터형에 주의하십시오.

예를 들어, 다음 코드는 변수 x를 double형으로 정의하고 y를 8비트 정수로 정의합니다.

x = 15;
y = uint8(x);

MATLAB에서 지원되는 유형에 대한 자세한 내용은 숫자형 항목을 참조하십시오.

인덱싱된 변수를 할당하기 전에 행렬 정의하기

현재 크기를 초과하는 요소를 작성하여 변수 크기를 증가시키면, end + 1 인덱싱을 사용하거나 변수를 먼저 가변 크기로 정의하지 않는 한 컴파일타임 오류나 런타임 오류가 발생합니다. Generate Code for Growing Arrays and Cell Arrays with end + 1 Indexing 항목 및 Define Variable-Size Data for Code Generation 항목을 참조하십시오. end + 1 인덱싱을 사용하거나 배열을 가변 크기로 정의하지 않고 크기 관련 오류를 방지하려면 배열 요소에 값을 할당하기 전에 배열의 최대 크기를 정의하십시오.

예를 들어, 다음 할당은 코드 생성 시 오류가 발생합니다.

g = zeros(3,3);
g(5,2) = 14.6;

행렬 g를 충분한 크기로 정의하여 이 코드를 수정합니다.

g = zeros(5,5);
g(5,2) = 14.6;

행렬 인덱싱에 대한 자세한 내용은 Incompatibility with MATLAB in Matrix Indexing Operations for Code Generation 항목을 참조하십시오.

고정 크기 벡터를 사용하여 배열 인덱싱하기

코드 생성 시 가변 크기 배열이 지원되지만 가변 크기 배열에는 추가 메모리가 필요하므로 이로 인해 성능이 저하될 수 있습니다. 가능한 경우 상수 값 벡터를 사용하여 배열을 인덱싱하십시오. 예를 들면 다음과 같습니다.

...
% extract 7 elements from A using a constant-value vector
B = A(1:7);
...
이 예제에서 코드 생성기는 B가 고정 크기임을 인식합니다.

colon 연산자와 변수 값을 사용하여 배열의 요소를 참조하는 경우 코드 생성기는 배열이 고정 크기인지 아니면 가변 크기인지를 항상 올바르게 판단하지는 못합니다. 예를 들어, 다음 배열은 i 값에 관계없이 둘 다 고정 크기입니다.

...
% extract 7 elements from A using a fixed-size vector
B = A(i-1:i+5);
C = A(-1+2*i:5+2*i);
...
코드 생성 시점에 i 값이 알려져 있으면 코드 생성기는 BC를 모두 고정 크기 배열로 인식합니다. 그러나 코드 생성 시점에 i 값이 알려져 있지 않으면 코드 생성기는 B를 고정 크기로 인식하고 C를 가변 크기로 정의합니다. 결과적으로, 사용자는 크기가 변경되지 않으니까 배열이 고정 크기로 정의된다고 믿겠지만 코드 생성기는 배열을 가변 크기로 해석해서 가변 크기로 지정합니다.

이러한 경우 코드 생성기가 정의된 배열의 크기가 변경되지 않음을 인식하도록 MATLAB 코드를 재작성할 수 있습니다. 예를 들어, 위의 C에 대한 정의를 재작성하여 코드 생성 시점에는 알 수 없는 변수(i)와 관련된 수학 연산으로부터 배열 인덱싱 표현식을 추출할 수 있습니다.

...
% extract 7 elements from A using a fixed-size vector
C = A(2*i+(-1:5));
...
이렇게 재작성하면 코드 생성기는 C를 고정 크기 배열로 인식합니다.

몇몇 다른 코드 패턴의 경우, 배열 크기에 영향을 미치는 변수가 배열 인덱스에 포함되어 있지만 컴파일 시점에 이러한 변수를 알게 됩니다. 이 경우 추출되는 배열은 실제로 고정 크기이지만 코드 생성기가 이를 식별하지 못하고 가변 크기로 처리할 수 있습니다. 때로는 그러한 코드도 재작성하여 고정 크기 배열을 생성하게 할 수 있습니다. 다음 예제에서 배열 D_varSizeD_fixSize는 동일합니다. 그러나 코드 생성기는 D_varSize는 가변 크기로 정의하고 D_fixSize는 고정 크기로 정의합니다.

...
width = 25;              
D_varSize = A(i-width:i+width);  % D_varSize is variable-size if i is unknown at compile time 
D_fixSize = A(i+(-width:width)); % D_fixSize is fixed-size whether or not i is unknown at compile time
...

참고 항목

| |

관련 항목