2013-09-25 4 views
1

J'ai toujours du mal à faire fonctionner ce code correctement. Mon but est de montrer les chaînes qui sont placées dans PROGMEM sur un écran LCD. Le tableau avec des pointeurs vers ces chaînes se trouve également dans PROGMEM. La fonction est appelée avec une variable qui à son tour est traduite en un numéro d'index pour lire le tableau. Ofcourse pgmspace.h est inclus dans le code.Tableau dans Progmem mauvais indice?

Les erreurs que je continue à recevoir sont: souscript de tableau est de type « char » [-Wchar-] indices - initialisation un entier en pointeur sans cast [activé par défaut]

quelqu'un pourrait-il indiquer ce que je J'ai manqué ici? Travaillant sur le code pour AVR GCC, mon IDE est Eclipse.

const char wf0[] PROGMEM= "OFF "; 
    const char wf1[] PROGMEM= "SIN "; 
    const char wf2[] PROGMEM= "TRI "; 
    const char wf3[] PROGMEM= "S+T "; 
    const char wf4[] PROGMEM= "PUL "; 
    const char wf5[] PROGMEM= "P+S "; 
    const char wf6[] PROGMEM= "P+T "; 
    const char wf7[] PROGMEM= "P+ST"; 
    const char wf8[] PROGMEM= "NOI "; 
    const char wf9[] PROGMEM= "N+S "; 
    const char wf10[] PROGMEM= "N+T "; 
    const char wf11[] PROGMEM= "NST "; 
    const char wf12[] PROGMEM= "N+P "; 
    const char wf13[] PROGMEM= "NPS "; 
    const char wf14[] PROGMEM= "NPT "; 
    const char wf15[] PROGMEM= "NPTS"; 

    const char * const arrayWaveform[] PROGMEM= {wf0,wf1,wf2,wf3,wf4,wf5,wf6,wf7,wf8,wf9,wf10,wf11,wf12,wf13,wf14,wf15}; 

... 

void showWaveform (char ctrlValue) 
{ 
    char hex = (ctrlValue & 0xf0)>>4; 

    char tempText[4]; 
    char* data = pgm_read_byte(&arrayWaveform[hex]); // <<shows up both errors here 
    strcpy_P (tempText, data); 
    for (char x=0;x<4;x++) 
     { 
     char2LCD(tempText[x]); // <<shows up error: array subscript has type 'char' 
     } 
} 

Répondre

2

Cela devrait faire:

void showWaveform (char ctrlValue) 
{ 
    char hex = (ctrlValue & 0xf0)>>4; 
    char *pstr, tempText[5]; 
    memcpy_P(&pstr, arrayWaveform+hex, sizeof(char*)); 
    strncpy_P(tempText, pstr, sizeof(tempText)); 
    for (int x=0; x<4 && tempText[x] != 0; x++) 
    { 
    char2LCD(tempText[x]); 
    } 
} 

Il y avait plusieurs problèmes avec votre code. Tout d'abord arrayWaveform lui-même est stocké dans PROGMEM, vous ne pouvez donc pas simplement y accéder en utilisant des crochets. En second lieu, tempText doit être long d'au moins 5 éléments (sinon strcpy_P peut écrire après la fin du tableau).

Vous voudrez peut-être lire attentivement le docs à propos de PROGMEM, pour bien comprendre ce qui se passe. S'il vous plaît noter que si vous avez une copie récente de AVR-GCC, il y a aussi le new __flash syntax qui permet de se débarrasser de toutes les machines pgm_read_ * et * _P. Je ne l'ai jamais testé, donc YMMV.

+0

Je vérifie votre code. Merci d'avoir signalé des choses. Quelques modifications mineures apportées (temptext et tempText, en initialisant * pstr = 0).Il compile bien, mais donne toujours des résultats étranges. Cela n'a peut-être rien à voir avec votre code, mais peut-être que quelque part ailleurs dans mon code, un autre problème est toujours à portée de main. Ce bit place également des données dans progmem mais ne compile pas correctement. Probablement la même erreur. Je vais regarder ça demain. Merci pour maintenant! – user2371490

+0

Mon mauvais: j'ai oublié le '&' avant pstr dans l'appel à 'memcpy_P'. C'est parce que memcpy_P va charger un pointeur vers PROGMEM, donc je dois passer l'adresse de l'endroit où je veux que le pointeur soit chargé, c'est-à-dire un pointeur vers un char *. – CAFxX

0

Exactement comme le dit votre compilateur, vous utilisez char s pour accès au tableau. Normalement, les indices de tableau doivent être int s.

Sur les deux lignes, vous devez convertir vos variables en int s, ou simplement les déclarer comme int s pour commencer. En ce qui concerne l'autre erreur, je suppose que pgm_read_byte renvoie un char brut que vous essayez d'attribuer à un char*, ce qui est impossible. Vous devriez probablement revenir un pointeur de pgm_read_byte

1

Dans tempText[x] et arrayWaveform[hex] l'indice est de type signed char qui peut prendre des valeurs negavtive trop

changement à unsigned char

Voir GCC Warnings:

Wchar-subscripts Avertir si un indice de tableau a le type char. Ceci est une cause fréquente d'erreur, car les programmeurs oublient souvent que ce type est signé sur certaines machines. Cet avertissement est activé par -Wall.

+0

Merci, votre juste, n'a pas pensé à cela. Normalement j'utilise uint8_t, totalement oublié cette fois. – user2371490

Questions connexes