嗨,所以我正在尝试在我的Uni赋值中实现一个撤销-重做函数。我必须执行“存储数组”的实现,但它不能正常工作。我的Repository结构有一个字段,它保存最后一个元素的索引,所以在添加一些内容之后,它将是0。在它被撤销之后,它变成了一个很大的负数。这是我的源代码:‘
#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);
}
“”“
下面是撤消和重做的创建方式:‘
#include"Repo.h"
typedef struct {
Repo* undo;
int undoSlots;
int availableUndos;
}Undo;
typedef struct {
Repo* redo;
int redoSlots;
int availableRedos;
}Redo;
“”“
而且回购看起来像这样:‘
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经历撤销之后,我不能访问它的值(读访问冲突)。感谢您的努力!
发布于 2020-03-17 05:31:13
在addUndo
中,如果已经有空间容纳下一个元素,则不存储它,只在增长时存储它。
而且,你存储了一个超出了你需要的地方(即你应该在你存储之后增加可用的计数)。
您可能需要:
void
addUndo(Repo *repo, Undo *undo)
{
if (undo->undoSlots < undo->availableUndos + 1)
growUndo(undo);
undo->undo[undo->availableUndos] = *repo;
undo->availableUndos += 1;
}
对于addRedo
也是如此。
https://stackoverflow.com/questions/60713331
复制相似问题