2015-10-20 48 views
0

在我的一個Contiki應用程序中,我從PROCESS(P)調用某個函數(f)。 (f)中的循環中至少有一個'printf'時,(P)中的'printf'正確顯示結果。但是,當在同一個循環中沒有'printf'時,結果爲空。 任何人都可以請幫我理解爲什麼延遲printf調用循環顯示結果,爲什麼它不顯示沒有這個特定的電話。Contiki OS循環太快而無法打印結果?

**CODE:** 
    function_f(...){ 
    .... 
    .... 
    char res1[LEN]; 
    .... 
    for(i=LEN-1;i>1;i--){ 
      ....addition operations... 

      if(temp > 9 && (i-1) > 0){          

       ...division operation... 
       ...addition and remainder operation... 

      }else{ 

       ....addition.... 
       ....assignment.... 

      } 

     } 
     return res1 
    } 


PROCESS_THREAD(...){ 
.... 
    **printf**("\nResult: %s", function_f(...)); 
.... 
} 

謝謝 Avijit

+0

請發佈一個簡單的代碼,乾淨地編譯,並演示問題。至少要發佈相關的printf()語句 – user3629249

+0

printf()格式字符串以'\ n'結尾?你嘗試過使用'fflush(stdout)'嗎?最有可能的是printf()輸出由於輸出的系統緩衝而不顯示。 – user3629249

+0

我不認爲fflush stdout適用於像傳感器節點這樣的嵌入式系統 – aviian7

回答

2

對此行:返回RES1的RES1將是一個指針位於堆棧上的數組。當函數退出時,如果指針res1被取消引用,則堆棧上的值「超出範圍」,導致未定義的行爲。一個可能的解決辦法:

char * res1 = NULL; 
res1 = malloc(LEN); 
if(NULL == res1) 
{ // handle error } 
else .... 

當然,那麼調用者需要通過RES1免費()

由於公佈的代碼(可能你的實際代碼)顯示未定義的行爲,的任何重新佈局研究代碼可以/會產生不同的效果。在你的情況下,添加/刪除對printf()的調用將顯示觀察到的效果。