Main Content

코드 생성을 위한 스칼라 구조체 정의하기

대입을 통해 스칼라 구조체를 정의할 때의 제한 사항

변수를 기존 구조체에 대입하여 스칼라 구조체를 정의할 경우 대입 전에 변수를 정의할 필요가 없습니다. 하지만 해당 변수를 이미 정의했었다면 여기에 대입하는 구조체와 클래스, 크기 및 실수/복소수 여부가 동일해야 합니다. 다음 예에서 p는 미리 정의된 구조체 S와 동일한 속성을 갖는 구조체로 정의됩니다.

...
S = struct('a',  0, 'b',  1, 'c',  2);
p = S;
...

각 제어 흐름 경로에 일관된 순서로 필드 추가하기

구조체를 생성할 때 각 제어 흐름 경로에 동일한 순서로 필드를 추가해야 합니다. 예를 들어 다음 코드는 각 if 문의 절에 구조체 x의 필드를 서로 다른 순서로 추가하기 때문에 컴파일러 오류를 생성합니다.

function y = fcn(u) %#codegen
if u > 0
   x.a = 10;
   x.b = 20;
else
   x.b = 30;  % Generates an error (on variable x)
   x.a = 40;
end
y = x.a + x.b;

아래 예제에서 첫 번째 if 문의 절에서는 x.a 대입식이 x.b보다 먼저 오지만, else 절에서는 대입식 순서가 반대입니다. 올바로 수정된 코드는 다음과 같습니다.

function y = fcn(u) %#codegen
if u > 0
   x.a = 10;
   x.b = 20;
else
   x.a = 40;
   x.b = 30;
end
y = x.a + x.b;

필드를 처음 사용한 후 새 필드를 추가할 경우의 제한 사항

구조체에 다음 작업을 수행한 후에는 해당 구조체에 필드를 추가할 수 없습니다.

  • 구조체에서 읽어오기

  • 구조체형 배열의 요소 참조

  • 함수에 구조체 전달

예를 들어, 다음 코드를 살펴보겠습니다.

...
x.c = 10; % Defines structure and creates field c
y = x; % Reads from structure
x.d = 20; % Generates an error
...

아래 예제는 구조체 x에서 읽어온 후 새 필드 d를 추가하려고 시도하기 때문에 오류가 발생합니다.

이 제한 사항은 구조체 계층 전체에 확대 적용됩니다. 예를 들어 아래 예제처럼 구조체의 필드나 구조체의 중첩 구조체에 대해 작업을 수행한 후 이 구조체에 필드를 추가할 수 없습니다.

function y = fcn(u) %#codegen

x.c = 10;
y = x.c;
x.d = 20; % Generates an error

아래 예제는 구조체의 필드 c에서 읽어온 후 구조체 x에 새 필드 d를 추가하려고 시도하기 때문에 오류가 발생합니다.