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 :

Difficultés pour afficher un pixel à 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 Difficultés pour afficher un pixel à l'écran
    Je débute en C avec Turbo C++ sur un vieux 486 ou 386 (donc sous dos).
    J'aimerais pouvoir afficher autre chose que du texte (des pixels, des lignes, des cercles etc...). Apparemment, c'est à ça que sert graphics.h mais mon code ne fonctionne pas quand je veux initialiser le mode graphique : un écran noir apparaît que je ne peux plus quitter qu'en réamorçant...De toute façon j'ai l'habitude.

    J'ai également essayé de faire ça en assembleur. J'arrive à passer en mode 13H (la taille du texte en témoigne quand je compile) mais si j'essaie d'afficher un simple pixel(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *ecran = (char *) (A0000000L);
    void pset(int x, int y, unsigned char couleur)
    {
    ecran [(320*y)+x] = couleur;
    }
    et ensuite, après être passé en mode graphique, Pset(20,20,12); par exemple...), celui-ci n'apparait pas quand je teste, alors que le mode 13 est bien activé.
    Je suis un Ultra débutant et ce code est emprunté à un cours de C.
    Si j'ai compris mon cours, en attribuant la couleur du pixel à une variable pointée sur la mémoire graphique, ça affiche un pixel de cette couleur mais vu comme je comprends les choses...

    J'aimerais que quelqu'un m'aide ou me dise si je dois trouver un langage plus simple, le C étant peut-être trop compliqué. :

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Montre-nous le code que tu utilises pour initialiser le mode graphique.

    PS: Mais non, le C c'est super, au début on galère mais après
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    Membre régulier Avatar de Hypnos
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 87
    Points : 108
    Points
    108
    Par défaut
    paix et félicité,

    je confirme, c'est plus difficile au début qu'un autre langage (à part l'ASM), mais après quand tu sait déchiffrer la syntaxe, c'est un langage génial qui te permet de faire des tas de choses.
    Errare humanum est ... sed humanus naturae erratum est.

  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
    Voilà le code que j'utilise (emprunté à mon cours)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void screen (unsigned int mode)
    {
    asm {
    MOV AX, mode
    INT 0x10
    }
    }
    et il fonctionne en tout cas : si j'affiche du texte, la page entière contient 25 lignes et 40 colonnes (chaque caractère faisant 8 pixels de large et 8 de haut espaces vides compris, 8*40 = 320 et 8*25 = 200. Je suis donc en 320*200).
    Merci pour les encouragements!

  5. #5
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Tu compiles bien ton programme dans le modèle Compact, Large ou Huge ? Si tu es en Small ou Medium, il faudra que tu rajoutes, dans ton code C du post initial, l'attribut far au pointeur.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  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
    Je ne savais pas qu'il existait différents modèles de compilation (ni ce que ça veut dire) mais j'ai un peu cherché. Je compilais en Small. J'ai essayé en Large et j'ai modifié mon emploi de pset dans le main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i2 = 0; i2<=200; i2++)
    {
    for (i = 0; i<=320; i++)
    pset (i, i2, i);
    }
    Le résultat est surprenant : au lieu de remplir l'écran avec des lignes de pixels de couleurs différentes (de 1 à 200), j'ai ça...
    Sur l'écran s'affichent, au lieu d'un pixel à chaque fois que j'en demande un, 8 pixels noirs ou blancs représentant chacun 1 bit. Et comme chaque pixel théorique prend la place de 8, j'ai à chaque fois 8 lignes avec le même "motif binaire".
    J'éssaye ici de faire un aperçu textuel (pas trop long quand même):

    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000001000000010000000100000001
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000010000000100000001000000010
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    00000011000000110000001100000011
    etc avec 100,101,110,111,1000...
    Chaque 1 représente un pixel blanc et chaque 0 un noir.
    Alors peut-être que j'ai mal compris vos explications ou que j'ai fait une erreur?
    (Remarque : j'ai essayé entretemps de transposer ce programme en QBasic et en mode 13, ça marche, mais en mode 12, le même problème d'affichage se pose : des pixels noirs et blancs etc...).

  7. #7
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut Re: Difficultés pour afficher un pixel à l'écran
    Citation Envoyé par Bubonik software
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *ecran = (char *) (A0000000L);
    Je n'avais pas fait attention à cette initialisation bizarre. Essaye :

    En modèle Compact, Large ou Huge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *ecran = (char*) MK_FP(0xA000, 0x0000);
    Si tu laisse en Small (recommandé, car cela augmentera les performances) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char far *ecran = (char far*) MK_FP(0xA000, 0x0000);
    MK_FP est une macro dans dos.h.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  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
    Je viens d'essayer ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char far *ecran = (char far *) MK_FP(0xA000, 0x0000);
    mais j'obtiens un résultat similaire.
    Je dois avoir une erreur autre part...
    Au fait, petite question : à quoi sert le "0x" devant les nombres du style A000 et autres? Est-ce pour indiquer qu'ils sont en hexadécimal?

  9. #9
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Le 0x sert, en effet, à indiquer le mode hexadécimal.

    Sinon je viens de faire le petit programme suivant, qui fait ce que tu cherches à faire (testé sous Win2000 avec Turbo C++ 1.01) :
    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
    #include <stdlib.h>
    #include <dos.h>
    #include <conio.h>
     
    void initmode(int mode)
    {
      union REGS r;
      r.x.ax = mode;
      int86(0x10, &r, &r);
    }
     
    void putpixel(int x, int y, unsigned char couleur)
    {
      static char far* ecran = (char far*) MK_FP(0xA000, 0x0000);
      ecran[x + y * 320] = couleur;
    }
     
    int main()
    {
      int x, y;
      initmode(0x13);
     
      for (y=0; y<200;y++)
        for (x=0; x<320; x++)
          putpixel(x, y, y);
     
      getch();
      initmode(0x03);
      return EXIT_SUCCESS;
    }
    Essaye-le et dis-nous si celui-ci fonctionne.

    PS: Pour le mode 12h, c'est normal que cela ne fonctionne pas, l'organisation de la mémoire est bien différente et est extrêmement complexe.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  10. #10
    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
    Oui! Il fonctionne parfaitement!
    C'est très sympa de m'avoir aidé!
    par contre,
    PS: Pour le mode 12h, c'est normal que cela ne fonctionne pas, l'organisation de la mémoire est bien différente et est extrêmement complexe.
    Je suis un peu déçu d'apprendre ça parce-que ce mode m'intéressait...Enfin, ce n'est pas grave.
    Merci encore!

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

Discussions similaires

  1. [VxiR2] Difficultés pour afficher les bons resultat
    Par coolmek dans le forum Webi
    Réponses: 4
    Dernier message: 30/04/2012, 13h25
  2. Difficultés pour afficher une fenetre
    Par archipel dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 17/05/2009, 09h49
  3. Réponses: 3
    Dernier message: 25/08/2006, 15h57
  4. afficher un pixel à l'écran
    Par djamal_internet dans le forum C++
    Réponses: 5
    Dernier message: 15/06/2006, 09h05
  5. Pb pour afficher une page selon la résolution de l'écran
    Par magic8392 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/10/2005, 11h35

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