2016-08-17 3 views
0

Matlab Coder를 사용하여 C 코드로 변환하는 일부 코드가 Matlab로 작성되었습니다.Matlab Coder를 사용하여 C 문자 배열을 Matlab String으로 변환

생성 된 C 코드에서 호출하고자하는 C 함수를 작성했습니다. 이 작품, 지금까지 너무 좋아.

C 함수의 매개 변수 중 하나는 문자열을 출력하는 데 사용되는 char **입니다.

나는 불투명 한 char *을 만들고 coder.wref를 사용하여 char **를 얻음으로써 이것을 수행한다. 하지만 불투명 한 char *을 Matlab 문자열로 변환하여 함수에서 반환 할 수있는 방법은 무엇입니까?

코드는 이런 식입니다 :

function [status,out] = cfun() 
    buf = coder.opaque('char *', 'NULL'); 
    len = coder.opaque('size_t ', 'NULL'); 
    status = 0; 
    status = coder.ceval('_cfun', coder.wref(buf), coder.wref(len)); 

    out = buf; % How do I convert buf into a Matlab string here?? 
end 

_cfun은 버피에 일부 데이터를 작성하고 렌으로 길이를 기록합니다.

현재 작동하는 My solution은 Matlab에서 문자 배열을 수동으로 만들고 데이터로 전송하는 것입니다. 예 :

length = cast(len, 'int32'); 
out = char(zeros(1,length+1)); 
for i = 1:(length+1) 
    out(i) = cast(buf(i), 'int32'); 
end 

이렇게 생성 된 C 코드는 의미가없고 반복적으로 루프를 만들지 만 수동으로 작동하도록 업데이트 할 수 있습니다. 그러나 이것은 코드 생성을 다시 할 때마다 수동으로 업데이트해야합니다.

C 코드는 다음과 같습니다

i18 = length + 1L; 
copyfrom = (int)i18; 
i = 1; 
while (i <= copyfrom) { 
    source_str->data[0] = (signed char)(int)buf; 
    i = 2; 
} 

나는 일을 업데이트 할 수 있습니다 :

i18 = length + 1L; 
copyfrom = (int)i18; 
i = 1; 
while (i <= copyfrom) { 
    source_str->data[i-1] = (signed char)(int)(buf[i-1]); 
    i = i+1; 
} 

그래서, 매트랩 문자열에 문자 * + 길이를 변환하는 방법이? 아니면 제가 시도하고있는 일을하는 더 좋은 방법이 있습니까?

+0

호기심, 왜'길이가 + 1L;'에'L '이 있고 C 코드에 모든 캐스트가 있습니까? 'i18, length, copyfrom, i, source_str, buf'의 정의를 게시하여 whats가 진행되고 있는지 확인하는 것이 좋습니다. 그 포스트가 지금 서있을 때, 나는 그것이 불분명하다는 것을 발견한다. – chux

+0

이것은 Matlab에서 생성 된 코드입니다. L과 캐스팅은 Matlab의 결정입니다. L은 정수 오버플로를 피하고 확인하는 것입니다 (코드에서 일부 검사를 제거했습니다). for 루프가 올바르게 생성되지 않은 이유를 디버깅하기를 원하지 않는 한 정의는 중요하지 않습니다. 하지만 아래의 답변은 작동하므로 더 이상 시간을 할애하지 않을 것입니다. –

답변

1

그것은 조금 낭비,하지만 당신은 그것을로 MATLAB char 배열 및 memcpy 데이터를 할당 할 수 있습니다 :

mllen = cast(len,'int32'); % or int64 
mlbuf = blanks(mllen); % allocate character vector 
coder.ceval('memcpy',coder.wref(mlbuf),buf,len); 
use(mlbuf); 

당신은 할 수 있습니다 +1 또는 -1 여부 len 횟수에 따라 크기에 널 터미네이터와 원하는 경우.

_cfun으로 전화하기 전에 len을 어떻게 든 알 수 있다면 mlbuf_cfun으로 전달하고 사본을 잊어 버릴 수 있습니다.

코더에 관한 한 buf에 관한 한 생성 된 코드는 0으로 인덱싱되고 무한 루프를 생성합니다. coder.opaque입니다. MEX 파일을 생성하여 실행 한 경우 색인 범위를 벗어난 오류가 발생합니다.

+0

감사합니다. '_cfun' 호출 전에 'len'을 알아낼 수는 없지만, 이렇게 작동하므로 완벽합니다. –