首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从显示器中抽象出来?

如何从显示器中抽象出来?
EN

Software Engineering用户
提问于 2015-08-19 15:19:25
回答 2查看 168关注 0票数 5

我正在构建一个嵌入式文本编辑器,它由键盘、液晶显示器和PIC32微控制器组成,将在C中编程。例如,应用程序应该看起来像GNU nano编辑器。显示大小为40x16字符。

目前,我想知道什么才是从显示器中提取出来的好方法。我们可以将一个简单的终端概念化如下:

代码语言:javascript
复制
typedef struct {
    char* content;              // Current and past content
    void (*update)(Terminal);   // Update function
} Terminal;
void append(Terminal, char*);   // Append to content & execute update function
void discard(Terminal, int);    // Discard last n characters & execute update f.

通过向Terminal类型添加一个函数指针,我们基本上有一个模型和一个视图。Terminal可以由append()discard()函数控制。利用这个Terminal,我们可以用stdinstdout制作一个简单的终端。

但是,对于nano-like编辑器来说,这还不够,它可以在屏幕上的任何地方插入和删除文本,而不仅仅是在当前数据的末尾。

我现在组成了以下类型:

代码语言:javascript
复制
typedef struct {
    unsigned short rows, columns,     // Screen size
            first_visible_row, first_visible_column,  // Left-top coordinates
            cursor_x, cursor_y;       // Cursor coordinates
    char* content;                    // Current and off-screen content
    void (*update)(Screen);           // Update function
} Screen;

这个Screen也保存屏幕外的内容,它的可见部分由它的左上方坐标决定。这使得滚动更容易。但是,在某个位置写入此屏幕的函数将是复杂的,因为content中的位置与实际显示上的坐标之间没有直接关系。

对于屏幕上的不同行,使用类型更容易的方法是保存一个rows char数组数组。然后,content将是char数组的数组,即char** content

基本上,我是在问我建议的方法是否有问题,以及是否有更简单的方法。

总之,下面是屏幕的一些要求:

  • 应该很容易卷进
  • 应该可以在屏幕上的任何点添加和删除文本。
EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-09-29 01:16:32

您可能会从双缓冲区概念中获益,在这个概念中,您将比显示更长的行存储到一个更大的结构中,并在40 * 16数组中放大,该数组可以与显示事件一起向上或向下移动。为行和结束的每个开始提供偏移指针是确定的,因此箭头在更大的区域周围移动。限制移动到最小最大值。然后切和粘贴是逐行段复制。多行区域复制将是最难跟踪的,您可以限制在窗口开始。

缓冲区进出文件是一次写入操作的结束。

显示是每个字符串操作的自定义。

票数 0
EN

Software Engineering用户

发布于 2015-09-05 04:32:15

将内容表示为char*是个好主意,因为这就是它的概念。

char**作为一个内容模型是不好的,因为它与固定的屏幕大小和行长相关联。因此,作为屏幕的“视图模型”,这才是有意义的。

至于光标坐标与内容数组中的位置之间的关系,我看到两个选项应该都工作得很好:

  • 有一个根据当前光标坐标和屏幕位置将索引计算成内容的函数(不要知道为什么会太困难)
  • 在内容中维护一个索引的二维数组,其中每个元素对应于一个可能的光标位置;它将需要在屏幕的每次更新中进行更新。
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/294071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档