2015-03-26 8 views
1

Я новичок в C, и я пытаюсь имитировать функциональность Undo для проблемы. Я использую общие векторы, определенные следующим образом:Отменить в 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; 
} 

It работает, когда я вызываю его каждый раз, чтобы сохранить вектор «before» ... например, когда я пытаюсь применить добавление или удаление моего текущего вектора, я вызываю эту функцию копирования сначала на другой вектор, называемый 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]; 
} 
+3

Стек больше подходящий для отмены функции. –

+1

Мне нужно только один раз применить отмену, и это было так, как нам было рекомендовано. Любая идея, почему это не работает? – Katie44

+0

Не могли бы вы показать нам функции 'getElement' и' add', тоже? Вы проверили, изменилось ли значение 'v'? – bbastu

ответ

0

Используйте стек для реализации, потому что стек имеет верх.

0

Выработать на комментарии Дарка:

Вы присваивающей v = copyVector(undoVec); в функции undoVector? Если это так, что только значение параметра изменится внутри undoVector, а не значение того, что когда-либо вызывала функция с.

Если у вас есть

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

параметр v в undoVector() является другой объект из v снаружи undoVector(), это просто копия, которая имеет первоначально такое же значение; таким образом, v = copyVector(undoVec) только изменяет значение параметра v в undoVector(), но оставляет нетронутым независимый 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^