Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment :
Réassort du coffret Pokémon 151 ...
Voir le deal

Questions souvent posées (FAQ)

Aller en bas

Questions souvent posées (FAQ) Empty Questions souvent posées (FAQ)

Message  -ed- Lun 26 Mai 2008 - 21:09

J'aimerais savoir comment on peut obtenir les dimensions d'une console (= sa taille) via une fonction (portable ou non) et comment les afficher ?!

J'ai entendu parlé de la fonction suivante ...
gettextinfo()
... qui fonctionnerait avec une structure ...
struct text_info ti;
... mais je ne sais pas m'en servir !

Je te renvoie donc aux liens cités dans le premier message de ce forum (CONIO ressources).

Bon ben je pense avoir trouvé comment enregistrer les dimensions dans ti :
Code:

  struct text_info ti;
  gettextinfo(&ti);

Code:

/* in conio2.h */
struct text_info
{
  unsigned char screenheight; /* hauteur de l'écran */
  unsigned char screenwidth; /* largeur de l'écran */
};

  struct text_info *ti;
  gettextinfo( ti );
  cprintf ("Dimensions de l'écran : %d x %d\r\n", ti->screenwidth, ti->screenheight);
Euh, non. Comportement indéterminé (tu passes une valeur non définie à une fonction, tout peut arriver).

Ta première idée était la bonne :
Code:

  struct text_info ti;
  gettextinfo( &ti );
  cprintf( "Dimensions de l'écran : %d x %d\r\n", ti.screenwidth, ti.screenheight );

En fait si je demandais cela, c'est que je voulais faire une fonction qui centre du texte. J'ai essayé de coder la version bêta avec ce que tu m'as donné, mais cela ne marche pas. J'ai déjà corrigé pas mal d'erreurs mais pour les quelques qui restent, je sèche !
Code:

#include <stdio.h>
#include <stdlib.h>
#include <conio2.h>

void centrer (char *texte[])
{
  long longueur = 0;
  long espace = 0;
  int i = 0;

  struct text_info ti;
  gettextinfo (&ti);

  longueur = strlen (*texte);

  espace = ti.screenwidth - longueur;

  for (i = 0; i < espace / 2; i++)
  {
      printf (" ");
  }
  printf ("%s", *texte);
}

int main (void)
{
  char texte[] = "Texte";
  centrer (&texte);

  getch ();
  return 0;
}
Lorsque j'aurai réussi à faire marché celle-çi, je compte l'améliorer en permettant au programmeur de l'appeler de cette manière :
centrer("Texte");
et en renvoyant un message d'erreur dans la compilo lorsque espace est négatif (enfin si c'est possible) !!!

Code:
ti.screenwidth - longueur = espace;
Ceci n'a aucun sens. Une expression n'est pas une L-value (partie gauche d'un affectation).

Je rappelle que l'affectation se fait de droite à gauche. En langage algorithmique, le symbole de l'affectation est '<-'

Code:
a <- 2

"Mettre la valeur 2 dans la variable a."

Tu veux probablement dire

Code:
espace = ti.screenwidth - longueur;

Pour centrer un texte entre MIN et MAX, sur une ligne, on fait :

x = MIN + ((MAX - MIN - len(texte))/2)

x état le la position du début du texte.

Ici, MIN valant 0, on simplifie en

x = 0 + ((MAX - 0 - len(texte))/2)

soit

x = (MAX - len(texte))/2

Oui mais je tiens à utiliser la manière avec laquelle j'ai procédé !

J'ai corrigé l'opération (je ne sais même pas pourquoi j'avais fait comme ça !) mais apparemment il y a un problème avec l'appel de la fonction !

Sinon est-t-il possible de faire les améliorations que j'ai cité dans mon dernier message ?


Pourquoi un paramètre char *texte[] pour un simple texte ? Il suffit de mettre
Code:
void centrer (char *texte)
voire
Code:
void centrer (char const *texte)
non ?

Ceci fonctionne :
Code:

#include <stdio.h>
#include <string.h>
#include <conio2.h>

void centrer (char const *texte)
{
  long longueur = 0;
  long espace = 0;
  int i = 0;

  struct text_info ti;
  gettextinfo (&ti);

  longueur = strlen (texte);

  espace = ti.screenwidth - longueur;

  for (i = 0; i < espace / 2; i++)
  {
      printf (" ");
  }
  printf ("%s", texte);
}

int main (void)
{
  char texte[] = "Texte";
  centrer (texte);

  return 0;
}

Et pour le message d'erreur, c'est pas possible ?

Quel message d 'erreur ?

Ben le message d'erreur serait que lorsque espace est négatif, le compilo renvoie un message d'erreur ! Sinon, si ce n'est pas possible, je peux faire un truc qui empêche le centrage si espace est négatif :
Code:

fonction
{
 récupèration des dimensions de la console;
 calcul de la longueur du texte;
 calcul de l'espace libre;

 si espace est inférieur à 0
 {
  centrage
 }
}

Je ne comprend pas très bien. Pourquoi espace serait négatif ? Parce que le texte est tellement grand qu'il ne tient pas dans la largeur ? Il faudrait peut être s'en préoccuper avant :
Code:

fonction
{
 récupèration des dimensions de la console;
 calcul de la longueur du texte;

 si longueur du texte est inférieur à largeur console
 {
  calcul de l'espace libre;
  centrage
 }
 sinon
 {
  ca va mal...
 }
}
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser