【问题标题】:Undo in C, copy struct在 C 中撤消,复制结构
【发布时间】:2015-05-31 04:04:10
【问题描述】:

我是 C 新手,我正在尝试针对某个问题模拟撤消功能。我正在使用这样定义的通用向量:

 typedef void* Element;

    typedef struct {
        Element* elems;
        int size;
        int capacity;
    } Vector;

为此,我创建了一个名为“Copy”的函数,它应该返回我正在传递的向量的副本:

Vector* copyVector(Vector *v) {
    Vector* rez;
    rez = createVector();
    int i;
    for (i = 0; i < getSize(v); i++) {
        Element el = getElem(v, i);
        add(rez, el);
    }
    return rez;
}

当我每次调用它来保存“之前”向量时,它都会起作用...就像当我尝试在当前向量上应用添加或删除时,我首先在另一个名为 undoVec 的向量上调用此复制函数,如下所示:

undoVec = copyVector(v);

我检查过,它可以工作,但是当我调用我的撤消函数时......它应该与之前的代码相反:

v = copyVector(undoVec);

它不再工作了。什么都不做。它不会修改我的向量 v... 我认为这实际上只是一个指针

void undoVector(Vector *v, Vector *undoVec)

我做错了什么?为什么这个功能不起作用?如果需要,我可以粘贴更多代码或提供更多信息,谢谢。

void add(Vector *v, Element elem) {
    if (v->size == v->capacity) {
        isFull(v);
    }
    v->elems[v->size] = elem;
    v->size++;
}

Element getElem(Vector *v, int pos) {
    return v->elems[pos];
}

【问题讨论】:

  • 堆栈更适合撤消功能。
  • 我现在只需要能够应用撤消一次,这是我们被建议采用的方式。知道为什么它不起作用吗?
  • 你能告诉我们getElementadd函数吗?你检查过v的值有没有变化?
  • 您是否在undoVector 函数中分配了v = copyVector(undoVec);?如果是这样,那只会改变undoVector 中的参数值,而不是你调用函数的值。
  • 我粘贴了 add 和 getElem 的代码。 undoVector 的参数是指向向量的指针,所以它们不应该被修改吗?他们确实在我的其他功能中得到了修改,所以..

标签: c copy undo


【解决方案1】:

详细说明 The Dark 的评论:

您是否在undoVector 函数中分配v = copyVector(undoVec);? 如果是这样,那只会改变内部参数的值 undoVector,不是你调用函数的值 与。

如果你有

void undoVector(Vector *v, Vector *undoVec)
{
    v = copyVector(undoVec);
}
…
    undoVec = copyVector(v);
    …
    undoVector(v, undoVec);

undoVector() 中的参数vv 之外的undoVector() 是不同的对象,它只是一个最初具有相同值的副本;因此,v = copyVector(undoVec) 只改变了undoVector() 中参数v 的值,而保持外部独立的v 不变。

为了实现你想要的,去实现它

void undoVector(Vector **v, Vector *undoVec)
{
    *v = copyVector(undoVec);
}
…
    undoVec = copyVector(v);
    …
    undoVector(&v, undoVec);

或者 - 更类似于 copyVector() 并且更简单 -

Vector *undoVector(Vector *undoVec)
{
    return copyVector(undoVec);
}
…
    undoVec = copyVector(v);
    …
    v = undoVector(undoVec);

或者——最简单的——

    undoVec = copyVector(v);
    …
    v = copyVector(undoVec);

【讨论】:

    【解决方案2】:

    使用栈来实现,因为栈有顶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2023-03-10
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多