首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中结构数组的撤消和重做

C++中结构数组的撤消和重做
EN

Stack Overflow用户
提问于 2020-03-17 05:17:15
回答 1查看 604关注 0票数 0

嗨,所以我正在尝试在我的Uni赋值中实现一个撤销-重做函数。我必须执行“存储数组”的实现,但它不能正常工作。我的Repository结构有一个字段,它保存最后一个元素的索引,所以在添加一些内容之后,它将是0。在它被撤销之后,它变成了一个很大的负数。这是我的源代码:‘

代码语言:javascript
运行
复制
#include"UndoRedo.h"
#include<stdlib.h>

Undo* createUndo(Repo* repo) {
    Undo* undo = (Undo*)malloc(sizeof(Undo));
    undo->undo = (Repo*)malloc(sizeof(Repo) * 10);
    undo->availableUndos = 0;
    undo->undoSlots = 10;
    return undo;
}
Redo* createRedo(Repo* repo) {
    Redo* redo = (Redo*)malloc(sizeof(Redo));
    redo->redo = (Repo*)malloc(sizeof(Repo) * 10);
    redo->availableRedos = 0;
    redo->redoSlots = 10;
    return redo;
}
void addUndo(Repo* repo, Undo* undo) {
    if (undo->undoSlots < undo->availableUndos + 1) {
        growUndo(undo);
        undo->availableUndos += 1;
        undo->undo[undo->availableUndos] = *repo;
    }
}
void destroyUndoAndRedo(Redo* redo, Undo* undo) {
    free(undo->undo);
    free(undo);
    free(redo->redo);
    free(redo);
}
void addRedo(Undo* undo, Redo* redo) {
    if (redo->redoSlots < redo->availableRedos + 1) {
        growRedo(redo);
        redo->availableRedos += 1;

    }
}
int undo(Redo* redo, Repo* repo, Undo* undo) {
    addRedo(undo, redo);
    //printf("%d", repo->indexOfTheLastItem);
    *repo = undo->undo[undo->availableUndos];
    //printf("%d", repo->indexOfTheLastItem);
    undo->availableUndos--;

}
int redo(Repo* repo, Redo* redo, Undo* undo) {
    addUndo(repo, undo);
    *repo = redo->redo[redo->availableRedos-1];
    redo->availableRedos--;

}
void growRedo(Redo* redo) {
    redo->redoSlots *= 2;
    redo->redo = realloc(redo->redo, sizeof(Repo) * redo->redoSlots);
}
void growUndo(Undo* undo) {
    undo->undoSlots *= 2;
    undo->undo = realloc(undo->undo, sizeof(Repo) * undo->undoSlots);
}

“”“

下面是撤消和重做的创建方式:‘

代码语言:javascript
运行
复制
#include"Repo.h"
typedef struct {
    Repo* undo;
    int undoSlots;
    int availableUndos;
}Undo;

typedef struct {
    Repo* redo;
    int redoSlots;
    int availableRedos;
}Redo;

“”“

而且回购看起来像这样:‘

代码语言:javascript
运行
复制
typedef struct {
    Item* items;
    int allocatedSlots;
    int indexOfTheLastItem;
}Repo;

Repo* initRepo() {

    Repo* repo = (Repo *)malloc(sizeof(Repo));
    repo->items = (Item *)malloc(sizeof(Item) * 5);// Init the items array with 5 slots
    repo->allocatedSlots = 5;
    repo->indexOfTheLastItem = -1;
    return repo;
}

‘我已经检查过了,它们被分配得很好。我只是不知道发生了什么,因为在Repo经历撤销之后,我不能访问它的值(读访问冲突)。感谢您的努力!

EN

回答 1

Stack Overflow用户

发布于 2020-03-17 05:31:13

addUndo中,如果已经有空间容纳下一个元素,则不存储它,只在增长时存储它。

而且,你存储了一个超出了你需要的地方(即你应该在你存储之后增加可用的计数)。

您可能需要:

代码语言:javascript
运行
复制
void
addUndo(Repo *repo, Undo *undo)
{

    if (undo->undoSlots < undo->availableUndos + 1)
        growUndo(undo);

    undo->undo[undo->availableUndos] = *repo;

    undo->availableUndos += 1;
}

对于addRedo也是如此。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60713331

复制
相关文章

相似问题

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