Forums - Tous les messages
Forums - Tous les messages
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 
   Tous les messages (Jacques)

 Bas   Précédent   Suivant

(1) 2 3 4 ... 132 »


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Non, en tout cas pas comme cela.
Quand tu fais: U8 tableau[48];
c'est comme si tu définissais un pointeur constant, donc impossible de modifier l'adresse de tableau.

La seule solution, c'est l'allocation dynamique, mais je doute que le compilateur l'autorise sur ces petits µContrôleurs.

Posté le : 13/05 00:59
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Pour ce cas précis je ne pense pas car il y a vraiment risque de perte de donnée. Ca serait pareil en passant de double à float je pense.
Il doit y avoir moyen de paramétrer le niveau de warning ou quels sont les warnings qu'on veut éliminer, mais je ne le conseille pas.

Posté le : 06/05 21:27
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Citation :
Ok ce code fonctionne nickel. Tu peux m'expliquer du coup cette syntaxe ? ça peut s'employer dans d'autres cas ?
Oui, ça s'appelle un cast, ou transtypage en français.
lors de l'évaluation de l'expression, le type du membre de droite de l'affectation va être transformée de pointeur de myStruc en pointeur de uint8_t (uint8_t est défini comme un unsigned char dans stdint.h).

Ca sert davantage en C++ où le compilateur est très strict sur la vérification des types. C++ a d'ailleurs bien évolué sur ce plan et la méthode que je t'ai donnée est à éviter en C++ "moderne". Il est demandé d'utiliser les mots clés tel que static_cast, reinterpret_cast, const_cast, dynamic_cast, mais j'avoue m'en taper un peu et je caste toujours à la C.

Posté le : 06/05 19:17
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Citation :
Le code que tu me donnes
uint8_t* p = (uint8_t*)&str;
me parait "forcer" le type de la structure renvoyé dans le pointeur U8 ...?
C'est juste pour "rassurer" le compilateur. Il faut évidemment que les 2 variables soient compatibles. Ici, ce sont des pointeurs, donc pas de problème pour caster à priori. Mais c'est le programmeur qui en prend explicitement la responsabilité.

Posté le : 06/05 18:53
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Désolé, je n'avais pas vu ton message #11.

Charly t'a répondu. pas grand chose à ajouter.
Juste peut-être pour dire que si ta structure était définie comme un type, ça n'occuperait aucune place puisqu'un type est abstrait.
Mais chaque variable instanciée à partir de ce type va occuper physiquement la place nécessaire en RAM. Cette place peut être obtenue par l'opérateur sizeof (si, si, c'est bien un opérateur) comme Charly l'a évoqué.

Posté le : 06/05 14:10
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Salut, mauvaise nouvelle, La virtualisation sous Windows pose encore pas mal de problèmes: soit je peux utiliser VMware, soit je peux émuler un terminal Android, et comme je m'essaie à Android pendant le confinement ...
Donc pas de machine virtuelle et pas de CodeWarrior.

J'ai tout de même fait quelques tests. Mais ce sera du code pour du PC. J'ai fait les tests grâce à WSL (Windows Subsystem for Linux, une distribution Debian en l'occurrence), donc compilateur gcc.

test1:
#include <stdint.h>
#include <stdio.h>

int main()
{
   
struct myStruct {
      
int8_t v1;
      
int16_t v2;
      
int32_t v3;
      
int32_t v4;
   } 
str = {57232};

   
uint8_t= &str;
   for (
int i=0sizeof(str); i++)
        
printf("%02x "p[i]);

   return 
0;
}

A la compilation: Citation :
testStruct_S08.c:13:17: warning: initialization of ‘uint8_t *’ {aka ‘unsigned char *’} from incompatible pointer type ‘struct myStruct *’ [-Wincompatible-pointer-types]
uint8_t* p = &str;

C'est un warning, correspondant je pense au problème d'incompatibilité que tu as du rencontré. Mais l'exécutable est généré et l'affichage (en hexadécimal) donne: Citation :
05 7f 07 00 17 00 00 00 02 00 00 00
On reconnait bien les valeurs stockées dans la structure, avec l'alignement dont je parlais. Les "trous" sont comblés avec des valeurs non significatives.

J'applique la solution que je t'ai donnée hier pour supprimer le problème d'incompatibilité:
uint8_t= (uint8_t*)&str;
Plus de warning à la compilation, donc à priori ça devrait aussi marcher pour toi.

Sinon, pour le problème d'alignement (que tu ne devrais pas rencontrer je pense), je l'ai supprimé avec un attribut au niveau de la structure:
struct  __attribute__((__packed__)) myStruct {
. packed permet de compacter la structure et bouche les trous.
Résultat:Citation :
05 07 00 17 00 00 00 02 00 00 00
Et là c'est tout bon.

A+




Posté le : 06/05 12:08
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Qu'est-ce que tu utilises pour développer. Je devrais pouvoir retrouver une vielle machine virtuelle XP avec CodeWarrior encore installé au cas où.

C'est un compilateur C ou C++?

Sinon, en attendant, si tu fais:
U8 *= &test;
tu ne te retrouves pas avec un tableau d'octets accessible avec p?
Au cas où ça coince encore, essaies ça:
U8 *= (U8*)&test;


Posté le : 06/05 00:09
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Tu peux me montrer le code qui ne fonctionne pas avec l'erreur générée?

Posté le : 05/05 23:54
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Non, ce n'est pas un problème d'endiannes, mais d'alignement:
Par exemple, tu crées une structure qui stocke un float, un char et un long int (32 bits). Si le compilateur se contente de se faire succéder les octets de ces 3 champs, ça va poser un problème sur un processeur 32 bits par exemple: le char faisant 1 octet, le long int qui suit va démarrer sur une adresse impaire et il faudra donc 2 accès mémoire pour le récupérer en entier.

Du coup, le compilateur va préférer aligner les champs sur des adresse multiples de 4 et le char prendra 4 octets même s'il n'y en a qu'un d'utile.

Posté le : 05/05 21:58
Transférer la contribution vers d'autres applications Transférer


Re: Structures, unions... ?
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Avec un pointeur sur la structure, tu dois pouvoir accéder à n'importe quel octet.
Attention, certains compilateurs alignent les champs en taille pour favoriser la rapidité d'accès. Bon, avec un processeur 8 bits ça ne présente pas d'intérêt, mais je préfère préciser.

Posté le : 05/05 18:17
Transférer la contribution vers d'autres applications Transférer



 Haut
(1) 2 3 4 ... 132 »




Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Forums - Tous les messages