您的位置:首页 > 运维架构 > Linux

linux环境下无阻塞键盘输入以及MAP容器中value为数组的一些问题

2016-03-30 11:58 417 查看
一、使用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]));
问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: