2

我正在尝试开发一个类来备份和恢复控制台屏幕缓冲区。这是我正在进行的代码。

class CBuff
{
private:
    CONST WCHAR max_unit;
    HANDLE hnd;
    CHAR_INFO *stor_buff;
    COORD s_buff_sz;
    COORD d_buff_cod;
    SMALL_RECT read_region;

public:
    CBuff():max_unit(10)
    {}
    ~CBuff(){}

void Initiate(HANDLE hndl, SHORT buff_x, SHORT buff_y, SHORT buff_width, SHORT buff_height)
{
    hnd=hndl;
    stor_buff=new CHAR_INFO[buff_width*buff_height]();
    s_buff_sz.X=buff_width;
    s_buff_sz.Y=buff_height;
    d_buff_cod.X=0;
    d_buff_cod.Y=0;
    read_region.Left=0;
    read_region.Top=0;
    read_region.Right=buff_width-1;
    read_region.Bottom=buff_height-1;
}

int Backup()
{
    if(!ReadConsoleOutput(hnd,stor_buff,s_buff_sz,d_buff_cod,&read_region)) return -1;
    return 0;
}

int Restore()
{
    if(!WriteConsoleOutput(hnd,stor_buff,s_buff_sz,d_buff_cod,&read_region)) return -1;
    return 0;
}

int Backup_mp()
{/*incomplete*/}

int Restore_mp()
{/*incomplete*/}

};

它适用于 Backup() & Restore() 很好。然后我尝试制作另一个版本的 Backup,Backup_mp(handle, backup_num)它将从不同的控制台缓冲区实例创建多个备份。我计划将私有空间中的最后四个变量转换为数组,以便索引值(backup_num)可以用于不同的备份点。像这样的分配

stor_buff=new CHAR_INFO[index][buff_width*buff_height]();

不管用。

我有什么选择?

另外,我可以CONST WCHAR max_unit用作数组的参数s_buff_sz[max_unit] 吗?

4

2 回答 2

1

您正在使用 C++,因此请使用它:使用 std::vector。

//Declaration of your buffers:
std::vector< std::vector<CHAR_INFO> > store_buffers;

//Append a new buffer entry:
store_buffers.push_back( std::vector<CHAR_INFO>( buff_width * buff_height ) );

// Pass buffer with index index to WinAPI functions:
..., store_buffers[index].data(), s_buff_sz, ...

如果使用 C++11,您可以将 std::array 用于固定大小的维度(而不是 std::vector,它是可变的),但这并不重要。

于 2013-01-24T19:55:04.770 回答
0

要在堆中分配二维数组(使用new),您需要先分配指针,然后再分配数组。例子:

stor_buff = new CHAR_INFO* [buff_height]; // Allocate rows (pointers
for(int index = 0; index < buff_height; ++index)
   stor_buff[index] = new CHAR_INFO[buff_width];

并且直接使用它们,就好像store_buff是二维数组一样。对于解除分配,您需要先删除数组(即单独的行),然后再删除行指针。

  for(int index = 0; index < buff_height; ++index)
        delete []stor_buff[index];   // NOTICE the syntax

    delete []stor_buff;

或者,您可能有一个一维数组,将其用作二维数组。为此,您需要进行(row,col)计算以获取所需的元素。

您也可以使用vector(或vectorof vector) 来获得相同的结果。但我建议你玩原生指针,除非你习惯了指针!

于 2013-01-25T02:55:00.060 回答