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 :

Problème d'affichage d'une chaîne à l'écran


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut Problème d'affichage d'une chaîne à l'écran
    Bonjour. J'ai cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void aide (char *hlp)
    {
    char *titre = "           AIDE DU LOGICIEL : \n\n";
    mode_ecran (0x00);
    strcat (titre, hlp);
    gotoxy (1, 1);
    printf ("%s", titre);
    gotoxy (10, 1);
    printf ("Appuyez sur une touche pour continuer");
    getch ();
    mode_ecran (0x13);
    txt_col (0, 0); /*txt_col est une fonction qui utilise textcolor et textbackground */
    clrscr ();
    }
    et quand je l'appelle ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        aide ("      En cliquant sur le quadrillage, vous placez des points. Ces points vous indiquent les angles du niveau de la maison que vous tracez. Placez vos points dans l'ordre puis cliquez sur OK et des instructions vous seront fournies.");
    Mais ce que j'obtiens n'est pas ce que j'avais prévu :
    à la place du message "appuyez sur une touche pour continuer", j'ai un clone du message titre (" En cliquant sur le quadrillage, etc....").

    J'ai dù faire quelque chose de mal, mais quoi?

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    teste en enlevant le
    Le buffer de stdin n'est peut-être pas vide, et le getche est effectué et donc tu ne vois rien !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Points : 125
    Points
    125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *titre = "           AIDE DU LOGICIEL : \n\n"; 
    /* ... */
    strcat (titre, hlp);
    Ces lignes sont plus que douteuses:
    - une chaîne de caractères comme celle-ci ne devrait pas être modifiée.
    - si elle pouvait tu n'alloues pas la mémoire nécessaire pour faire la concaténation.

    Voici une version qui me semble plus judicieuse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void aide (char *hlp) 
    {
      mode_ecran(0x00);
      cprintf("           AIDE DU LOGICIEL : \n\n%s", hlp);
      gotoxy(10, 1);
      cprintf("Appuyez sur une touche pour continuer");
      getch();
      mode_ecran(0x13);
      txt_col(0, 0);
      clrscr();
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Merci. Cette solution fonctionne, mais par contre,
    Citation Envoyé par ShootDX
    Ces lignes sont plus que douteuses:
    - une chaîne de caractères comme celle-ci ne devrait pas être modifiée.
    - si elle pouvait tu n'alloues pas la mémoire nécessaire pour faire la concaténation.
    Comment pourrais-je faire une chaîne de caractères que je puisse modifier, et comment allouer la mémoire pour la concaténation ? (parce-que j'ai toujours déclaré toutes mes chaînes comme ça, mais si ça se trouve, je me fourre le doigt dans l'oeil).

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Problème d'affichage d'une chaîne à l'écran
    [Code spécifique à Borland/MS-DOS]

    Citation Envoyé par Bubonik software
    Bonjour. J'ai cette fonction :... et quand je l'appelle ainsi : ... ce que j'obtiens n'est pas ce que j'avais prévu :
    à la place du message "appuyez sur une touche pour continuer", j'ai un clone du message titre (" En cliquant sur le quadrillage, etc....").
    Le principal problème est que tu fais un strcat() sur une chaine litéralle. Ca invoque deux comportements indéfinis:
    • Une chaine littérale n'est pas modifiable
    • Ecriture au delà des limites d'un tableau.

    C'est largement suffisant pour satelliser ton PC...

    D'autre part, je remarque plusieurs bizarreries.
    • Mélange entre accès direct à l'écran et sorties sur stdout.
    • Une possible inversion entre les paramètres de gotoxy()


    Je propose ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include <string.h>
    #include <conio.h>
     
    #define EOL "\n\r"
     
    static void mode_ecran (int x)
    {
       (void) x;
    }
     
    static void txt_col (int t, int b)
    {
       textbackground (b);
       textcolor (t);
    }
     
    void aide (char *hlp)
    {
       char const titre[] = "           AIDE DU LOGICIEL :";
       mode_ecran (0x00);
       txt_col (LIGHTGRAY, BLACK);
       clrscr ();
       gotoxy (1, 1);
       cprintf ("%s", titre);
       gotoxy (1, 2);
       cprintf ("%s", hlp);
       gotoxy (1, 10);
       cprintf ("Appuyez sur une touche pour continuer");
       getch ();
       mode_ecran (0x13);
       clrscr ();
    }
     
    int main (void)
    {
       aide ("En cliquant sur le quadrillage, vous placez des points. "EOL
             "Ces points vous indiquent les angles du niveau de la maison que "EOL
             "vous tracez. " EOL
             "Placez vos points dans l'ordre puis cliquez sur OK et des " EOL
             "instructions vous seront fournies." EOL);
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    En effet, j'avais oublié de préciser : en réalité, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define txt_cur(Y,X) gotoxy (X, Y)
    Mais j'avais modifié un peu mon code avant de poster, pour simplifier mes explications. De même, txt_col fonctionne comme tu l'as deviné, mode_ecran (0x13) équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    asm {
    mov ax, 0x13
    int 0x10
    }
    et mode_ecran (0x00) équivaut à : Mais à quoi sert le mot "static" si je ne programme pas en C++?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Bubonik software
    : Mais à quoi sert le mot "static" si je ne programme pas en C++?
    : : : 'static' n'a rien à voir avec C++

    Ce qualificateur à différentes significations (sémantiques) en C selon le contexte :

    • Placé devant une fonction, il réduit la portée (visibility) de celle-ci à l'unité de compilation (compile unit) courante (pour simplifier, le fichier .c dans lequel elle est définie)
    • Placé devant un objet (variable) situé hors d'un bloc, il réduit sa portée à l'unité de compilation courante.
    • Placé devant un objet défini dans un bloc, il modifie sa durée de vie (duration), pour la rendre égale à celle du programme.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Ah, bon!
    MERCI!!!

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

Discussions similaires

  1. Problème d'affichage d'une chaîne de caractères
    Par bob32 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/06/2008, 22h06
  2. [GD] Problème d'affichage d'une image avec gd2
    Par turini dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h59
  3. Affichage d'une chaîne saisie au clavier
    Par Frenchghost dans le forum Assembleur
    Réponses: 17
    Dernier message: 29/12/2004, 13h11
  4. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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