Je travaille sur un programme C qui utilise une Union. La définition de l'union est dans le fichier d'en-tête FILE_A et ressemble à ceci ...Problème avec les syndicats dans le programme C
// FILE_A.h****************************************************
xdata union
{
long position;
char bytes[4];
}CurrentPosition;
Si je mets la valeur de CurrentPosition.position dans FILE_A.c puis appeler une fonction dans FILE_B.c qui utilise le syndicat, la les données dans l'union sont de retour à zéro. Ceci est démontré ci-dessous.
// FILE_A.c****************************************************
int main.c(void)
{
CurrentPosition.position = 12345;
SomeFunctionInFileB();
}
// FILE_B.c****************************************************
void SomeFunctionInFileB(void)
{
// After the following lines execute I see all zeros in the flash memory.
WriteByteToFlash(CurrentPosition.bytes[0];
WriteByteToFlash(CurrentPosition.bytes[1];
WriteByteToFlash(CurrentPosition.bytes[2];
WriteByteToFlash(CurrentPosition.bytes[3];
}
Si je passe un temps à SomeFunctionInFileB (longue temp) puis le stocker dans CurrentPosition.bytes dans cette fonction, et enfin appeler WriteBytesToFlash (CurrentPosition.bytes [n] ... il fonctionne très bien .
Il semble que l'Union currentPosition est pas globale. J'ai essayé de changer la définition du syndicat dans le fichier d'en-tête pour inclure le mot-clé extern comme ça ...
extern xdata union
{
long position;
char bytes[4];
}CurrentPosition;
puis mettre cela dans la fichier source (.c) ...
xdata union
{
long position;
char bytes[4];
}CurrentPosition;
mais cela provoque une erreur de compilation qui dit:
C:\SiLabs\Optec Programs\AgosRot\MotionControl.c:76: error 91: extern definition for 'CurrentPosition' mismatches with declaration. C:\SiLabs\Optec Programs\AgosRot\/MotionControl.h:48: error 177: previously defined here
Alors qu'est-ce que je fais mal? Comment rendre le syndicat global?
Je pense - mais je ne suis pas sûr - que les travaux du syndicat façon est que si vous accédez à t Les données à travers une de ses variables puis les autres sont effectivement invalidées. En d'autres termes, je ne crois pas que vous pouvez définir le long et ensuite utiliser les octets pour accéder à cette mémoire. Vous devriez y accéder à long terme. Je ne suis pas positif à ce sujet si - d'où le commentaire. Je suis curieux de voir ce que disent les plus expérimentés des syndicats. –
@Daniel - incorrect - exactement le contraire est vrai, c'était l'objectif initial d'une union pour avoir accès aux octets de long ou un int ou un flotteur - dangereux et dépendants de la machine qu'ils sont ..... – KevinDTimm
Je jure que je lire le titre comme «Trouble with Unicorns in C program». Je passe trop de temps sur Meta. –