Draw a line

Hello everyone, I have been searching how to draw a line (horizontal and vertical) using ncurses, but couldn't find any examples. Therefore, I am in a situation I would like to ask for a help. I need to draw two lines: one above Numerical systems and the other beneath 10, 8, 16 and 2. I am struggling to understand how to draw lines using ncurses in mac. I know its a basic question, but cannot understand it:(

Here's my code (whline two commands of 0 and 3 are not working):
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <ncurses.h>
#include <curses.h>

using namespace std;

int main()
{
  initscr();
  int i, n, number, number2, number3, number4, value, nlines, ncols, y0, x0, y, x;
  //WINDOW * win = newwin(nlines,ncols, y0, x0);

  int whline(WINDOW * win, chtype ch, int m);
  //getmaxyx(WINDOW *, y, x);
  string result;
  whline(win, 0, 3);
  cout << "   " << "** Numerical systems **" << endl << endl;
  cout << "\"10\"" << "\t" << "\"8\"" << "\t" << "\"16\"" << "\t" << "\"2\"" << endl;
  whline(win, 0, 3);
  endwin();
  for(i=0, n=0; i<=15 && n<=15; i++, n++)
  {
    ostringstream convert;
    switch(n) {
      case 0:
        value=0/2;
        break;
      case 1:
        value=1%2;
        break;
      case 2:
        number=2/2;
        number2=1/2;
        convert << number;
        convert << number2;
        result = convert.str();
        value = stoi(result);
        break;
      case 3:
        number=3%2;
        number2=1%2;
        convert << number;
        convert << number2;
        result = convert.str();
        value = stoi(result);
        break;
      case 4:
        number=4%2;
        number2=2%2;
        number3=1%2;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 5:
        number=5%2;
        number2=2%2;
        number3=1%2;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 6:
        number=6%2;
        number2=3%2;
        number3=1%2;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 7:
        number=7%2;
        number2=3%2;
        number3=1%2;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 8:
        number=8%2;
        number2=4%2;
        number3=2%2;
        number4=1%2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 9:
        number=9%2;
        number2=4%2;
        number3=2%2;
        number4=1%2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 10:
        number=10%2;
        number2=5%2;
        number3=2%2;
        number4=1%2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 11:
        number=11%2;
        number2=5%2;
        number3=2%2;
        number4=1%2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 12:
        number=12%2;
        number2=6%2;
        number3=3%2;
        number4=2/2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 13:
        number=13%2;
        number2=6%2;
        number3=3%2;
        number4=2/2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 14:
        number=14%2;
        number2=7%2;
        number3=3%2;
        number4=2/2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
      case 15:
        number=15%2;
        number2=7%2;
        number3=3%2;
        number4=2/2;
        convert << number4;
        convert << number3;
        convert << number2;
        convert << number;
        result = convert.str();
        value = stoi(result);
        break;
    }
    printf("  %d \t %o \t %X \t %d \n", i, i, i, value);
  }
}
Last edited on
Doesn't anyone know of ncurses? Then maybe someone can suggest me a forum where people using c++ in mac are gathering?
You are missing the chtype (character type), so if you wanted to draw a single line like __________
you need

int whline(WINDOW *win, chtype ch, int n);

so where you have

 
whline(win, 0, 3);


you need

 
whline(win, ACS_HLINE, 0, 3);


There are a few other things wrong with this code including a failure to refresh(), no declaration of the WINDOW * and I have no idea what you are trying to do here:

 
int whline(WINDOW * win, chtype ch, int m);


Oh yes; and endwin(); ends curses mode which in essence quits ncurses and printf just dumps stuff to the terminal after you have exited ncurses mode.

And; you need to use printw() rather than printf() when you are in curse mode.

What you have done here is initialised ncurses then exited it and then you are outputting to the standard terminal, so you have no hope of drawing a line whatsoever.

Finally, don't use std::cout in ncurses mode or bad things will happen.

Basically, sorry dude, but there are more things wrong with this code than right with it.


Last edited on
Perhaps this might help:

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
#include <ncurses.h>

int main() {
	//Initialise curses mode
	initscr();

	//get the width of the terminal
	int maxx = getmaxx(stdscr);
	
	for(int i =0; i < 20; ++i) {
		//Print whatever you want here
		mvprintw(i, 0, "Line: %d", i / 2 +1);
		++i;
		//Then draw a line
		mvhline(i, 0, ACS_HLINE, maxx);
	}

	//Paint the buffer to the terminal window
	refresh();

	//Pause until a key is pressed
	getch();

	//End curses mode		
	endwin();

}


Make sure that you are using a terminal font that knows what a line is and make sure you link to ncurses when compiling

g++ myfile.cpp -Incurses -lncurses

If you want a line top and bottom only then you could do something like
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
#include <ncurses.h>

#define HEADER 3

int main() {
	//Initialise curses mode
	initscr();

	//get the width of the terminal
	int maxx = getmaxx(stdscr);
	
	
	mvprintw(0, 3, "** Numerical systems **");

	mvprintw(1, 1, "\"10\"\t\"8\"\t\"16\"\t\"2\"");
	mvhline(2, 0, ACS_S3, maxx);
	
  
	for(int i =0; i < 10; ++i) {
		mvprintw(HEADER + i, 0, "Line: %d", i +1);
	}

	mvhline(HEADER +10, 0, ACS_S9, maxx);
	
	//Paint the buffer to the terminal window
	refresh();

	//Pause until a key is pressed
	getch();

	//End curses mode		
	endwin();

}
Last edited on
Topic archived. No new replies allowed.