JuanLuis35
Messages postés5Date d'inscriptionmardi 17 juillet 2012StatutMembreDernière intervention21 août 2012
-
21 août 2012 à 10:26
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
21 août 2012 à 14:39
Bonjour à tous !
Dans le cadre d'un projet je dois concevoir une architecture d'une couche logicielle (dite "couche d'abstraction matériel"). Elle doit faire un lien entre un code fonctionnel et les drivers utilisant le matériel.
Je suis en ce moment en train de me pencher sur la gestion des erreurs.
Les pilotes des liaisons peuvent en générer, mais ils ne renvoient pas forcément tous les même types de données. Certains vont renvoyer un booléen, d'autres vont renvoyer des "char" , ainsi de suite...
Ce que je cherche à faire est donc une fonction, qui pourra gérer tous ces retour d'erreurs.
Pour être plus précis, première question, est ce que je peux faire ça ?? :
j'y crois pas trop parce que j'assigne un "char" à un float ?! Dite moi ce que vous en pensez svp !!
Si j'ai le droit e faire ça, c'est gagné!!! je pourrai prendre n'importe quel erreur pour ensuite pouvoir travailler dessus. Mais du coup ça me parait trop simple...
Je suis ouvert à toutes vos remarques et idées !
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 21 août 2012 à 12:54
Normalement, tes drivers doivent tous être interfaçables de la même manière...
Si tu ne le fais pas, ce seront les applications qui devont gérer ça,
un peu paradoxal vu que tu es justement en train de faire une couche d'abstraction matériel
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 21 août 2012 à 13:28
Ta couche d'abstraction se charge d'appeler elle-même les fonctions des drivers. Toutes les fonctions qu'ils exposent doivent avoir la même façon de retourner une erreur, par exemple un DWORD qui est nul si tout va bien, et qui a des valeurs soit standards (pour l'OS), soit définies par le concepteur du driver qui a alors exposé une fonction getErrorFromNumber() [ou ce que tu veux]... Plus clair comme ça ?
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
JuanLuis35
Messages postés5Date d'inscriptionmardi 17 juillet 2012StatutMembreDernière intervention21 août 2012 21 août 2012 à 13:42
[quote=ghuysmans99]Toutes les fonctions qu'ils exposent doivent avoir la même façon de retourner une erreur/quote
Justement non! mon but est de gérer les erreurs qui me reviennent, alors qu'elles peuvent avoir des types différents. J'aurai aimé utiliser qu'un seul type de variable, pour que par la suite je l'a transmette a une fonction qui la traitera!
Vous n’avez pas trouvé la réponse que vous recherchez ?
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 21 août 2012 à 14:15
Bonjour,
Tu ne précises pas si tu disposes du code source des drivers. Si oui, alors la remarque de ghuysmans99 est pertinente et il faut s'arranger pour qu'ils retournent tous le même type d'erreur. Si non, il faut effectivement trouver une solution pour récupérer des valeurs hétérogènes à partir d'une même fonction.
L'idée serait peut-être de transformer à l'intérieur de ta fonction ma_fonction_diver les différents types d'erreur en un seul qui serait gérable dans l'applicatif. C'est justement le principe d'une couche d'abstraction.
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 21 août 2012 à 14:17
Tu es alors obligé d'utiliser une structure contenant le type, la taille et un buffer.
Le problème c'est qu'au retour d'une fonction, si c'est un BYTE/WORD/DWORD, impossible
de savoir le type réel du code d'erreur... Tu peux tout stocker dans un DWORD et
caster sauvagement en float/WORD/... au besoin.
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
JuanLuis35
Messages postés5Date d'inscriptionmardi 17 juillet 2012StatutMembreDernière intervention21 août 2012 21 août 2012 à 14:23
Bonjour ed73 !
Je ne connais pas mes drivers, je ne sais donc pas le type quil me retourne, mais bien entendu, l'utilisation sera limité à un certain nombre de type, sinon je ne men sortirai jamais.
[quote=ed73]L'idée serait peut-être de transformer à l'intérieur de ta fonction ma_fonction_diver les différents types d'erreur en un seul qui serait gérable dans l'applicatif./quote
C'est justement ça que je cherche a faire. Une fonction qui me récupère toutes les erreurs qui surviennent pour ensuite la formater en un code erreur gérable par l'applicatif !!
Si j'utilise un pointeur générique void*, cela serait-il possible de faire ça :
void * ma_variable= malloc( 10 * sizeof(double) ); //je déclare ma variable d'erreur
char ma_fonction_diver(uint8 adresse, uint8 data); //Prototype de ma_fonction_driver
ma_variable=ma_fonction_driver(adresse,data); //j'appel ma fonction qui retourne quelque chose à ma_variable
return ma_gestion_derreur(&ma_variable); //j'appel la gestion d'erreur qui retourne un beau code erreur exploitable par l'applicatif!
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 21 août 2012 à 14:34
Salut
J'ai pas bien compris si la fonction
char ma_fonction_diver(uint8 adresse, uint8 data);
est une fonction à toi ou une fonction dont tu n'a pas le code source ?
Car si tu as la main sur cette fonction, rien ne t'empèche de retourner une structure/union avec tous ce qu'il faut dedans ... un type et une valeur :
JuanLuis35
Messages postés5Date d'inscriptionmardi 17 juillet 2012StatutMembreDernière intervention21 août 2012 21 août 2012 à 14:37
Non[quote=yann_lo_san]
J'ai pas bien compris si la fonction
char ma_fonction_diver(uint8 adresse, uint8 data);
est une fonction à toi ou une fonction dont tu n'a pas le code source ? /quote Non je n'ai pas la main dessus, je connais les prototypes mais je ne peux pas changer l'implémentation de la fonction.