📄 2 从hello world 程序开始(the hello world program).htm
字号:
class=inlinemediaobject><span lang=EN-US style='font-family:Tahoma'>}<o:p></o:p></span></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Tahoma'><o:p> </o:p></span></p><p class=MsoNormal><b><span lang=EN-US style='font-size:12.0pt;font-family:Tahoma'>2.2</span></b><b><span style='font-size:12.0pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>示例剖析(</span></b><b><span lang=EN-US style='font-size:12.0pt;font-family:Tahoma'>Dissection</span></b><b><span style='font-size:12.0pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)</span></b><b><span lang=EN-US style='font-size:12.0pt;font-family:Tahoma'><o:p></o:p></span></b></p><p class=MsoNormal><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>这个程序在显示器屏幕上打印“</span><spanlang=EN-US style='font-family:Tahoma'>Hello World !!!</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>”后等待用户输入退出。这个小程序展示了怎样初始化进入</span><span lang=EN-USstyle='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模式、处理屏幕操作和退出</span><spanlang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模式。让我们一行一行的分析这个小程序:</span><span lang=EN-US style='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Tahoma'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><st1:chsdateYear="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on"><b><span lang=EN-US style='font-family:Tahoma'>2.2.1</span></b></st1:chsdate><b><spanlang=EN-US style='font-family:Tahoma'> </span></b><b><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>关于</span></b><b><span lang=EN-US style='font-family:Tahoma'> initscr() </span></b><b><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数(</span></b><b><span lang=EN-USstyle='font-family:Tahoma'>About initscr()</span></b><b><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)</span></b><b><span lang=EN-US style='font-family:Tahoma'><o:p></o:p></span></b></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanlang=EN-US style='font-family:Tahoma'>initscr() </span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数初始化终端显示器屏幕并进入</span><span lang=EN-US style='font-family:Tahoma'>curses</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模式。在一些地方它用来清除屏幕上的字符。并且使屏幕变为空白。所以在使用任何</span><spanlang=EN-US style='font-family:Tahoma'>NCURSES</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>库的函数前,都要调用</span><span lang=EN-US style='font-family:Tahoma'>initscr()</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数初始化屏幕。这个函数初始化了</span><span lang=EN-USstyle='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>系统并且分配内存到一个被称作“</span><spanlang=EN-US style='font-family:Tahoma'>stdscr</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>”的窗口及其相关的数据结构上。曾经出现过一个极端的例子:这个函数很有可能因为系统中可用内存太小以至于无法分配足够的内存给相关的数据结构,从而导致</span><spanlang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>系统初始化失败。在这之后我们将会学习如何定制屏幕的初始化模式,这些内容将在以后的章节中详细介绍。</span><spanlang=EN-US style='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><st1:chsdateYear="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on"><b><span lang=EN-US style='font-family:Tahoma'>2.2.2</span></b></st1:chsdate><b><spanlang=EN-US style='font-family:Tahoma'> </span></b><b><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>神秘的</span></b><b><span lang=EN-US style='font-family:Tahoma'>refresh() </span></b><b><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数(</span></b><b><span lang=EN-USstyle='font-family:Tahoma'>The mysterious refresh()</span></b><b><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)</span></b><b><span lang=EN-US style='font-family:Tahoma'><o:p></o:p></span></b></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>第二行的</span><span lang=EN-US style='font-family:Tahoma'>printw</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数用于把字符串“</span><spanlang=EN-US style='font-family:Tahoma'>Hello</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>,</span><span lang=EN-US style='font-family:Tahoma'>World</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>!!!”输出到屏幕上。这个函数很像是</span><span lang=EN-USstyle='font-family:Tahoma'>printf()</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数。但是区别在于,</span><span lang=EN-US style='font-family:Tahoma'>printw</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数把字符串输出到被称作“</span><span lang=EN-USstyle='font-family:Tahoma'>stdscr</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>”的坐标上。从显示的结果来看,坐标(</span><spanlang=EN-US style='font-family:Tahoma'>0,0</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)在屏幕的左上角上。</span><span lang=EN-US style='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>现在该谈谈这个神秘的</span><span lang=EN-USstyle='font-family:Tahoma'>refresh()</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数了。在我们使用</span><span lang=EN-US style='font-family:Tahoma'>printw</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数打印“</span><span lang=EN-US style='font-family:Tahoma'>Hello World</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>!!!”时,实际上这个数据输出到一个被假想的被称作“</span><spanlang=EN-US style='font-family:Tahoma'>stdscr</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>”的窗口上,还没有被输出到屏幕上。</span><span lang=EN-US style='font-family:Tahoma'>printw()</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数的工作是更新一些输出数据及其相关的数据结构,然后把这些数据写入</span><spanlang=EN-US style='font-family:Tahoma'>stdscr</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的缓冲区内。为了显示这些缓冲区中的数据我们必须使用</span><span lang=EN-US style='font-family:Tahoma'>refresh</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>()函数告诉</span><spanlang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>系统将这些内容输出到屏幕上。</span><span lang=EN-US style='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanlang=EN-US style='font-family:Tahoma'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>这种机制可以使程序员多次向虚拟的屏幕或窗口上输出数据。而使用</span><spanlang=EN-US style='font-family:Tahoma'>refresh</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>()函数时让一切看起来似乎是一次进行的。</span><span lang=EN-US style='font-family:Tahoma'>refresh</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>()函数只检测窗口和更改过的数据。这样提供了一个很好的反馈,这种机制也是很有弹性的设计。但是有时会很打击初学者。因为对于初学者来说总是容易在使用类似</span><spanlang=EN-US style='font-family:Tahoma'>printw()</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的输出函数后忘记加入</span><span lang=EN-US style='font-family:Tahoma'>refresh()</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数。不过不用担心,因为我也经常犯这样的错误。</span><span lang=EN-USstyle='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanlang=EN-US style='font-family:Tahoma'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><st1:chsdateYear="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on"><b><span lang=EN-US style='font-size:12.0pt;font-family:Tahoma'>2.2.3</span></b></st1:chsdate><b><spanstyle='font-size:12.0pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>关于</span></b><b><span lang=EN-USstyle='font-size:12.0pt;font-family:Tahoma'>endwin()</span></b><b><spanstyle='font-size:12.0pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数</span></b><b><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>(</span></b><b><span lang=EN-US style='font-family:Tahoma'>Aboutendwin()</span></b><b><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)</span></b><b><spanlang=EN-US style='font-size:12.0pt;font-family:Tahoma'><o:p></o:p></span></b></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>最后,别忘了要结束</span><span lang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模式回到正常的会话模式。另外,在结束程序后你的终端可能会运转得不正常。那是因为</span><spanlang=EN-US style='font-family:Tahoma'>endwin() </span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>释放了</span><span lang=EN-US style='font-family:Tahoma'>curses</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>系统及其数据结构的内存,使你的终端回到正常模式。这个函数必须是在你使用完成所有的</span><spanlang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>操作以后才可以使用。如果你在</span><span lang=EN-US style='font-family:Tahoma'>endwin()</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数后再调用</span><span lang=EN-US style='font-family:Tahoma'>curses</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的函数。结果很明显,那些语句不会被执行。</span><spanlang=EN-US style='font-family:Tahoma'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanlang=EN-US style='font-family:Tahoma'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:10.5pt;mso-para-margin-left:1.0gd'><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>说到这里,顺便提醒一下。如果你的程序不显示东西了。请务必看看</span><spanlang=EN-US style='font-family:Tahoma'>initscr()</span><span style='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数和</span><span lang=EN-US style='font-family:Tahoma'>endwin()</span><spanstyle='font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数是不是在不该被调用的地方调用了!</span><span lang=EN-USstyle='font-family:Tahoma'><o:p></o:p></span></p></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -