IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

redefinir getchar et putchar


Sujet :

C

  1. #1
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut redefinir getchar et putchar
    Bonjour,

    Pour les besoins d'une console utilisant des caractères custom, j'ai du réécrire avec SDL getchar et putchar. De ce que je connais en embarqué, le fait de réécrire ces fonctions redirige automatiquement le printf vers la fonction réécrite. C'est dû vraissemblablement au fait qu'il n'y a pas de sortie "standard" sur un microcontrôleur, et c'est pourquoi les compilateurs pour l'embarqué sont légèrement différents. Justement, comment fait-on pour remplacer ces fonctions standard par des fonctions custom avec un compilateur pour PC?

    A+

    Pfeuh

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Pour les besoins d'une console utilisant des caractères custom,
    custom ?
    j'ai du réécrire avec SDL getchar et putchar. De ce que je connais en embarqué, le fait de réécrire ces fonctions redirige automatiquement le printf vers la fonction réécrite.
    Il est possible que printf() utilise putchar() (ou fputc()) mais le langage C n'impose rien...

    Justement, comment fait-on pour remplacer ces fonctions standard par des fonctions custom avec un compilateur pour PC?
    Vu du langage C, en fournissant ta propre bibliothèque C. (il est interdit d'avoir 2 fonctions avec lien externe du même nom dans une application).

    Mais sur ta plateforme, il existe peut être un moyen astucieux qui permet de 'désactiver' l'édition de lien avec le putchar() de la bibliothèque standard.

    autre solution, renommer la fonction. avec une macro, on y voit que du feu :

    Dans ton header ("my.h", par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
     
    int my_putchar(int c);
     
    #undef putchar
    #define putchar(a) my_putchar (a)
    mais il faut recompiler la bibliothèque en incluant ce header à la place de <stdio.h>

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Emmanuel Delahaye Voir le message
    custom ?
    Oui, en fait, j'ouvre une fenêtre graphique SDL, j'y gère une fonte 8x8 redéfinissable ainsi que le clavier.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    il est interdit d'avoir 2 fonctions avec lien externe du même nom dans une application
    Je suis sous XP avec codeblocks. J'ai utilisé les prototypes de putchar et getchar et je les ai réécrites sans que celà occasionne un quelconque warning. Elles sont simplement ignorées au profit de celles de stdio.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    autre solution, renommer la fonction. avec une macro, on y voit que du feu :

    Dans ton header ("my.h", par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
     
    int my_putchar(int c);
     
    #undef putchar
    #define putchar(a) my_putchar (a)
    mais il faut recompiler la bibliothèque en incluant ce header à la place de <stdio.h>
    Si j'ai bien compris, il faut faire une copie locale de stdio.h (<stdio.h> devient "stdio.h"), la customiser et la fournir avec la librairie. Il y a la contrainte de modifier les sources qui vont appeler lib à cause de l'include <stdio.h>, mais sinon, ça me va bien comme solution, merci Emmanuel.

    A+

    Pfeuh

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Je suis sous XP avec codeblocks. J'ai utilisé les prototypes de putchar et getchar et je les ai réécrites sans que celà occasionne un quelconque warning. Elles sont simplement ignorées au profit de celles de stdio.
    Ça vient de la façon dont Code::blocks fait l'édition de liens. Sous Visual, tu auras une erreur LNK2005 car il aura trouvé deux définitions de la même fonction (une dans ton code, une dans la libc).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Si j'ai bien compris, il faut faire une copie locale de stdio.h (<stdio.h> devient "stdio.h"), la customiser et la fournir avec la librairie. Il y a la contrainte de modifier les sources qui vont appeler lib à cause de l'include <stdio.h>, mais sinon, ça me va bien comme solution, merci Emmanuel.
    Non, pas du tout.

    - Il ne faut pas modifier <stdio.h>
    - on peut créer un fichier "my_stdio.h" qui contient le code que j'ai indiqué (avec les protections habituelles en plus évidemment)
    - il faut inclure ce fichier dans tous les fichiers sources qui utilisent putchar(), y compris ceux de la bibliothèque (si il en manque un ça ne fonctionnera pas, si c'est sous Windows, laisse tomber, tu n'as pas les sources).
    - il faut tout recompiler.


    C'est pour quelle plateforme ?
    Je suis sous XP
    Laisse tomber, surtout ne modifie rien...

    Ca me parait quand même assez tordu comme manip.

    Pourquoi tu veux redéfinir putchar() ? Tu ne veux pas plutôt faire ton sdl_putchar(), par exemple, qui ferait ce que tu veux avec la fonte que tu veux. Au dessus, tu fais un sdl_printf() à coup de vsprintf() et le tour est joué...

    Avantage, le canal officiel stdout() (putchar() etc.) est toujours en fonction et peut servir au débug...

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Médinoc Voir le message
    Ça vient de la façon dont Code::blocks fait l'édition de liens. Sous Visual, tu auras une erreur LNK2005 car il aura trouvé deux définitions de la même fonction (une dans ton code, une dans la libc).
    OK, ça me paraissait bizarre, même si ça marchait.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pourquoi tu veux redéfinir putchar() ? Tu ne veux pas plutôt faire ton sdl_putchar(), par exemple, qui ferait ce que tu veux avec la fonte que tu veux. Au dessus, tu fais un sdl_printf() à coup de vsprintf() et le tour est joué...
    C'est justement ce que je voudrais éviter, le vsprintf suivi du sdl_putchar. J'ai un paquets de sources qui sont prêts à tourner sur cette console en transformant juste dans leur entête le
    en
    Le "stdio.h" serait bien sûr le <stdio.h> modifié avec les macros dont tu m'as donné l'idée et placé dans le répertoire des différents projets incluant ma lirairie. Ca me parait plus simple et moins source d'erreur que de transformer tous les printf en sdl_printf. Mais tout est envisageable et on n'a peut être pas fait le tour de la question.

    a+

    Pfeuh

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    C'est justement ce que je voudrais éviter, le vsprintf suivi du sdl_putchar. J'ai un paquets de sources qui sont prêts à tourner sur cette console en transformant juste dans leur entête le
    en
    Le "stdio.h" serait bien sûr le <stdio.h> modifié avec les macros dont tu m'as donné l'idée et placé dans le répertoire des différents projets incluant ma lirairie. Ca me parait plus simple et moins source d'erreur que de transformer tous les printf en sdl_printf. Mais tout est envisageable et on n'a peut être pas fait le tour de la question.
    Non, tu n'as pas le droit d'utiliser le même nom (stdio). De toutes façons, tu ne pourras pas recompiler la bibliothèque alors laisse tomber, et fait avec une autre fonction.

    Tu parles d'applications 'console'... Tu veux transformer du code console en application SDL ? Les entrées ne sont pas du tout gérées de la même façon. Quel intérêt ?

    Je ne comprends rien à ce que tu veux faire en définitive.

    Tu devrais commencer par expliquer exactement ce que tu veux faire (1 - Quoi ?), parce que si ça se trouve, on est dans un problème de conception (2 - Comment ?) et pas encore de codage (3) ...

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non, tu n'as pas le droit d'utiliser le même nom (stdio). De toutes façons, tu ne pourras pas recompiler la bibliothèque alors laisse tomber, et fait avec une autre fonction.
    Ok, je viens de constater, un my_printf ira très bien.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Tu parles d'applications 'console'... Tu veux transformer du code console en application SDL ? Les entrées ne sont pas du tout gérées de la même façon. Quel intérêt ?
    J'ai écrit (pour cette console SDL) des fonctions clavier et écran compatibles avec les fonctions standards getchar et putchar. J'ai bien noté que tu préfèrerais un my_getchar et un my_putchar. Je vais aussi devoir faire un my_printf et une saisie de chaine sécurisée.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je ne comprends rien à ce que tu veux faire en définitive.

    Tu devrais commencer par expliquer exactement ce que tu veux faire (1 - Quoi ?), parce que si ça se trouve, on est dans un problème de conception (2 - Comment ?) et pas encore de codage (3) ...
    Le codage des softs est fait depuis belle lurette, ils tournent sur différents micros (NEC 8 bits, PIC24, PIC32 et 8051, en gros de l'IHM de configuration à LCD et joystick) et je dois les faire tourner sur un PC. Je pensais pouvoir le faire avec ma console SDL et une redéfinition de putchar et getchar. Je vais le faire, mais la modification sera simplement plus conséquente que prévu.

    A+

    pfeuh

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. demande explication getchar putchar
    Par minixave dans le forum Débuter
    Réponses: 4
    Dernier message: 07/03/2013, 11h27
  2. getchar() et putchar()
    Par al.spec dans le forum C
    Réponses: 1
    Dernier message: 13/04/2010, 08h42
  3. putchar / getchar and EOF
    Par exhortae dans le forum Débuter
    Réponses: 4
    Dernier message: 31/10/2008, 13h38
  4. getchar() & putchar()
    Par Array dans le forum C
    Réponses: 2
    Dernier message: 19/07/2007, 21h29
  5. getchar(),atoi() et putchar()
    Par otari dans le forum C
    Réponses: 1
    Dernier message: 30/04/2007, 19h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo