Ncurses

Discutez d'informatique ici !
Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Mai 2014, 21:10

un exemple
main.cpp
Code: Tout sélectionner
//http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/printw.html#ADDCHCLASS
#include
#include 

int main()
{
  char mesg[]="Just a string";
  int row,col;
  initscr();
  getmaxyx(stdscr,row,col);
  //print a good'ol' board
  for(size_t j=0; j<col;++j){
    mvaddch(0,j,'H');
    mvaddch(row-1,j,'H');
  }
  for(size_t i=0; i<col;++i){
    mvaddch(i,0,'I');
    mvaddch(i,col-1,'I');
  }
  mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
  mvprintw(row-2,0,"This screen has %d rows and %d columns\n",row,col);
  refresh();
  getch();
  endwin();
  return 0;
}


makefile:
Code: Tout sélectionner
#http://mrbook.org/tutorials/make/
all: hello

hello: main.o
   g++ main.o -I /usr/include/ -L /usr/lib/i386-linux-gnu/ -l ncurses -o hello

main.o: main.cpp
   g++ -c main.cpp
la vie est une fête :)



Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 01 Mai 2014, 21:51

Ok merci pour ces réponses fatal.



Par contre (se prépare à prendre une rouste) j'arrive pas à dessiner le plateau è_é

C'est purement graphique, je suis une vraie bille è_é


Le résultat de ma dernière tentative

Code: Tout sélectionner

_______________
|    ||    |
_______________
|    ||    ||    ||   |
_______________
|   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   ||   |





Oui ça se passe de commentaire lol =)

J'avais fais un algo comme ça, parce que ça me semblait bien de construire le plateau ainsi, mais apparemment même au niveau conceptuel j'ai du mal graphiquement è_é

Code: Tout sélectionner
void affichagePlateau(Plateau* P)
{
   int k;
   afficheLigne();
   for(k=0;kcases[k].value);
            if(NB_CASE%(k+1)==0)
            {
               afficheLigne();
            }
   }
}



//afficheLigne en gros ça fait un ____________ précédé et suivi d'un retour à la ligne

Je me suis dis que j'allai afficher une case et dès que j'arrivais sur une fin de ligne j'affiche une ligne et je recommence...

Mais ça a pas l'air d'être ça^^
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 02 Mai 2014, 07:56

Combien de case as-tu par ligne ?

Combien as-tu de lignes ?

Si tu regardes bien ta boucle tu vas de 0 à NB_CASE - 1 il te manque surement le nombre de ligne par exemple :

Code: Tout sélectionner
for (k = 0; k < (NB_LIGNES * NB_CASE); k++) {

}


Je ne comprends pas comment tu peux obtenir la figure ci-dessus avec le code que tu proposes :hein:

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Mai 2014, 09:07

Après une inspiration divine, j'ai remplacé l'espace des cases par un point pour mieux voir ce qui se passait, j'ai aussi un peu modifier l'algo et voici ce que j'obtiens.

_______________
|.||.||.||.||.|
_______________
|.||.||.||.||.|
_______________
|.||.||.||.||.|
_______________
|.||.||.||.||.|
_______________
|.||.||.||.||.|
_______________


C'est un peu déformé parce que c'est pas dans la console, mais c'est bien ça j'ai le nombre de ligne et de case voulu.

Par contre du coup je me retrouve avec deux barres à chaque case Parce que à chaque itération j'affiche la barre de droite et la barre de gauche.
SI je n'affiche que celle de gauche, à la fin il va me manquer celle de droite.


Ah j'ai trouvé en écrivant le problème x), j'ai juste à afficher celle de droite avant de faire mon retour à la ligne, comme quoi parfois en écrivant ces problèmes on trouve la réponses tout seul :d


Résultat final impec =)

Code: Tout sélectionner
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Mai 2014, 10:17

Par contre, maintenant, le but c'est d'arriver à faire une fenêtre avec ncurses pour "afficher" ce plateau. Je vais donc modifier la fonction par la suite.



Mais j'aimerais d'abord comprendre pourquoi la fonction initscr() me retourne une erreur de malloc


Code: Tout sélectionner
void init_curses()
{
   initscr();
   /*start_color();
   init_pair(1,COLOR_WHITE,COLOR_BLUE);
   init_pair(2,COLOR_BLUE,COLOR_WHITE);
   init_pair(3,COLOR_RED,COLOR_WHITE);
   curs_set(0);
   noecho();
   keypad(stdscr,TRUE);*/
}


Code: Tout sélectionner
int main()
{   
   Plateau* P;
   P=initPlateau();
   affichagePlateau(P);
   init_curses();
   wprintw(stdscr, "Hi There !!!");
    wrefresh(stdscr);
   return 0;
}



Mais voilà l'erreur obtenu.

malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Abandon (core dumped)




J'aurais fait un truc de travers ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Mai 2014, 13:59

Elle me tue cette histoire, je comprends pas pourquoi ça me fait ça.

EN gros, si je lance

Ceci, tout se passe bien

Code: Tout sélectionner
int main()
{   
   Plateau* P;
   initscr();
   noecho();
   printw("Hi There !!!");
    refresh();
    getch();
    endwin();
   return 0;
}


Mais si je rajoute ma fonction d'init plateau

Code: Tout sélectionner
int main()
{   
   Plateau* P;
   [COLOR=Red]P=initPlateau();[/COLOR]
   initscr();
   noecho();
   printw("Hi There !!!");
    refresh();
    getch();
    endwin();
   return 0;
}


Alors j’obtiens l'erreur de malloc que j'ai spécifié plus haut [...] Je n'arrive même pas à m'expliquer ce qu'il se passe.

Au début je me suis dis que initscr réservait de l'espace mémoire pour la fenêtre et que peut être il ne fallait pas faire de déclaration directement dans la fenêtre, mais au final que ce soit dans la fenêtre ou en dehors le résultat est le même :mur:


Je sais plus quoi faire ><

Les affichages de test dans initPlateau me montrent bien que le soucis ne vient pas de là, c'est vraiment le malloc qui doit être caché dans initscr qui ne marche pas ou le printw et qui m'affiche un message d'erreur à la place; mais je ne vois absolument pas pourquoi ça me fait ça !!!!
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 02 Mai 2014, 14:19

ben vraisemblablement ton initPlateau c'est naze, peut etre que tu devrais regarder ce que cette méthode fait
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Mai 2014, 14:24

fatal_error a écrit:ben vraisemblablement ton initPlateau c'est naze, peut etre que tu devrais regarder ce que cette méthode fait



Désolé j'ai édité entre temps, mais non le soucis ne vient pas de mon init plateau

Il est de cette forme

Code: Tout sélectionner
void initPlateau
{

   printf("INIT PLATEAU\n");
   Plateau *P=malloc(sizeof(char));
//code d'initialisation
   printf("END INIT\n");
}




A l'affichage il passe bien au main, le problème vient après.
Code: Tout sélectionner
   Plateau* P;
   P=initPlateau();
   initscr();
   noecho();
   printw("Hi There !!!");
    refresh();
    getch();
    endwin();


Code: Tout sélectionner
./TEST INIT PLATEAU
END INIT
TEST: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Abandon (core dumped)


Puis j'ai pas de man pour ce genre de fonctions...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 02 Mai 2014, 14:38

en meme temps si t'assignes un void à un Plateau dont tu n'as pas non plus donné le type... je suis surpris que ton compilateur ne dise rien

edit: et d'ailleurs ton initPlateau ne sert strictement à rien. A part faire des printf, donc tu peux tout aussi bien enlever ta fonction et la remplacer par les instructions qu'elle fait pour trouver laquelle fait planter...

sinon tu utilises gdb.
la vie est une fête :)

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 13:25

par Cliffe » 02 Mai 2014, 14:43

Yep, ta fonction sert à rien. En + y'a fuite de mémoire :ptdr:

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Mai 2014, 14:45

Rahh c'est ma faute pardon, évidemment que mon initPlateau n'est pas un void :mur:


La fonction complète c'est celle là, mais il n'y a pas de soucis dessus, vu que je l'ai testé en affichant chaque case après en console.

Ce qui cloche c'est que lorsque je veux le faire "rentrer" dans ncurses, ça se set à planter...



Genre en console simple ceci s'affiche très bien

Code: Tout sélectionner
Plateau* initPlateau()
{
   printf("INIT PLATEAU\n");
   Plateau *P=malloc(sizeof(char));
   int k;
   int k2;
   int posCase=0;
   for(k=0;kcases[posCase].posV=k2;
         P->cases[posCase].posH=k;
         P->cases[posCase].value='.';
         posCase++;
      }
      
   }
   printf("END INIT\n");
   return P;
}

void afficheLigne()
{
   printf("\n____________________\n");
}

void affichagePlateau(Plateau* P)
{
   int cpt=0;
   int k;
   afficheLigne();
   for(k=0;kcases[k].value);
         cpt++;
         if(cpt==TAILLE_PLATEAU_LARGEUR)
         {
               printf("|");
               cpt=0;
               afficheLigne();
            
         }
   }
}


en donnant le résultat que j'avais montré plus haut. Le problème ne vient pas de la fonction en elle même qui est codé comme il faut, mais de son "interfaçage" si je puis dire avec ncurses.

Code: Tout sélectionner
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
| . | . | . | . | . |
____________________
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 05 Mai 2014, 16:24

J'ai fini par réussir à débugguer, j'avais bel et bien merdé mon malloc, du coup maintenant, je voudrais passer un affichage avec ncurses de mon plateau.


Mais le résultat qui semblait bon en suivant l'algo en console me donne des résultat étranges avec ncurses.


Code: Tout sélectionner
void afficheLigneCurses(WINDOW* win)
{
   wprintw(win,"\n____________________\n");
}


void affichagePlateauCurses(Plateau* P)
{
   WINDOW * ma_fenetre;
   ma_fenetre=newwin(10,5,2,2);
   int cpt=0;
   int k;
   afficheLigneCurses(ma_fenetre);
   for(k=0;kcases[k].value);
         cpt++;
         if(cpt==TAILLE_PLATEAU_LARGEUR)
         {
               wprintw(ma_fenetre,"|");
               cpt=0;
               afficheLigneCurses(ma_fenetre);
            
         }
   }
   wrefresh(ma_fenetre);
   getch();
   delwin(ma_fenetre);
}


Sa ne veut vraiment pas è_é


Le but étant bien sur d'afficher ce plateau de 5x5 avec le contenu des cases.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite