2017-08-30 10 views
1

partie de mon projet certains des fichiers source sont button_key.h, button_key.h, lcd.h, mani.c etc.Valeur de la structure n'est pas mise à jour dans le principal fichier source

utilisé un structre dans button_key.H et a déclaré que

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

Dans main.c fichier source

#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. 

} 

Et le structre est utilisé dans button_key.c fichier comme (seule la partie du code)

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 
} 

Le code source ci-dessus a apporté des modifications, les valeurs aux membres de la structure de menus. Mais ces changements ne reflètent pas dans main.c ce qui est le problème avec moi.

+3

Vous devez transmettre 'ptr' à la fonction. – user3386109

+1

Les arguments dans 'c' sont transmis par valeur. Lorsque vous passez '.Hour' dans' LCD_DisplayNumber', une copie locale est faite. Toutes les modifications apportées à cette copie locale sont perdues lorsque la fonction renvoie. Si vous voulez que 's1.Hour' conserve sa valeur quand la fonction retourne, vous devez passer un pointeur à' LCD_DisplayNumber' et le déréférencer dans la fonction. – yano

+1

Passez comme __struct menu * __ et utilisez s1-> au lieu de s1. – cup

Répondre

4

une réponse Compiler commentaires:

L'absence de mise à jour est uniquement visible dans les lignes vous avez commenté dans votre code, à savoir qu'ils ne sont que le symptôme.

La cause de du problème est une ligne plus tôt:

menu_key_display (s1,menu_display); 
//    ^

Afin d'obtenir les changements dans la fonction visible à l'extérieur,
vous devez utiliser « appel par référence », qui, en C signifie "via un pointeur".

Donc, changer la ligne incriminée à:

menu_key_display (ptr,menu_display); 

Ce bien sûr doit être compensée par des changements aux lignes de la fonction appelée:

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 
//    ^

La dernière utilisation du pointeur (en contraste à "call by value" struct copy) doit également être reflété dans la fonction UP_DownKeyvalue(...), de la même manière. Cependant, s'il s'agit d'une macro (ce que je suppose implicitement supposé dans la version précédente de ma réponse), alors UP_Down_Keyvalue(*s1Ptr,2,4); pourrait être utilisé sans modification de la définition de la macro.

Notez que lorsque vous travaillez avec un pointeur, vous pouvez ajouter une vérification à la fonction pour vous assurer que le pointeur n'est pas NULL. Appelez-la paranoïa, mais la paranoïa est un état d'esprit sain pour un programmeur (au moins un programmeur embarqué).

+0

Il n'y a pas assez de choses dans l'OP pour savoir, mais je dois supposer que 'Up_Down_Keyvalue' devrait aussi être appelé avec un pointeur. Sinon, dans le code affiché, 'menu_key_display' ne modifiera pas l'original' s1' et nous sommes de retour au même problème. – yano

+0

Bon point, merci. J'ai fixé ce qui est bien sûr le point de la réponse. – Yunnosch