2017-08-30 61 views
1

部分的一些源文件是 button_key.h, button_key.h, lcd.h, mani.c結構值未在主源文件來更新我的項目的

用於button_key.H一個和結構法聲明爲

struct menu { 
      uint8_t Hour; 
      uint8_t Minute; 
      uint8_t Second; 
      }; 

main.c源文件

#include "lcd.h" 
#include "delay.h" 
#include "button_key.h" 

    struct menu s1= {0}; 
    struct menu *ptr; 

int main(void) 
{ int a; 

    ptr = &s1; 

//some code// 
menu_key_display (s1,menu_display); 
LCD_DisplayNumber(10,(*ptr).Hour,2); // here not updating the structure value as per the code in button_key.c only show zero (0) 
    while(1); 

    // tried also LCD_DisplayNumber(10,s1.Hour,2); also seems same reult. 

} 

而被結構法在button_key.c文件中使用的像(只有代碼的一部分)

void menu_key_display(struct menu s1,const char *menu_display[]) 
{ //some cdoe here 
     case 1: // set time 
      { 
      LCD_Clear(); 
      LCD_GoToLine(0); 
      LCD_DisplayString(menu_display[5]); 
      LCD_GoToLine(1); 
      LCD_DisplayString(" HH:MM:SS:PM/AM"); 
      UP_Down_Keyvalue(s1,2,4);    
       break; 

      // some code 
} 

上面的源代碼對菜單結構成員進行了更改,值作了更改。但是這種改變在main.c中並沒有體現出我的錯誤。

+3

您需要將'ptr'傳遞給函數。 'c'中的參數是 – user3386109

+1

的值。將'.Hour'傳遞給'LCD_DisplayNumber'時,會創建一個本地副本。函數返回時,對本地副本所做的任何更改都會丟失。如果你希望's1.Hour'在函數返回時保留它的值,你必須將它的指針傳給'LCD_DisplayNumber'並在函數中解引用它。 – yano

+1

作爲__struct菜單* __傳遞,並使用s1->而不是s1。 – cup

回答

4

編譯自評答案:

缺乏更新的僅僅是你在你的代碼註釋行可見,即他們只症狀。

問題的原因是早一行:

menu_key_display (s1,menu_display); 
//    ^

爲了得到函數外部可見的內部變化,
需要「通過引用調用」來使用,它使用C意思是「通過指針」。

所以,改變違規行:

menu_key_display (ptr,menu_display); 

當然,這必須通過改變來匹配被調用函數的行:

void menu_key_display(struct menu *s1Ptr, const char *menu_display[]) 
// ... 
UP_Down_Keyvalue(s1Ptr,2,4); // assuming this to be supposed to have the missing effect 
//    ^

最後使用指針(以與「按值調用」結構副本相反)需要以類似的方式反映在UP_DownKeyvalue(...)函數中。然而,如果它是一個宏(我認爲我在我的答案的前一個版本中隱含地假定),那麼可以使用UP_Down_Keyvalue(*s1Ptr,2,4);而不更改宏定義。

請注意,使用指針時,您可能想要添加一個檢查到該函數,以確保指針不是NULL。稱它爲偏執狂,但偏執狂對程序員來說是一種健康的心態(至少是一個嵌入式程序員)。

+0

在OP中沒有足夠的知道,但我不得不假設'Up_Down_Keyvalue'也應該用指針調用。否則,在顯示的代碼中,'menu_key_display'不會編輯原來的's1',我們又回到了同樣的問題。 – yano

+0

好點,謝謝。我確定了答案的重點。 – Yunnosch