2015-11-21 90 views
0

我需要使用y=coder.ceval()從matlab調用c函數,並從該函數返回一個字符串。但是coder.ceval()函數只允許我返回一個標量值。但字符串是一個char數組,因此不能被返回。 matlab函數中的代碼如下所示:將數組返回到coder.ceval

function y = abc(param) 

y = ''; 

if strcmp(coder.target,'rtw'), 

    y=coder.ceval('c-function',param); 

end 

end 

有沒有解決方法或解決方法?

期待一些幫助。非常感謝你!

回答

0

編輯

這是一種解決方法,你應該在你自己的風險使用它! ;) 我的意思是如果它真的是你最後的選擇。

由於您沒有指定字符串的種類,爲簡單起見,它僅由大寫字母(AABBBCC)組成。 大寫字母用十進制數字表示(A = 65,Z = 90,man ascii)。

該方法包括兩個步驟: 1)在您通過coder.ceval調用的函數中,應該從要返回的字符串構建標量值。 2)你必須從標量值重建字符串。

下面的代碼通過一個簡單的例子來說明如何執行這兩個步驟。請記住,這只是一個例子,你必須努力。假設例如您需要返回字符串「ABC」,那麼您可以返回由三個2位數字組成的標量「656667」:65 = A,66 = B,67 = C。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 

    int i, len, n; 

    // First convert a string in a scalar value 
    char str[] = {'A', 'B', 'C', '\0'}; 

    printf("str = %s\n", str); 
    len = strlen(str); 


    for (i = 0; i < len; i++) { 
     n = str[i] + i*100; 
    } 
    printf("n = %d\n", n); 


    // You return a scalar that is composed by 65,66,67 ---> A,B,C 
    int y = 656667; 

    char num[100]; 
    char letter[3]; 

    // convert the number in a string  
    snprintf(num, 100, "%d", y); 
    printf("num = %s\n", num); 
    len = strlen(num); 
    printf("num len = %d\n", len); 
    // here we assume that the number of digits id even only ascii letters 
    if ((len%2) != 0) exit(1); 

    // Now we have to store the number of two digits as numbers and 
    // then convert the to char and finally append tehm to a string 
    int *ni = malloc((len/2)*sizeof(int)); 
    char *string = malloc(len + 1); 

    // Here I use a lot of intermediate steps to make it clear 
    char c = 0; 
    for (i = 0; i < len/2; i+=1) { 
     snprintf(letter, 3, "%c%c", num[2*i], num[2*i+1]); 
     ni[i] = atoi(letter); 
     c = (char)ni[i]; 
     printf("letter %d = %s, x = %d, c = %c\n", i, letter, ni[i], c); 
     string[i] = c; 
     printf("string[%d] = %c\n", i, string[i]); 
    } 

    // print the final string 
    string[len] = '\0'; 
    printf("string = %s\n", string); 

    return 0; 
} 

小寫字母開始於97,但隨後通過使用一些「特殊號碼」的2個位數甚至可以決定後的「特殊閱讀在字符串的開頭2個位數和3個位數變成3個位數,但是數」。

好的,我不確定這會有幫助,但至少我希望你覺得它很有趣。