UNIX下C语言的图形编程-curses.h函数库

2023-05-16

相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式 的画面也较为美观. 对 Programming 有兴趣的朋友一定对此感到好奇, 也 许他能在 PC 上用 TurboC 轻易地写出类似的程式, 然而, 但当他将相同 的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误. 其实, 原因很简单, 他使用的函式库可能在 UNIX 上是没有定义的. 有些在 Turbo-C 上被广泛使用的一些函式, 可能在 UNIX 上是不被定义的. 

为了因应网路上各式各样的终端机形态 (terminal),UNIX 上特别发展出 一套函式库, 专门用来处理 UNIX 上游标移动及萤幕的显示. 这就是本篇 文章要为您介绍的 - curses.h 函式库. 利用这个函式库, 您也可以写出 
像 elm 般利用方向键来移动光棒位置的程式. (CCCA 近来所提供的线上选课程式, 及程式服务界面, 即是笔者利用 curses 发展而成的 ) 


■ curses 的历史与版本 

cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 
当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设 
计的. 因此, 利用 curses 发展出来的程式将和您所使用的终端机无关. 
也就是说, 您不必担心您的程式因为换了一部终端机而无法使用. 这对程 
式设计师而言, 尤其是网路上程式的撰写, 是件相当重要的一件事. 
curses之所以能对上百种以上的终端机工作, 是因为它将所有终端机的资 
料, 存放在一个叫 termcap 的资料库, ( 而在第二版的 System V 系统中 
, 新版的 curses 以 terminfo 取代原来的 termcap). 有了这些记录, 程 
式就能够知道遇到哪一种终端机时, 须送什麽字元才能移动游标的位置, 
送什麽字元才能清除整个萤幕清除. (* 注一) 

另外, 本文的介绍 以 System V 的 curses 版本为主. 


■ 如何在您的程式使用 curses ? 

在您的 C 程式的档头将 <curses.h> include 进来.当您引进 curses.h 
这个函式库後, 系统会自动将 <stdio.h> 和 <unctl.h>一并 include 进 
来.另外, 在 System V 版本中, <terminfo.h> 这个函式库也将一并 
include进来. 

#include <curses.h> 

main() 

: : 
: : 


当然, 您的系统内必须放有 curses.h 这个函式库. 


■ 如何编译(compile) 

当您编辑好您的程式, 在 UNIX 提示符号下键入: 

% /usr/5bin/cc [file.c] -lcurses 
^^^^^^^ 
引进 curses.h 这个 library 

或 % /usr/5bin/cc [file.c] -lcurses -ltermlib 

(*注二) 


■ 如何开始我的第一个 curses 程式? 

在开始使用 curses 的一切命令之前, 您必须先利用 initscr()这个函式 
来开启 curses 模式. 

相对的, 在结束 curses 模式前 ( 通常在您结束程式前 ) 也必须以 
endwin()来关闭 curses 模式. 

#include <curses.h> 

main() 

initscr(); 
: : 
: : 
: : 
endwin(); 


这是一般 curses 程式标准的模式. 

此外, 您可以就您程式所须, 而做不同的设定. 当然, 您可以不做设定,而 
只是呼叫 initscr(). 

您可以自己写一个函式来存放所有您所须要的设定. 平常使用时, 只要呼 
叫这个函式即可启动 curses 并完成一切设定. 

下面的例子, 即是笔者将平常较常用的一些设定放在一个叫 initial()的函 

式内. 

void initial() 

initscr(); 
cbreak(); 
nonl(); 
noecho(); 
intrflush(stdscr,FALSE); 
keypad(stdscr,TRUE); 
refresh(); 



各函式分别介绍如下: 

□ initscr() 

initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数 
被呼叫之後, 系统将根据终端机的形态并启动 curses 模式. 


□ endwin() 

curses 通常以呼叫 endwin() 来结束程式. endwin() 可用来关闭 
curses 模式, 或是暂时的跳离 curses 模式.如果您在程式中须要 
call shell ( 如呼叫 system() 函式 ) 或是需要做 system call, 
就必须先以 endwin() 暂时跳离 curses 模式. 最後再以 
wrefresh() doupdate() 来重返 curses 模式. 


□ cbreak() 
nocbreak() 

当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊 
控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模 
式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN 
或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来 
取代 cbreak(),nocbreak() 


□ nl() 
nonl() 

用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字 
元 ( 如 \n ). 
而输出资料时, NEWLINE 字元是否被对应为 RETURN 和 LINDFEED 
系统预设是开启的. 



□ echo() 
noecho() 

此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统 
预设是开启的. 


□ intrflush(win,bf) 

呼叫 intrflush 时须传入两个值: 
win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr 
bf 为 TRUE 或 FALSE 

当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应 
将较为快速.但可能会造成萤幕的错乱. 



□ keypad(win,bf) 

呼叫 keypad 时须传入两个值: 
win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr 
bf 为 TRUE 或 FALSE 

当开启 keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右 
等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一 
些特殊键. 这些定义的特殊键通常以 KEY_ 开头. 



□ refresh() 

refresh() 为 curses 最常呼叫的一个函式. 

curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改 
变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到 
refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将 
维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间. 
如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤 
幕的工作. 




■ 游标的控制 

move(y,x) 将游标移动至 x,y 的位置 
getyx(win,y,x) 得到目前游标的位置 
(请注意! 是 y,x 而不是 &y,&x ) 


■ 有关清除萤幕的函式 

clear() 
erase() 将整个萤幕清除 
(请注意配合refresh() 使用) 


■ 如何在萤幕上显示字元 

echochar(ch) 显示某个字元 

addch(ch) 显示某个字元 
mvaddch(y,x,ch) 在(x,y) 上显示某个字元 
相当於呼叫 move(y,x);addch(ch); 

addstr(str) 显示一串字串 
mvaddstr(y,x,str) 在(x,y) 上显示一串字串 
相当於呼叫 move(y,x);addstr(str); 

printw(format,str) 类似 printf() , 以一定的格式输出至萤幕 
mvprintw(y,x,format,str) 在(x,y) 位置上做 printw 的工作. 
相当於呼叫 move(y,x);printw(format,str); 



■ 如何从键盘上读取字元 

getch() 从键盘读取一个字元 (注意! 传回的是 
整数值) 
getstr() 从键盘读取一串字元 
scanw(format,&arg1,&arg2...) 如同 scanf, 从键盘读取一串字元 

□例: 

int ch; 
char string1[80]; /* 请注意! 不可宣告为 char *string1; */ 
char string2[80]; 

echo(); /* 开启 echo 模式, 使输入立刻显示在萤幕上 */ 
ch=getch(); 
string1=getstr(); 
scanw("%s",string2); 
mvprintw(10,10,"String1=%s",string1); 
mvprintw(11,10,"String2=%s",string2); 

■ 如何利用方向键 

curses 将一些如方向键等特殊控制字元, 以 KEY_ 为开头定义在 curses.h 

这个档案里头, 如 KEY_UP 即代表方向键的 " ↑ ". 但, 如果您想使用 

curses.h 所为您定义的这些特殊键的话, 您就必须将 keypad 设定为 

TRUE. 否则, 您就必须自己为所有的特殊键定义了. 

curses.h 为一些特殊键的定义如下: 

KEY_UP 0403 ↑ 
KEY_DOWN 0402 ↓ 
KEY_LEFT 0404 ← 
KEY_RIGHT 0405 → 
KEY_HOME 0406 Home key (upward+left arrow) 
KEY_BACKSPACE 0407 backspace (unreliable) 
KEY_F0 0410 Function keys. 
KEY_F(n) (KEY_F0+(n)) formula for f . 
KEY_NPAGE 0522 Next page 
KEY_PPAGE 0523 Previous page 

以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参 

阅 man curses (* 注三) 

一并为您列出其他常用的一些特殊字元 

[TAB] /t 
[ENTER] /r 
[ESC] 27 
[BACKSPACE] 127 


■ 如何改变萤幕显示字元的属性 

为了使输出的萤幕画面更为生动美丽, 我们常须要在萤幕上做一些如反白, 

闪烁等变化. curses 定义了一些特殊的属性, 透过这些定义, 我们也可以 

在 curses 程式□控制萤幕的输出变化. 

attron(mod) 开启属性 
attroff(mod) 关闭属性 

curses.h 里头定义了一些属性, 如: 

A_UNDERLINE 加底线 
A_REVERSE 反白 
A_BLINK 闪烁 
A_BOLD 高亮度 
A_NORMAL 标准模式 (只能配合 attrset() 使用) 


当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以 

该种属性出现. 直到您呼叫 attroff() 将此模式关闭. 

请注意, 当您欲 attron() 开启另一种属性时, 请记得利用 attroff()先关 

闭原来的属性, 或直接以 attrset(A_NORMAL) 将所有特殊属性关闭.否则, 

curses 会将两种属性做重叠处理. 

□例: 

attrset(A_NORMAL); /* 先将属性设定为正常模式 */ 

attron(A_UNDERLINE); /* 加底线 */ 

mvaddstr(9,10,"加底线"); /* 加底线输出一串字元 */ 

attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式 */ 

attron(A_REVERSE); /* 开启反白模式 */ 

mvaddstr(10,10,"反白"); /* 输出一串反白字元 */ 

attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式 */ 

attron(A_BLINK); /* 开启闪烁模式 */ 

mvaddstr(11,10,"闪烁"); /* 输出一串闪烁字元 */ 

attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式 */ 

attron(A_BOLD); /* 开启高亮度模式 */ 

mvaddstr(12,10,"高亮度"); /* 输出一串高亮度字元 */ 

attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式 */ 



■ 其他常用的一些函式 

beep() 发出一声哔声 
box(win,ch1,ch2) 自动画方框 ch1: 画方框时垂直方向所用字元 
ch2: 画方框时水平方向所用字元 

example: box(stdscr,'|','-'); 
将以 | 及 - 围成一个方框 

■ 应用完整□例 

下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程式可将从键 

盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置 

, 当按下 [ESC] 後, 程式即结束. 

您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗? 


#include <curses.h> /* 引进 curses.h , 并自动引进 
stdio.h */ 


#define StartX 1 /* 决定游标初始位置 */ 
#define StartY 1 

void initial(); 

main() 

int x=StartX; /* 宣告 x,y 并设定其初值 
*/ 

int y=StartY; 
int ch; /* 宣告 ch 为整数,配合 getch() 
使用 */ 


initial(); /* 呼叫 initial(), 启动 curses 
模式, */ 

/* 并完成其它设定 
*/ 


box(stdscr,'|','-'); /* 画方框 
*/ 


attron(A_REVERSE); /* 开启反白模式 
*/ 

mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元 
*/ 

attroff(A_REVERSE); /* 关闭反白模式 
*/ 


move(x,y); /* 将游标移至初始位置 
*/ 


do { /* 以无限回圈不断等待输入 
*/ 

ch=getch(); /* 等待自键盘输入字元 
switch(ch) { /* 判断输入字元为何 
*/ 


case KEY_UP: --y; /* 判断是否"↑"键被按下 
*/ 

break; 
case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 
*/ 

break; 
case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 
*/ 

break; 
case KEY_LEFT: --x; /* 判断是否"←"键被按下 
*/ 

break; 
case '\r': /* 判断是否 ENTER 键被按下 
*/ 

++y; 
x=0; 
break; 
case '\t': /* 判断是否 TAB 键被按下 
*/ 

x+=7; 
break; 
case 127: /* 判断是否 BACKSPACE 键被按下 
*/ 

mvaddch(y,--x,' ');/* delete 一个字元 
*/ 

break; 

case 27: endwin(); /* 判断是否[ESC]键被按下 
*/ 

exit(1); /* 结束 curses 模式 
*/ 

/* 结束此程式 
*/ 


default: 
addch(ch); /* 如果不是特殊字元, 将此字元印 
出 */ 

x++; 
break; 

move(y,x); /* 移动游标至现在位置 
*/ 

} while (1); 


void initial() /* 自定开启 curses 函式 
*/ 


initscr(); 
cbreak(); 
nonl(); 
noecho(); 
intrflush(stdscr,FALSE); 
keypad(stdscr,TRUE); 
refresh(); 




■ 後记 

学完了上述的一些命令, 相不相信您已经可以写出一个漂亮的全萤幕编辑 
器了? 事实上, curses 提供的函式不下 200 个, 可是笔者认为, 一切再 
复杂的函式都可以用本文提到的一些组合变化而成, 学了太多的函式, 只 
是徒增自己困扰罢了. 当然, 如果您对其它函式有兴趣, 可以自行参阅 
curses 说明档. ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也 
希望未来能陆续出现更多同学自行创作的程式. 

* 任何疑问及建议, 欢迎 e-mail 至 ljh@CCCA.NCTU.edu.tw. 谢谢 ! * 



注一: 
请参考 /usr/share/lib/termcup 
/usr/share/lib/terminfo/s/sun 

注二: 
1.如果是 BSD 的版本, 需使用 
cc [file.c] -lcurses -ltermcap 来完成 compile. 
2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org 

因此, 您若想在计中工作站 compile curses 程式.需以 /usr/5bin/cc. 
org 
取代 /usr/5bin/cc , 否则 compile 可能发生错误. 
3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library, 
因此, 您必须使用 /usr/5bin/cc [file.c] -lcurses -ltermlib 来 
compile. 

注三: 
根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它 

如 PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无 

法使用, 因此, 若您的程式须要在不同的机器上使用, 建议您只用方向键来 

控制, 其它的特殊键少用为妙. 
至於 PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可 
参 
考 tin 原始程式 curses.c 内所使用的一些方法.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UNIX下C语言的图形编程-curses.h函数库 的相关文章

  • "大泥球"仍然是最常见的软件设计

    大泥球 xff0c 是指杂乱无章 错综复杂 邋遢不堪 随意拼贴的大堆代码 这些年来 xff0c 为了对付这个泥球 xff0c 我们看到了多种指导方法 xff0c 比如SOLID GRASP 和KISS xff0c 与其他诸多年代久远的 提倡
  • 3322.org带来的麻烦

    大概是3322 org被短时间攻破 xff0c 下载他的动态域名客户端的时候下到一个病毒Trojandropper js adagent gd xff0c 把江民关了 xff0c 并且再也开不开 系统还原不行 xff0c 安全模式也进不去
  • Qt学习笔记:多线程的使用

    文章目录 前言1 何时使用线程2 QThread类实现多线程2 1 多线程的实现方法2 2 线程休眠2 3 正确结束线程 3 线程同步3 1 互斥量3 2 信号量3 3 条件变量 4 线程池参考资料 前言 程序中调用耗时的操作 xff08
  • 上位机开发笔记:环形缓冲区

    文章目录 前言1 环形缓冲区工作机制1 1 实现原理1 2 区分缓冲区满或者空1 总是保持一个存储单元为空2 使用计数数据3 镜像指示位 2 Qt实现环形缓冲区2 1 QByteArray环形缓冲区2 2 QSemaphore实现环形缓冲区
  • IDEA搭建Spring框架环境

    IDEA搭建Spring框架环境 一 spring 框架概念 spring 是众多开源 java 项目中的一员 xff0c 基于分层的 javaEE 应用一站式轻量 级开源框架 xff0c 主要核心是 Ioc 控制反转 依赖注入 与 Aop
  • SQL SERVER中索引类型包括的三种类型分别是

    xfeff xfeff 唯一索引 UNIQUE 聚集索引 CLUSTERED xff09 非聚集索引 NONCLUSTERED xff09 主键与唯一索引的区别 主键是一种约束 xff0c 唯一索引是一种索引 xff0c 两者在本质上是不同
  • _Linux多线程--生产者消费者模型篇

    文章目录 1 为何要使用生产者消费者模型2 基于BlockingQueue的生产者消费者模型3 C 43 43 queue模拟阻塞队列的生产消费模型条件变量使用规范简单测试1 BlockQueue 缓存 超市 2 ConProd cc3 结
  • HTTP、TCP的关系及状态码

    一 基本概念 1 TCP连接 手机能够使用联网功能是因为手机底层实现了TCP IP协议 xff0c 可以使手机终端通过无线网络建立TCP连接 TCP协议可以对上层网络提供接口 xff0c 使上层网络数据的传输建立在 无差别 的网络之上 建立
  • x299平台装linux系统的一些天坑

    年前实验室为了配置大内存的服务器 xff0c 受限于经费 xff0c 我们只能使用比较便宜的游戏板 xff0c 选择了微星的x299平台 xff0c 买回来自带win10 xff0c 回来的第一件事就是装linux xff0c 习惯上我会装
  • android的应用包名与代码包名

    说来惭愧 xff0c 好歹还是做了android应用这么久了 xff0c 居然不知道这个事情 参考 xff1a http www xmumu com post 2013 08 05 40052300660 http blog javia o
  • [自动驾驶]Build a Traffic Sign Recognition Program

    看 准确率98 的深度学习交通标志识别是如何做到的 xff1f 这篇文章的时候 xff0c 发现了udacity的自动驾驶课程 可惜要收费 xff0c 不过课程project在github上有 xff0c 那直接做project就好了 xf
  • Spring MVC框架的高级配置

    本文将为您提供关于Spring MVC框架的配置技巧 xff0c 以帮助管理基于Spring的web应用程序的多个实例 本配置管理主题常被学术界所忽略 xff0c 但是 xff0c 这对于现实的web开发尤为重要 本主题并不直接关联任何具体
  • ffmpeg解码花屏

    问题 xff1a 解码为YUV420转为Bitmap后显示在屏幕上时 xff0c 有三分之二为花屏 xff1a 如图 xff1a 首先用h264Visa分析帧 xff1a 已经读出了sps等信息 xff0c 这些信在解码第一帧时被写入环境变
  • 使用Hexo+Github一步步搭建属于自己的博客(基础)

    前言 xff1a 电脑系统为window 10专业版 xff0c 64位 相关步骤 xff1a 1 安装Node js和配置好Node js环境 xff0c 打开cmd命令行 xff0c 成功界面如下 2 安装Git和配置好Git环境 xf
  • OpenSSL命令学习

    OpenSSL命令学习 一 基础概念 OpenSSL是一个开放源代码的软件库包 xff0c 应用程序可以使用这个包来进行安全通信 xff0c 避免窃听 xff0c 同时确认另一端连接者的身份 这个包广泛被应用在互联网的网页服务器上 下面以问
  • 论文阅读——Shadow Attacks:Hiding and Replacing Content in Signed PDFS

    论文阅读报告 Shadow Attacks xff1a Hiding and Replacing Content in Signed PDFS 阅读背景 本次阅读的论文是由Christian Mainka Vladislav Mladeno
  • SecKill——一款超级好用的抢单软件

    软件介绍 下载地址见文章末尾 Seckill是一款使用Python和pyqt编写 xff0c 利用selenium库实现的自动化抢单软件 xff0c 它界面友好 xff0c 使用方便 xff0c 可以帮助你在购物时快人一步 xff0c 及时
  • 获取PowerShell的所有历史记录

    PowerShell默认的history命令只能查看当前窗口的历史记录 xff0c 很不方便 可以使用以下方法获取PowerShell的所有历史记录 xff0c 简单记录一下 一 PSReadline 当前版本 xff08 5 1 xff0
  • 用pyqt5写一个同步文件夹内容的小工具

    详见https github com distiny cool File Synchronization 完整代码在最下面 同步文件夹内容的小工具 点这里直接下载可执行程序 出发点 打算把电脑上的文件备份到外部磁盘上面 xff0c 但是原来
  • 博客园添加GitHub链接

    添加该样式涉及到博客园后台页面定制CSS代码和页首Html代码两处改动 1 将下列CSS代码添加至页面定制CSS代码处 1 GitHub Cornor 2 github corner hover octo arm 3 animation o

随机推荐

  • SQL-修改表名,列名

    sql 1 sql server修改表名 列名 修改表名 xff1a EXEC sp rename 原有表名 39 新表名 39 修改列名 xff1a EXEC sp rename 表名 原有列名 新列名 39 39 COLUMN 39 如
  • 程序员你为什么迷茫?

    你曾经充满热情 xff0c 是一位开源软件倡导者 xff0c 你崇尚全栈工程师才有未来的理念 xff0c 你渴望改变世界 但是现在你每天都处于焦虑之中 xff0c 你每天不断地学习各种技术Kotlin Swift React Native
  • Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略

    COCO数据集的简介 MS COCO的全称是Microsoft Common Objects in Context xff0c 起源于微软于2014年出资标注的Microsoft COCO数据集 xff0c 与ImageNet竞赛一样 xf
  • 类之间的组合关系

    继承加复合 这种情况下的构造顺序是 xff1a 先调用Base的默认构造函数 xff0c 再调用Component的构造函数 xff0c 最后调用自己的构造函数 析构的顺序与之相反 xff0c 先调用自己析构函数 xff0c 再调用Comp
  • maven pom.xml 详解(注释版)

    转自 xff1a http mrlee23 iteye com blog 1806412 pom xml Xml代码 lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xml
  • 当用户支付成功,微信服务器与我们服务器中间网络断开时处理方案

    用户支付成功了 xff0c 但是微信服务器与我们服务器的网络中断了 这个时候 xff0c 我们的回调数据是没办法处理的 xff0c 这个时间的解决方案 可以有 xff1a 1 有支付脏表进行字段order status之类的进行区分哪些是没
  • java多线程设置超时时间

    情景 xff1a 多线程中个别线程执行时间会很长 xff0c 如果线程执行时间超过某段时间 xff0c 自动结束该线程 百度了很多答案之后大部分的解决办法都是利用Future类中的get long timeout TimeUnit unit
  • Android Studio安装Kotlin插件

    1 Kotlin语言介绍 Kotlin 是 JetBrains 在 2010 年推出的基于 JVM 的新编程语言 xff0c 是一种新的静态类型编程语言 开发者称 xff0c 设计它的目的是避免 Java 语言编程中的一些难题 比如 xff
  • VMware虚拟机教程

    什么样配置的电脑适合建立虚拟机 xff1f 当硬件配置达不到要求时 xff0c 虚拟机运行速度会很慢 xff0c 甚至不能运行 xff0c VMware的配置要求如下 CPU 最低主频266MB xff0c 建议P3 1GHz以上 xff1
  • <数据结构>无向连通子图个数求解(C语言版)

    求无向图连通子图个数 测试数据由m 43 1行构成 xff0c 第一行为两个正整数n 1 lt n lt 61 30 xff0c m 1 lt m lt 100 xff0c 顶点数 xff0c 边数 m行数据是边的信息 xff0c 表示该边
  • 【2015-2016,我在路上】

    前言 xff1a 每天 xff0c 每时 xff0c 每分 xff0c 时光的步伐永远不会停止 xff0c 当我提起笔 xff0c 写下的这一瞬间 xff0c 时间又是一年 xff0c 一年的时光 xff0c 在没逝去时 xff0c 感觉很
  • sourceTree中的git rebase变基操作

    sourceTree中的git rebase操作 记录Sourcetree 基于git rebase修改git提交记录的方法 sourceTree进行git rebase变基操作 sourcetree rebase的使用 sourceTre
  • Android 11 添加系统开机启动的Service方案

    近日 xff0c 在搞一套开机启动的Service xff0c 虽然在之前低版本弄过 xff0c 以为直接照搬过来就可以了 xff0c 结果还出了一堆问题 xff0c 比如framework里边 64 NonNull检测 selinux新规
  • 数据库范式(1NF 2NF 3NF BCNF)详解一

    数据库的设计范式是数据库设计所需要满足的规范 xff0c 满足这些规范的数据库是简洁的 结构明晰的 xff0c 同时 xff0c 不会发生插入 xff08 insert xff09 删除 xff08 delete xff09 和更新 xff
  • Android11 添加HIDL接口编译报错

    软件平台 xff1a Android11 硬件平台 xff1a QCS6125 近日 xff0c 在基线代码的Hardware层添加了HIDL接口 xff0c 整编出现了如下报错 xff1a 46 55871 118986 hardware
  • 2017阿里校招内推面试回忆

    首先 我得声明 我经历了内推的四次电话面试 一直到hr面了 但是最后还是被挂了 所以 对大家的帮助可能不是那么大 如果大家对我这个失败者的经历不是很感兴趣的就不用往下看 后来校招的时候 笔试直接就挂了 我猜测是不是跟我之前内推失败的记录有关
  • 快速查看网页元素的CSS样式

    浏览器 xff1a firefox 打开自己想查看的网页 xff0c 定位到自己想查看的元素 鼠标右键点击空白处 xff0c 点击检查元素 然后就可以看见这个元素的html和css代码啦 xff01 这个可以用来学习别人的网页 比如看见一个
  • 解决server2016多用户登录的问题

    昨天到今天从server2106上给组里所有的人都用设置好了用户 xff0c 并配置好权限 xff0c 新问题来了 xff1a 服务器最多只允许2个用户登录 xff0c 在组策略 xff08 组策略 xff09 里进行配置也不行 xff0c
  • C语言实现单链表的逆置

    单链表的逆置是一个非常经典的问题 xff0c 这里利用两个思想进行解决 首先 xff0c 我们需要看下原理图 xff0c 其实两个思想都是一样的 xff0c 都是使后一个的节点的 next 指针指向前一个节点 xff0c 依次递推 xff0
  • UNIX下C语言的图形编程-curses.h函数库

    相信您在网路上一定用过如 tin elm 等工具 这些软体有项共同的特色 即他们能利用上下左右等方向键来控制游标的位置 除此之外 这些程式 的画面也较为美观 对 Programming 有兴趣的朋友一定对此感到好奇 也 许他能在 PC 上用