2013-11-25 4 views
0

Я сделал двойной список в моей программе MFC. Всякий раз, когда я хочу загрузить переменные, программа вылетает из строя. Я не могу создать новый узел. Кто-нибудь знает, как сериализовать двусвязный список.MFC Сериализовать двунаправленный список

Вот моя функция:

void CDatenbankDoc::Serialize(CArchive& ar) 
{ 
    if (ar.IsStoring()) 
    { 
     Actual = Start; 
     while (Actual) 
     { 
      ar << Actual->name; 
      ar << Actual->adresse; 
      ar << Actual->email; 
      ar << Actual->fax; 
      ar << Actual->firma; 
      ar << Actual->geburtsdatum; 
      ar << Actual->geschlecht; 
      ar << Actual->land; 
      ar << Actual->ort; 
      ar << Actual->plz; 
      ar << Actual->telefon; 
      ar << Actual->vorname; 
      Actual = Actual->next;  
     } 
    } 
    else 
    { 
     Actual = Start; 
     while (InsertedAll != true) 
     { 
      Actual->next = new Node; 
      Actual->next->previous = Actual; 
      ar >> Actual->next->name; 
      ar >> Actual->next->vorname; 
      ar >> Actual->next->adresse; 
      ar >> Actual->next->email; 
      ar >> Actual->next->fax; 
      ar >> Actual->next->firma; 
      ar >> Actual->next->geburtsdatum; 
      ar >> Actual->next->geschlecht; 
      ar >> Actual->next->land; 
      ar >> Actual->next->ort; 
      ar >> Actual->next->plz; 
      ar >> Actual->next->telefon; 
      Actual = Actual->next; 
      if (!Actual->next) 
      { 
       InsertedAll = true; 
      } 
     } 
    } 
} 
+2

Основная проблема заключается в том, что при сохранении связанного списка вы не храните ничего, что указывает, когда заканчивается список. Я не уверен, какую магию вы ожидаете, когда прочтете этот список. Как насчет сохранения * длины * списка в первую очередь. Тогда ваша процедура чтения может использовать это значение, чтобы указать, когда прекратить чтение. – john

+0

вы уверены в 'Actual = Actual-> next;' без каких-либо проверок? – Zigma

+0

Лучший способ узнать, когда заканчивается список, - сначала пройти по списку и получить количество участников. Напишите это сначала в поток. Это способ, как и все другие контейнеры MFC, использовать поток архива. – xMRi

ответ

1

Пробуйте использовать приведенный ниже код. Я не тестировал его, поэтому могут возникнуть некоторые ошибки, но вы должны получить эту идею. Я предполагаю, что Start является членом CDatenbankDoc.

Лучшим решением было бы инкапсулировать связанный список в класс, который имеет членский член Serialize.

1

if (!Actual->next) Ваш доступ значение, которое не был инициализирован.

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