Renommer les élement d'un tableau [Forums - Langage C]
Renommer les élement d'un tableau [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



(1) 2 »


Renommer les élement d'un tableau
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Bonjour,

En ASM, je faisais ceci :

rom_code1 ds.b  8
code_fam  equ   rom_code1
crc_ROM   equ   rom_code1
+7


J'enregistrais les 64bits de mon capteur en les stockant dans "rom_code1".
Et grâce aux "EQU", je déclarais renommais les 2 octets dont j'avais besoin.

Même si je n'oublie pas la remarque de Stéphane au sujet de la fonction ci-dessous avec les pointeurs, je voudrais pouvoir déclarer ces 2 octets afin de pouvoir les lire ensuite :

/*** Global variables ***/
U8 au8page_data [8];

void OWReadPackets(U8 au8page_data[8])
{
    
U8 u8i;

    for (
u8i 0u8i <= 7u8i++)
    {
        
au8page_data[u8i] = OWReadByte();
    }
}


Hier j'ai essayé en ajoutant ceci dans le .h :

#DEFINE var0 = au8page_data [0];
#DEFINE var1 = au8page_data [1];
#DEFINE var2 = au8page_data [2];
#DEFINE var3 = au8page_data [3];
#DEFINE var4 = au8page_data [4];
#DEFINE var5 = au8page_data [5];
#DEFINE var6 = au8page_data [6];
#DEFINE var7 = au8page_data [7];


Le compilo l'a pris, mais rien de plus en mode débug.

Et là, je viens de trouver ceci sur un site :

Citation :
(...)
Si le compilateur que vous utilisez pour votre programme est GCC, une notation permet d'initialiser tous les éléments d'un tableau avec la valeur de son choix :
int monTableau[1000] = {[... 999] = 5};


Il est possible d'utiliser également les macros afin de définir des suites de valeurs que l'on insérera à loisir dans le code afin d'initialiser le tableau comme on le souhaite :
#define VAL_1X 5
#define VAL_2X VAL_1X, VAL_1X
#define VAL_4X VAL_2X, VAL_2X
#define VAL_8X VAL_4X, VAL_4X
#define VAL_16X VAL_8X, VAL_8X
#define VAL_32X VAL_16X, VAL_16X
int monTableau[53] = { VAL_32XVAL_16XVAL_4XVAL_1X };



Et en l'adaptant dans ma logique :

#DEFINE var0 = au8page_data [0];
#DEFINE var1 = au8page_data [1];
#DEFINE var2 = au8page_data [2];
#DEFINE var3 = au8page_data [3];
#DEFINE var4 = au8page_data [4];
#DEFINE var5 = au8page_data [5];
#DEFINE var6 = au8page_data [6];
#DEFINE var7 = au8page_data [7];
U8 au8page_data [8] = { var0var1var2var3var4var5var6var7};


ça vous parait correct ?

Posté le : 11/03/2016 12:49
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
oula ça mélange pleins de trucs, tu me mets en limite de compétence C là...
#DEFINE var3 = au8page_data [3];
ca je suis étonné que le compilo le prenne (je découvre des choses) mais je doute que ce soit ce que tu voulais ecrire

Si tu voulais dire var3 c'est la même chose que au8page_data[3] alors il faut écrire
#DEFINE var3 au8page_data[3]
(sans le =, sans le ; et sans les espaces qui délimites les paramètres du define

tu peux alors ecrire dans ton code des choses comme
if (var3 == 56faireCeci()
qui est la même chose que
if (au8page_data[3] == 56faireCeci()


mais la notion de tableau étant importante dans ton code il semble plus lisible/pratique de faire ceci
#define var3 3
au8page_data[var3] = 56;

puis if(au8page_data[var3] == 56faireCeci();
l'indice du tableau devient plus parlant (tu remplaces un nombre par un nom qui représente quelquechose) tout en gardant avant le nom du tableau qui lui aussi est utile à la compréhension (sinon tu ne sais plus que c'est dans un tableau)

Aprés autre sujet avec l'initialisation d'un tableau
U8 au8page_data [8] = { var0var1var2var3var4var5var6var7};
ne signifie pas "voici le nom à donner aux 8 cases de mon tableau"
cela est équivalent à
U8 au8page_data [0] = var0;
U8 au8page_data [1] = var1;
U8 au8page_data [2] = var2;
U8 au8page_data [3] = var3;
U8 au8page_data [4] = var4;
...
jusqu'au 8eme

avec avant  la définition de var 0 a 7 avec
#define var0 56
#define var1 45
#define var2 89
...jusqu'
au 8ieme

qui aurait donc pu être écrit directement
U8 au8page_data 
[8] = { 56458912345};
ou encore

U8 au8page_data 
[1] = 56;
U8 au8page_data [2] = 45;
U8 au8page_data [3] = 89;
U8 au8page_data [4] = 1;
...
jusquau 8ime



Posté le : 11/03/2016 13:53
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Aïe pardon !

J'ai réécris ce code de mémoire. En effet, le compilo l'a pris comme ceci :

#DEFINE var3 au8page_data[3]


Le compilo m'aurait surement envoyé bouler avec le "=" et le ";".

Bon là pour le coup, je trouve cela plus simple avec l'ASM

Les valeurs de chaque élément du tableau, ce n'est pas moi qui vais les choisir. Ce sont les 8 octets rom_code que le capteur va me renvoyer. Et je devrais m'en servir régulièrement afin de l'interroger (adressage quoi).

Je reprend mon exemple concret et réel :

rom_code1 ds.b  8 
code_fam  equ   rom_code1 
crc_ROM   equ   rom_code1
+7


Si je te suis bien, je peux arriver à faire la même chose en faisant :

U8 au8page_data [8];
U8 au8page_data [0] = code_fam//octet indiquant le code famille
U8 au8page_data [7] = crc_ROM;  //CRC8 calculé par le capteur sur les 7 octets précédants


Ce qui pourrait me permettre de vérifier le CRC par la suite en faisant un truc du style :

result calculCRC(crc_ROM);


Tu crois que je comprend le truc ?

Posté le : 11/03/2016 14:45
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Je viens de trouver ceci :

tableau[1// Renvoie la valeur de la seconde case (la première case étant 0)
*(tableau 1// Identique : renvoie la valeur contenue dans la seconde case


Ces 2 lignes sont équivalentes, sauf que pour la 2ème, puisqu'il s'agit d'un pointeur visant la 1ère case, je peux peut-être faire :

U8 u8crc_ROM = *(au8page_data 7);


Si ça ça marche, je trouve le truc un peu bizarre dans la mesure ou j'ai l'impression que c'est une nouvelle variable ...

Posté le : 11/03/2016 15:03
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Beaucoup de notions dans tout ce que tu nous montre dans ce post...

Pour dire vrai je ne comprends pas trop le besoin donc j'ai du mal à te dire quoi faire exactement, je me contente de corriger tes erreurs et de rebondir dessus pour expliquer ce que tu as écrit.

là avec le * tu nous parles de "pointeurs".
J'ai mis très longtemps à comprendre perso, ma formation mécano devait être allergique . C'est Maverick dans son superbe article ici qui m'a enfin permis de comprendre ; peut être ce que tu cherches... (explique nous en français sans code ce que tu veux faire sinon)
http://www.68hc08.net/articles.item.1 ... teurs-meme-plus-peur.html

En gros tu manipules non pas des valeurs mais l'adresse où se trouve les valeurs.

Posté le : 11/03/2016 15:24
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Je comprend la notion de pointeur en C (et d'ailleurs, je crois que c'est inévitable quand à leur utilisation).

J'ai déjà lu cet article, très intéressant, dommage qu'il n'y est pas la deuxième partie...

Je vais essayer d'être plus explicite ;

1°) Je reçois mes 8 octets rom code issu du capteur dans un tableau de 8 cases déclaré comme ceci : "U8 au8page_data [8]".
Je ne modifierai jamais ces valeurs.

2°) La valeur de l'octet contenant le CRC se range automatiquement dans "au8page_data [7]", soit la 8ème case.

3°) Maintenant, afin de vérifier que les 7 octets contenus dans les case "au8page_data [0 à 6]" ne comportent pas d'erreurs, je dois calculer moi même le CRC de ces 7 octets et de le comparer avec l'octet du CRC reçu.

4°) Il n'est pas confortable, à chaque fois que cela est nécessaire, d'appeler une fonction effectuant ce calcul en faisant :
result calculCRC(au8page_data [7]);


Mais plutôt :
result calculCRC(crc_ROM);


D'où l'intérêt de renommer "au8page_data [7]" en "crc_ROM"

De même, dans la suite de la transition, je devrais lire et interpréter 9 octets.


En asm, c'est un truc vraiment tout con, une histoire de labels souviens toi :

rom_code1 ds.b  8    //allocation de 8 octets en RAM, équivalent à mon tableau
code_fam  equ   rom_code1   //re nommage des octets que je veux ...
crc_ROM   equ   rom_code1+7



scratch   ds
.b  9
lsb_temp  equ   scratch
msb_temp  equ   scratch
+1
th_reg    equ   scratch
+2
tl_reg    equ   scratch
+3
conf_reg  equ   scratch
+4
b5        equ   scratch
+5
b6        equ   scratch
+6
b7        equ   scratch
+7
crc_SCR   equ   scratch
+8

Posté le : 11/03/2016 16:03
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Ben là c'est tout con pareil

#define lsb_temp au8page_data[7]
Pas d'espace entre le nom du tableau et le [

Mais pour ce que tu veux faire ce n'est pas la bonne méthode, il y a bien mieux en C.

La fonction CalculCRC tu lui donnes l'adresse de début des données et le nombre d'octets à prendre en compte dans le calcul
unsigned short CRC16_crc(unsigned char *Adresseunsigned short u16qAtraiter//ici le proto d'une fonction du même type pour un CRC16


Que ce soit pour le tableau ROM ou pour chacune des mesures par la suite tu utilises la même fonction en lui passant l'adresse du tableau et le nombre d’octets à prendre en compte

ensuite tu fais
if( TonTableau[Checksum] == CRC(&TonTableau[0], 7)) ToutBon() ;
Pour tester le CRC

Après pour manipuler les octets de la trame lu périodiquement tu as bien mieux qu'un define qui donne un nom à chaque octet

C'est soit un define qui reprend la syntaxe a rallonge nécessaire pour avoir le unsigned short formé par 2 octets du tableau
#define TEMPERATURE_U16 (unsigned short)(M_TEMP*256)+(unsigned short)L_TEMP


Soit carrément une union de structure (on en a parlé l'autre jour) qui te permettra de manipuler tes 8 octets
- soit comme un tableau de 8 octets (dans ta fonction de lecture)
- soit comme une structure qui contient un U16 u16temperature, un U16 u16machin un U8 u8conf, 2 octets qui servent à rien et un octet U8 u8CRC. Tu peux manipuler la température comme un u16 directement après, sans calcul ni rien.

Ça ça dépend des goûts et des couleurs. Perso je préfère la solution union de structure pour simplifier les syntaxes après, Yvan se sert jamais d'unions de structures...

En tous cas ce qui est certain c'est que si tu penses à quelquechose de plus ergonomique en ASM, c'est soit que t'as pas pigé un truc, soit que tu ne sais pas encore que ça existe !

Posté le : 11/03/2016 16:31
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
... ou soit que je suis un génie ! lol j'aime bien ton mot de la fin ... je rentrerai pas dans ce débat ASM vs C. Tout ce que je sais, c'est que pour l'instant le C m'emm....e !

Bon donc la réponse à :
scratch   ds.b  9 
lsb_temp  equ   scratch 
msb_temp  equ   scratch
+
th_reg    equ   scratch
+
tl_reg    equ   scratch
+
conf_reg  equ   scratch
+
b5        equ   scratch
+
b6        equ   scratch
+
b7        equ   scratch
+
crc_SCR   equ   scratch
+8


Serait :

#define lsb_temp  au8page_data[0]
#define msb_temp  au8page_data[1] 
#define th_reg    au8page_data[2] 
#define tl_reg    au8page_data[3] 
#define conf_reg  au8page_data[4] 
#define b5        au8page_data[5] 
#define b6        au8page_data[6] 
#define b7        au8page_data[7] 
#define crc_SCR   au8page_data[8]

U8 au8page_data [9];


Je prend note des fonctions que tu viens d'écrire.


Et tu sais David, je ne vois pas trop de différence d'érgo entre l'ASM et le C, si l'on admet le code ci-dessus

Posté le : 11/03/2016 17:40
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Pour le moment tu en es à faire ne C ce que tu faisais en ASM...tu comprendra mieux quand les premiers trucs marcheront et que tu passera aux fonctionnalités d’après...



Posté le : 11/03/2016 18:03
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Renommer les élement d'un tableau
Semi pro
Inscrit:
11/12/2008 21:00
Messages: 78
Hors Ligne
Salut,

meme si je suis silencieux et je ne vais pas vous faire avancer mais depuis le debut je suis les deboires et les avancées de notre ami Dinastar et j'avouer que je suis avec interré par toute cette lecture car j'apprends des tonnes de choses meme si en ce moment je ne peu pas les appliquer

alors merci pour toutes ces notions de C qui j'espere servirons aussi a d'autres !

Pat

Posté le : 11/03/2016 19:00
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
(1) 2 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Renommer les élement d'un tableau [Forums - Langage C]