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_mp(handle, backup_num)。これにより、異なるコンソールバッファインスタンスから複数のバックアップが作成されます。プライベートスペースの最後の4つの変数を配列に変換して、インデックス値(backup_num)をさまざまなバックアップポイントに使用できるようにすることを計画しました。このような割り当て

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

動かない。

What option do I have?

Also, can I use CONST WCHAR max_unit as the parameter for an array like 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::vector の代わりに) std::array を使用できますが、これは重要ではありません。

于 2013-01-24T19:55:04.770 に答える
0

( を使用して) ヒープに 2 次元配列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_buff2D 配列であるかのように、それらを直接使用します。割り当てを解除するには、最初に配列 (つまり個々の行) を削除し、次に行ポインターを削除する必要があります。

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

    delete []stor_buff;

または、1 次元配列を 2D として使用することもできます。このため(row,col)には、目的の要素を取得するために計算を行う必要があります。

vector(またはvectorof vector) を使用して、同じものを取得することもできます。ただし、ポインターに慣れていない限り、ネイティブ ポインターを使用することをお勧めします。

于 2013-01-25T02:55:00.060 に答える