|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
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 ?? : Code C :
j'y crois pas trop 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 |
||
|
|
00
|
|
|
#2 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Je regarde dans la norme C99 à la partie sur les conversions de type (6.3).
Dans la partie 6.3.1.4 Real floating and integer, tu liras au point 2 : Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Merci pour la réponse. Mais du coup rien de sur quoi !!
Le truc c'est que là j'ai traiter pour un char en retour, mais ptet que je vais avoir un int, ou un double, ou plein d'autre chose. Comment faire pour récupérer une variable de n'importe quel type dans une variable d'un type précis ?? |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
C'est sûr si ton compilateur respecte la norme. As-tu lu la partie de la norme que je t'indique ? Elle pourra t'aider à comprendre les mécanismes de conversion et à choisir le type qui va bien.
De prime abord, je pense qu'en prenant un double, tu dois pouvoir y stocker tous les autres types sans perte (tu n'as quand même pas de long double en code d'erreur ?)
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#5 | |||
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
En fait je travaille sur un projet existant, ma nouvelle couche doit s'intégrer au projet. Pour ensuite pouvoir être extraite et réutiliser dans différent projets.
Et j'ai regarder, mais du coup moi j'utilise le compilateur C18. Comment je peut trouver le document qui m'indiquera les normes pour ce compilateur? Citation:
Et en fait je viens de penser à ça ! Si j'ai une fonction qui me renvoi rien (void), est ce que je peux écrire : Code C :
le compilateur ne vas pas me hurler dessus à la compilation ??? je pense que si ! :/ |
|||
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Je me souviens que la documentation de C18 te donne la liste des différences entre ce qu'il fait et ce que demande la norme ISO. Voir ici :
http://www.microchip.com/stellent/id...cName=en010014 Document : MPLAB C18 C Compiler User's Guide and Release Notes Partie : Appendix B. ANSI Implementation-defined Behavior Oui, le compilo va hurler. Tu peux utiliser une zone que tu alloues comme nécessaire, et tu y accèdes avec un pointeur void*. Il suffit au moment de la lecture de savoir le type de données à lire pour caster void* en type*.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#7 |
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Okay okay!! bon je vais lire tous ça!! Ça va surement m'apporter un peu de réponses !
Par contre je comprend pas quand tu parles d'accéder à une zone mémoire avec le pointeur void?? Pourrai tu me faire un mini exemple s'il te plait!? merci d'avance !!! |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Code :
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Okay merci pour l'exemple !!
Est ce que cela veut dire que je peux faire cela : Code C :
|
||
|
|
00
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Non, tu es bien obligé de caster le pointeur void* pour y mettre des choses. De plus, tu veux modifier le contenu du pointeur et non le pointeur lui-même.
Code :
J'ai essayé de faire un bout de code dans le genre. C'est la première idée qui m'est venu en voyant ton dernier extrait de code. Je ne sais pas si c'est une bonne idée, mais ça pourrait peut-être t'aider Code :
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||||
|
10
|
|
|
#11 |
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Merci bcp pour l'exemple!
Je trouve ça pas mal comme solution, ça va pouvoir s'adapter je pense a mon projet. Cela me permet d'avoir une fonction de gestion d'erreur qui peut prendre n'importe quel type en entrée. C'est juste dommage que je dois appliquer un cast dans le main, mais je ne vais pas avoir le choix! merci encore pour l'aide. ![]() si tu as d'autre idées, je t'en prie, fait toi plaisir !!!!! |
|
|
00
|
|
|
#12 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Ah oui avec les void*, le cast est obligatoire. Tu peux le cacher, avec une macro :
Code :
Code :
Code :
J'espère que la solution sera aussi bonne une fois testée qu'elle n'en a l'air de prime abord. Tu me diras ce que ça a donné, ça m'intéresse !
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||||||
|
00
|
|
|
#13 |
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Merci encore pour le temps passé sur mon sujet!
Je ne connaissais pas c'est mécanisme de macro, enfin le fait d'inclure une fonction dans la macro !! C'est cool ça!! ça peut permettre un sacré allègement du code dans certain cas!! Pour l'instant je suis dans la phase de conception de ma couche d'abstraction qui doit se terminer fin aout. Je dois mettre tout au point sur papier pour ensuite passer au développement et du coup avoir un minimum de debug à faire. Du coup le développement ne viendra pas avant le mois d'octobre, car je vais être mis avant sur un autre projet pendant septembre, mais no problem je te donnerai un suivis de cette méthode! C'est la moindre des choses ^^ Merci encore! |
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Tu fais ce que tu veux avec une macro
Un ami m'a montré des macros utilisées dans le noyau Linux pour faire un for sur les éléments d'une liste chaine. Et du coup, dans le code, tu as un truc du genre : Code :
Ton pré-processeur remplace juste la macro par ce que tu lui demandes, avant la compilation. Tu peux faire ce que tu veux, je le répète ![]() D'ailleurs, il y a une option de gcc pour voir le code tel qu'il est après le passage du pré-processeur : http://gcc.gnu.org/onlinedocs/gcc/Pr...r-Options.html Je n'ai jamais essayé, mais ça peut-être intéressant de regarder un jour comme nos macros sont remplacées. PS : je crois que la possibilité de mettre plusieurs paramètres à une macro est une possibilité du C99 et non du C89/90. A voir si C18 est OK de le faire aussi.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||
|
00
|
|
|
#15 | |
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Salut,
je pense qu'il s'agit d'une très très mauvaise idée de passer des entiers sur des float/double/long double. Je ne connais aucun système qui gère ses erreurs sur des réels. La manipulation des nombres réels devrait supposer une analyse numérique pour mesurer la propagation des erreurs de calculs. Pour reprendre la norme citée plus haut, je souligne : Citation:
|
|
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Euh.... Oui je pense qu'on est tous d'accord pour dire que les conversions de types posent beaucoup de problèmes, surtout pour mettre des flottants dans des entiers ou l'inverse. Si tous les codes sont entiers, on peut éventuellement tout mettre dans un unsigned long mais quid des nombres négatifs ? Pour ça que la technique du void*, bien que lourde, permet de vraiment conserver le code retour. La bonne technique serait de mettre des normes de développement sur le projet pour que les retours soient uniformisées pour toutes les fonctions.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#17 | ||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#18 | |||||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Le code suivant me donne les warnings indiqués (avec MinGW) :
Code :
Citation:
Citation:
Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|||||
|
00
|
|
|
#19 | ||||||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Citation:
Citation:
Ca reste très très lourd. Ce que je veux dire, c'est que ça implique de trimbaler l'information de type. A ce moment autant partir sur une solution de type : Code :
|
||||||
|
|
00
|
|
|
#20 | |||
|
Invité de passage
![]() JeanLouis Ingénieur développement matériel électronique Inscription : juillet 2012 Messages : 26 ![]() |
Salut !
Cooooll !!! Je reviens faire un tour sur DVP, et je vois que mon sujet s'enrichit Merci pour les messages, j'en apprend beaucoup! Citation:
Je ne connais pas très bien c'est mécanisme, je vais aller lire quelques trucs la dessus. Mais je veux bien que tu m'explique l'idée please !! Je pense que oui je vais devoirs limiter les types de retours des drivers a quelqu'un sinon ça sera ingérable. Comme j'ai déjà dit, le but est de simplifier le travail dans les projets futur, en cas de changement de matériel avoir le moins de changement possible dans toutes mes couches logiciel. Et donc si mon driver que je viens de changer renvoi un int alors que celui d'avant renvoyait un bool, bah j'aimerai que ça le gère de façon invisible !! merci encore pour les pistes en tous cas!!! |
|||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com