Comment récupérer des erreurs pour les traiter ?

JuanLuis35 Messages postés 5 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 21 août 2012 - 21 août 2012 à 10:26
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 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 ?? :
float ma_variable ;
char ma_fonction_diver(uint8 adresse, uint8 data); //Prototype de ma_fonction_driver
ma_variable=ma_fonction_driver(adresse,data);
ma_gestion_derreur(ma_variable);


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 !

Merci de m'avoir lut ! JL

10 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
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
JuanLuis35 Messages postés 5 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 21 août 2012
21 août 2012 à 13:20
Merci pour la réponse mais je veux bien que tu explicite un peu ton propos!!! parce que là je ne comprend pas ce que tu veux dire !!!
Merci
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
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és 5 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 21 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 ?

Posez votre question
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
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és 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
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és 5 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 21 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és 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
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 :

struct RetValDriverStruct
{
    char type_tag; // 'C'har, 'B'ool, 'F'loat
    union
    {
char cRet;
bool bRet;
float fRet;
    };
};



bye.
JuanLuis35 Messages postés 5 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 21 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.
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
21 août 2012 à 14:39
ok,

donc tu ne pourra jamais mettre un float dans un char !!


bye...
Rejoignez-nous