我正在编写一个文本编辑器,它使用ncurses来图形化表示数组key_strokes[]
。它是一维的,因此我使用宏INDEX(y*maxx+x)
指向key_strokes
(key_strokes[INDEX]
)中的当前位置。 y
和x
是函数getyx(stdscr, y, x)
返回的终端中的当前坐标,maxx
是函数返回的每行中最大cols数量{ {1}}。该程序运行良好,直到我按退格键,由于某种原因,getmaxyx(stdscr, maxy, maxx)
的值在到达下面的开关后设置为零。这当然会抛弃maxx
,只将它限制在数组的第一个“行”。
用户的击键被捕获为INDEX
。我使用一个开关盒来检查它是否是一个箭头键,退格键,F12等。int key_strokes
和INDEX
被定义为,
maxx
注意我也在使用#define INDEX (y*maxx+x)
unsigned int maxx = 0;
。
cbreak(); noecho(); keypad(stdscr, TRUE);
答案 0 :(得分:1)
确定 key_strokes[]
是否以空终止?
'如果不是,for
循环会将内存中的所有内容复制到上一个单元格,直到达到0.如果maxx
或maxy
正好在0值,它们将被设置为0.
想象一下以下布局:
| key_strokes[0] | key_strokes[...] | key_strokes[n] | maxy | maxx | some_other_var |
| 'v' | 'i' | non-null garbage | 23 | 80 | '\0' |
在'i'之后按下后退后,它将是:
| key_strokes[0] | key_strokes[...] | key_strokes[n] | maxy | maxx | some_other_var |
| 'v' | non-null garbage | 23 | 80 | '\0' | '\0' |
这也可以解释为什么当maxy
被声明为const时,maxx
被设置为0(GCC不会将const
存储在内存中的同一位置)。
为确保key_strokes[]
以空值终止,我建议您将其添加到初始化部分:
memset(key_strokes, 0, sizeof(char) * size_of_key_strokes_array);
答案 1 :(得分:0)
我看不到x和y的类型(即有符号或无符号),但是你计算(无符号整数的y倍和添加x)似乎很有趣。这个表达的类型可能是什么?可能它取决于y的类型。检查条件是否大于或等于零是否合理? (无符号值总是gte为零......)