Ncurses
Discutez d'informatique ici !
-
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

-
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 !
-
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:
-
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 !
-
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 !
-
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 jobtiens 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 !
-
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

-
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 !
-
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:
-
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 !
-
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 !
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités