erreur de mémoire de pointeur
Question
Le problème
Je ne peux pas obtenir les données de la mémoire flash lorsque vous utilisez la fonction qui renvoie l'adresse du motif souhaité dans Flash (simplifié dans l'exemple ci-dessous avec seulement 1 constante: PATTERN_P).
Une partie du code avant explicitation
est définie La patternp
du type à
typedef prog_uchar patternp[NUM_ROWS];
La variable globale PATTERN_P est un tableau de type patternp, définie comme
const patternp PATTERN_P PROGMEM = {
0b11110000 ,
0b10010000 ,
0b10010000 ,
0b10010000 ,
0b11110000 ,
0b10000000 ,
0b10000000 ,
0b10000000
};
getPattern ():
const patternp * getPattern()
{
//...
return &PATTERN_P;
}
main ()
const patternp *bufferPattern = getPattern();
uint8_t rowPatternData[NUMBER_ROW_PER_MATRIX];
const patternp *bufferPattern = getPattern(s[iLetter]);
for(int iRow = 0; iRow<NUMBER_ROW_PER_MATRIX; iRow++)
{
rowPatternData[iRow]=pgm_read_byte( &PATTERN_P[iRow] ); // <--- WORK!
rowPatternData[iRow]=pgm_read_byte( bufferPattern[iRow] ); // Not Working!
}
Explications
Comme vous pouvez le voir, le code obtenir le motif (dans cet exemple, il retournera PATTERN_P chaque fois que ... que je ne l'utilise pgm_read_byte pour obtenir les données de la mémoire Flash. Utiliser le pgmspace AVR (lien ci-dessous). il faut une adresse et renvoie les données le code ci-dessus travail lorsque j'utilise l'accès direct d'un modèle:. & PATTERN_P [iRow], mais ne fonctionnera pas quand je l'utilise bufferPattern [iRow] ou & bufferPattern [iRow] Toute idée <.? / p>
Référence: pgm_read_byte est défini dans pgmspace
La solution
bufferPattern est un pointeur sur un tableau. Lorsque vous écrivez bufferPattern [iRow], cela n'évalue pas à un pointeur vers iRow d'entrée de patternp; l'opération agit sur le pointeur, pas le tableau [] il pointe. Ce que vous semblez vouloir écrire est & ((* bufferPattern) [iRow]).
qui résoudra le problème immédiat. Cependant, le code est un peu déroutant. Il se peut que votre code serait simplifié en passant le tableau directement (C ne passe pas par la valeur des tableaux, donc il ne sera pas copier le tableau - vous n'avez pas besoin de faire un pointeur vers le tableau pour éviter cela).
Autres conseils
&PATTERN_P[iRow]
est
&(PATTERN_P[iRow])
lorsque votre ligne de travail donne ceci:
(&PATTERN_P)[iRow]