[C] Fonction gotoligcol

Fonction gotoligcol [C] - C - Programmation

Marsh Posté le 09-11-2012 à 22:03:10    

Bonjour,
 
J'ai une question assez bête je suppose, voici déjà mon code :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. void gotoligcol( int lig, int col )
  5. {
  6.     COORD mycoord;
  7.     mycoord.X = col;
  8.     mycoord.Y = lig;
  9.     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), mycoord );
  10. }
  11. int main()
  12. {
  13.     printf("A A" ); printf("\nA la ligne" );
  14.     gotoligcol(0, 1); printf("B" );
  15. }


 
Bon but est d'afficher :
 
ABA
A la ligne

 
Mais ce qui s'affiche est :
 
ABA
 
Le problème est donc que "A la ligne" ne s'affiche pas sur la console, j'en déduis que l'on ne peut pas afficher ce qui est après les caractères insérés par gotoligcol (ici le "B" ?)
C'est très ennuyeux, ou alors je suis à côté de la plaque ?
 
Si quelqu'un pouvait m'éclairer à ce sujet s'il vous plait, merci  :??:  

Reply

Marsh Posté le 09-11-2012 à 22:03:10   

Reply

Marsh Posté le 09-11-2012 à 23:22:09    

J'ai compilé, exécuté, et...

B
C:\clang>gcc -o gotol.exe gotol.c
 
C:\clang>gotol
A A
A la ligne


Il y a bien un B en (0, 1) :D
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-11-2012 à 23:29:01    

Mon problème est d'afficher ce qu'il y a après en fait, le "B" s'affiche en effet très bien, c'est le principe de la fonction :D

Reply

Marsh Posté le 09-11-2012 à 23:29:27    

Tiens, voici quelques fonctions de base utiles dans ce contexte:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <windows.h>
  5. // handle global pour la console
  6. static HANDLE hConsole = NULL;
  7. static SHORT  ConsoleWidth  = 0;
  8. static SHORT  ConsoleLength = 0;
  9. static SHORT  CursorStartX  = 0;
  10. static SHORT  CursorStartY  = 0;
  11. bool InitConsole() {
  12.     hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  13.     if (hConsole != INVALID_HANDLE_VALUE) {
  14.         CONSOLE_SCREEN_BUFFER_INFO cBufferInfo;
  15.         if (GetConsoleScreenBufferInfo(hConsole, &cBufferInfo)) {
  16.             ConsoleWidth  = cBufferInfo.dwSize.X;
  17.             ConsoleLength = cBufferInfo.dwSize.Y;
  18.             CursorStartX  = cBufferInfo.dwCursorPosition.X;
  19.             CursorStartY  = cBufferInfo.dwCursorPosition.Y;
  20.             return true;
  21.         }
  22.     }
  23.     return false;
  24. }
  25. bool ClrScrn(void) {
  26.     COORD coord = {0};
  27.     DWORD written;
  28.     FillConsoleOutputCharacter(hConsole, TEXT(' '), ConsoleWidth * ConsoleLength, coord, &written);
  29.     SetConsoleCursorPosition(hConsole, coord);
  30.     CursorStartX  = 0;
  31.     CursorStartY  = 0;
  32.     return (written == ConsoleWidth * ConsoleLength);
  33. }
  34. void GotoXY(int x, int y) {
  35.     COORD coord = {x, y};
  36.     SetConsoleCursorPosition(hConsole, coord);
  37. }
  38. void GetXY(SHORT *x, SHORT *y) {
  39.     CONSOLE_SCREEN_BUFFER_INFO  csbInfo;
  40.     GetConsoleScreenBufferInfo(hConsole, &csbInfo);
  41.     *x = csbInfo.dwCursorPosition.X;
  42.     *y = csbInfo.dwCursorPosition.Y;
  43. }
  44. void ClrEol() {
  45.     COORD curpos;
  46.     DWORD written;
  47.     GetXY(&curpos.X, &curpos.Y);
  48.     FillConsoleOutputCharacter(hConsole, TEXT(' '), ConsoleWidth - curpos.X, curpos, &written);
  49.     GotoXY(curpos.X, curpos.Y);
  50. }
  51. int main() {
  52.     if (InitConsole()) {
  53.         //Ton code ici
  54.         return (EXIT_SUCCESS);
  55.     }
  56.     return (EXIT_FAILURE);
  57. }

Ca marche très bien chez moi avec gcc.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-11-2012 à 23:32:04    

dalk64 a écrit :

Mon problème est d'afficher ce qu'il y a après en fait, le "B" s'affiche en effet très bien, c'est le principe de la fonction :D


Probablement parce qu'il ya pas un fflush(stdout); après le printf("\nA la ligne" ); qui n'a pas de \n final (et donc pour lequel le flush du buffer n'est pas automatique).
 
A+,


Message édité par gilou le 09-11-2012 à 23:32:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-11-2012 à 23:49:54    

Merci de votre réponse,
j'ai réessayé avec un fflush(stout); après le printf, mais rien ne change.  
Je précise que je suis débutant dans le domaine.

Reply

Marsh Posté le 10-11-2012 à 00:18:05    

Aucune idée, chez moi ça marche.
Tout au plus je réécrirais le code de manière plus conventionnelle:
printf("A A\n" );  
printf("A la ligne" );
fflush(stdout);
gotoligcol(0, 1);
printf("B" );
 
A+,


Message édité par gilou le 10-11-2012 à 00:20:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed