一、使用ncurses实现键盘无阻塞输入的问题
先看代码:
#include "ncurses.h"
#include <fcntl.h>
int main(int argc, char **argv)
{
int key;
initscr();
crmode();
keypad(stdscr,TRUE);
noecho();
fcntl(0,F_SETFL, O_NONBLOCK);//加这句才能实现非阻塞
clear();
refresh();
while (1)
{
key = getch();
switch(key)
{
case 'w':
break;
case KEY_UP:
break;
default:
break;
}
}
endwin();
return 0;
}
如果没有加fcntl(0,F_SETFL, O_NONBLOCK)函数,程序会 key = getch()处等待用户输入(不用回车)而不是继续往下执行。
二、使用数组作为map容器中value的值
int arr[18][4] = {
{1,0,0,0},
{1,0,0,-1},
{0,0,0,1},
{0,0,0,-1},
{1,0,0,1},
{-1,0,0,0},
{-1,0,0,1},
{-1,0,0,-1},
{1,-1,0,0},
{1,0,0,0},
{0,1,0,0},
{0,-1,0,0},
{1,1,0,0},
{-1,0,0,0},
{-1,-1,0,0},
{-1,1,0,0},
{0,0,1,0},
{0,0,-1,0}
} ;
char arrChar[] = {'i','o','j','l','u',',','.','m','O','I','J','L','U','<', '>', 'M', 't', 'b'};
map<char, int*> n;
n.clear();
for(int i=0;i<18;++i)
{ //int* a=new int[4];
//memcpy(&a[0],&arr[i][0],4*sizeof(int));
//cout << a[0]<< a[1]<< a[2]<< a[3]<<endl;
n.insert(make_pair(arrChar[i],&(arr[i][0])));
}
上面的代码实现的是创建MAP容器使arrChar[]的key对应arr数组的每一行。一开始反了一个错误:
for(int i=0;i<18;++i)
{
int a[4];
memcpy(&a[0],&arr[i][0],4*sizeof(int));
n.insert(make_pair(arrChar[i],a));
}
这样的运行结果是map里所有key对应的值都是0,0,-1,0,将
将n.insert(make_pair(arrChar[i],a));
改成n.insert(make_pair(arrChar[i],&(arr[i][0])));
或者改成n.insert(make_pair(arrChar[i],arr[i]));
问题解决。