2014-07-22 31 views
1

我想提出一個功能,即讀串行和匹配到一定值時,如果再匹配我存儲string1在變量x,否則我儘量匹配讀串口與第二字符串,如果然後它匹配我店string2x等。現在我想讓這個函數將這個字符串(存儲在變量x中)從它被調用的地方返回到main函數。如何在arduino上創建函數返回字符串?

+0

當然,你只是'返回x'? –

+0

@AlexP:Noooooo no no no no no no no。 –

回答

7

你有幾個選擇。您可以讓來電者提供將被用來存儲返回值的緩衝區:

void foo0(char * buf, int maxBufferSize) { 
    while(maxBufferSize && *buf = getByteFromSerial()) { //assumes getByte returns 0 for done 
    maxBufferSize--; 
    } 
} // If you really feel like it, you can alter this to return the original buf 

你可以有方法本身維護它使用的返回值的緩衝區:

char * foo1() { 
    static char buf[BUF_SIZE+1]; 
    int copiedBytes = 0; 
    while (copiedBytes<BUF_SIZE && buf[copiedBytes++] = getByteFromSerial()); 
    buf[copiedBytes] = '\0'; 
    return buf; // Note that when you call foo() again, this will be destroyed. 
} 

你可以有方法分配緩衝區:

char * foo2() { 
    static char buf[BUF_SIZE+1]; 
    // do all the stuff from the previous version 
    char * retval = malloc(copiedBytes); 
    strcpy(retval, buf); 
    return retval; 
} 

這最後的解決方案有一些問題。是的,你必須記住要釋放,但更糟糕的是,對於內存很少的東西的動態內存分配應該嚇跑你。有關詳細信息,請查找內存碎片。想想看,正是由於這個原因,我從來沒有在微處理器上使用過malloc。當可用內存很少時,您可以想出更好的方法來自己動態分配內存。

我的偏好是讓調用者提供緩衝區。通過這種方式,任何必要的分配和釋放都在堆棧中整齊地處理,並且您沒有多次調用者的問題,即上面的foo1()會緊緊跟隨您。

void someFunction() { 
    char buf[BUFF_SIZE+1]; 
    fillMyBuffer(buf, BUFF_SIZE); 
    doSomethingWithMyBuffer(buf); 
} 

這樣,當someFunction的回報,它的緩衝區不再佔用內存和我沒有在我的程序的功能,有一個靜態緩衝區佔用的是隻可極少使用的空間。