Salut à tous !
J'ai implémenté un programme sur les arbres généalogiques sous Turbo C 3. Je cherche à afficher mon arbre (en mode texte) sur l'imprimante . Est ce qu'il existe une commande qui imprime le contenu de l'écran ?
@++
Ensi
Salut à tous !
J'ai implémenté un programme sur les arbres généalogiques sous Turbo C 3. Je cherche à afficher mon arbre (en mode texte) sur l'imprimante . Est ce qu'il existe une commande qui imprime le contenu de l'écran ?
@++
Ensi
Tu peux simuler l'appui de la touche Impr Ecran en faisant :
Mais j'ignore si ça fonctionne, surtout si ton application DOS tourne sous Windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 union REGS r; int86(0x05, &r, &r);
Si ça ne marche pas, tu devras prendre en charge toi-même l'impression.
Salut
Si tu arrives à l'afficher sur ton écran, il doit être possible de l'écrire dans un fichier texte par l'instructionEnsuite tu l'imprime via un bloc-note.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fprintf(FILE....);
Voila....
J'ai pensé à utiliser la commande fprintf vers un fichier que j'imprime par la suite .
Seuelement mon arbre généalogique contient des cadres faits par des caractères ascii et ces cadres sont placés par gotoxy() .
C'est bizarre tout de même que turbo C n'a pas prévu la capture de la fenêtre texte vers l'imprimante ?
@+
Salut
Si la solution de Anomaly ne fonctionne pas, y'a bien une autre solution mais qui me parait démesurée pour ton affaire. C'est de lire les octets en mémoire vidéo puis de les copier dans un fichier.
En mode texte, l'adresse de la ram vidéo est (normalement) 0xB800:0000. En offset 0 tu as le caratère (en haut à gauche) et à l'offset 1 tu as la couleur (+background) du caractère. Donc aux offsets pairs tu as les caractères, et aux offsets impairs la couleur des caractères.
Donc le but de cette fonction est de lire juste les caractères en ram vidéo puis de les sauver dans un fichier.
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 /* Fonction de copie d'écran texte dans un fichier */ unsigned impr_ecran(void) { FILE *copy_ecran ; unsigned char far *ptr_ecran = 0xB8000000 ; // Base de la ram vidéo unsigned i, j ; char car ; copy_ecran = fopen("cpyecran.txt", "w+") ; // Ouverture du fichier texte if(copy_ecran==NULL) return 0 ; // Cas où erreur for(i=0; i<25; i++) // Parcour les 80x25 caractères de l'écran { for(j=0; j<80; j++) { car = *(ptr_ecran+(2*j + 160*i)) ; // Lecture du caractère fprintf(copy_ecran, "%c", car) ; // Copie dans le fichier // couleur = *(ptr_ecran+(2*j + 160*i)+1) ; } fprintf(copy_ecran, "\n") ; // On ajoute le CRLF } fclose(copy_ecran) ; // Fermeture du fichier return 1 ; }
Nota : Faire attention à l'init du pointeur d'écran, il est préférable de faire un caste genre (unsigned char far*)0xB8000000.
Voila.....
Re-salut
J'ai oublié juste une petite chose.![]()
Les caractères ascii sous dos comme l'accentuation (é,è,à etc..) et l'entourage des fenêtres ne sont pas affichés correctement sous windows. Donc il te faudrat surement retravailler ton fichier pour voir apparaître ton arbre généalogique.
Ou autre solution, les intercepter au moment de l'écriture dans le fichier et les échanger par d'autres...![]()
Voila...
Salut Elijha,
Je te remercie énormémont pour ton code dont j'ai bien saisit le principe.
Seulement en faisant :
Le compilateur me signale une erreur au niveau de la fonction impr_ecran() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void main () { printf ("bonjour"); impr_ecran(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 unsigned char far *ptr_ecran = 0xB8000000 ; // Base de la ram vidéo
Error Name00.cpp 10:cannot convert 'unsigned long' to 'unsigned cahr far*'
Je pense que nous ne sommes pas loin de notre but !
@++
ensi
Salut
Peut-être en essayant le castesoit en utilisant MK_FP(sous borland) toujours avec le caste
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000 ;MK_FP permet de "fabriquer" un pointeur à l'aide d'un segment et d'un offset au format Intel (dans include dos.h).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 unsigned char far *ptr_ecran = NULL; // dans le main, construit un pointeur du segment et de l'offset ptr_ecran = (unsigned char far*)MK_FP(0xB800,0x0000) ;
Sinon je crois qu'il faut changer le type du pointeur (far ou huge) en fonction du model de compilation choisit (small, large ou huge).
Voila...
Hum, Hum !
Aurais-tu lu mon premier post jusqu'au bout ?
Je sais pas si c'est le problème, mais je crois que cela pourrait arranger les chosesEnvoyé par Elijha
![]()
Revoila....
C'est gagné !
J'ai tapé ce code :
et j'ai retrouvé ma capture d'écran .
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 #include <stdlib.h> #include <conio.h> #include <stdio.h> /* Fonction de copie d'écran texte dans un fichier */ unsigned impr_ecran(void) { FILE *copy_ecran ; unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000 ; // Base de la ram vidéo unsigned i, j ; char car ; copy_ecran = fopen("c:\\k\\cpyecran.txt", "w+") ; // Ouverture du fichier texte if(copy_ecran==NULL) return 0 ; // Cas où erreur for(i=0; i<25; i++) // Parcour les 80x25 caractères de l'écran { for(j=0; j<80; j++) { car = *(ptr_ecran+(2*j + 160*i)) ; // Lecture du caractère fprintf(copy_ecran, "%c", car) ; // Copie dans le fichier // couleur = *(ptr_ecran+(2*j + 160*i)+1) ; } fprintf(copy_ecran, "\n") ; // On ajoute le CRLF } fclose(copy_ecran) ; // Fermeture du fichier return 1 ; } void main () { printf ("bonjour"); impr_ecran(); getch(); }
Enfin , au sujet de la "caste" : s'agit-il d'une sorte de convertissement ?
Merci bien Elijha et Anomaly !
ensi...
Salut
Globalement le caste permet de spécifier ponctuellement le type de donnée pointée.Envoyé par ensi
Dans notre cas, il permet de dire au compilo que 0xB8000000, est une adresse qui pointe sur un octet. D'oùce qui implique qu'avec ce pointeur tu ne pourras lire qu'un octet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000
Autre exemple; Maintenant disons que tu veuilles copier un octet dans un entier. On auraDans ce cas le compilo transforme ponctuellement ta variable char en int le temps de la copier dans var_int. Tu peu le faire sans le caste, mais le compilo l'implémente automatiquement. Les problèmes sont visibles sur les pointeurs qui n'ont pas de type vraiment définis comme dans le cas de lui attribuer une adresse hard.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 unsigned char var_char = 5; unsigned int var_int = 0 ; // Dans le main var_int = (unsigned int)var_char ;
Voila en "gros" le caste
Partager