System.AccessViolationException Попытка чтения или записи в защищенную память - PullRequest
2 голосов
/ 24 февраля 2012

Привет, я работаю над программой, которая использует массив связанных списков, но у меня возникли проблемы с ее запуском. Я продолжаю получать эту ошибку, и я не могу найти способ исправить это. Я только собираюсь включить части кода таким образом, что все не слишком загромождено. Сообщение об ошибке говорит, что строки 112 в NodeADT.h, строка 141 в MultiListADT.h и строка 21 в main.cpp - это те, которые выдают ошибку. Я выделю эти строки, чтобы было легче.

main.cpp

#include <iostream>
#include "MultiListADT.h"
#include <fstream>
#include <string>

using namespace std;

void main(void)
{
MultiListADT<string,100> myList;
string item;
ifstream data;
string input;
int x=0;

data.open("input.txt");

while (!data.eof())
{
    getline(data,input);
    myList.AddToFront(input);        //This is line 21
}

cout << myList << endl;

system("pause");
}

MultiListADT.h

#include <iostream>
#include <fstream>
#include "NodeADT.h"
#include <string>

using namespace std;

template <class TYPE,int threads>
class MultiListADT
{
public:
/** Constructor **/
MultiListADT();

/** Destructor **/
~MultiListADT();

/** Declare accessors (observers) **/
void ResetListForward(int=0);
void ResetListBackward(int=0);
bool IsEmpty(int=0);
int LengthIs(int=0);
bool Search(string, bool=true,int=0);
void GetNextItem(TYPE &,int i=0);
void GetPreviousItem(TYPE &,int=0);
int GetInfo(int=0);
friend ostream& operator << (ostream&, MultiListADT<TYPE, 100>&);

/** Declare mutators (transformers) **/
void MakeEmpty();
void AddToFront(TYPE);
void AddToRear(TYPE);
void InsertInOrder(TYPE);
void Delete(TYPE);
void Sort();

private:
NodeADT<TYPE,threads>* head[threads];
NodeADT<TYPE,threads>* tail[threads];
int length;
string indices[threads];
NodeADT<TYPE,threads>* currentNode[threads];
};

template <class TYPE,int threads>
MultiListADT<TYPE,threads>::MultiListADT()
{
head[threads] = new NodeADT<string,threads>(); 
tail[threads] = new NodeADT<string,threads>();
head[threads]->setNext(tail[threads]);
tail[threads]->setPrevious(head[threads]);
length = 0;
}

template <class TYPE,int threads>
void MultiListADT<TYPE,threads>::AddToFront(TYPE item)
{
head[0]->AddToFront(item);        //This is line 141

length++;
}

NoteADT.h

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

const int null = 0;

template<class TYPE, int threads>
class MultiListADT;

template <class TYPE, int threads>
class NodeADT
{
public:
NodeADT();
NodeADT(TYPE);
~NodeADT();
TYPE getInfo();
NodeADT<TYPE, threads>* getPrevious(int=0);
NodeADT<TYPE, threads>* getNext(int=0);
void setNext(NodeADT<TYPE, threads>*,int=0);
void setPrevious(NodeADT<TYPE, threads>*,int=0);
bool Search(TYPE, bool=true,int=0);
void AddToFront(TYPE item);
void AddToRear(TYPE item);
void InsertInOrder(TYPE);
bool Delete(TYPE);
friend ostream& operator << (ostream&, MultiListADT<TYPE, threads>&);
private:
TYPE info;
NodeADT<TYPE, threads>* prev[threads];
NodeADT<TYPE, threads>* next[threads];
};

template <class TYPE,int threads>
NodeADT<TYPE,threads>::NodeADT()
{
prev[threads] = null;
next[threads] = null;
}

template <class TYPE,int threads>
NodeADT<TYPE,threads>::NodeADT(TYPE item)
{
info = item;
prev = null;
next = null;
}

template <class TYPE,int threads>
void NodeADT<TYPE,threads>::AddToFront(TYPE item)
{
NodeADT<TYPE,threads> *temp = new NodeADT<TYPE,threads>;
temp->info = item;  
temp->prev[0] = this;
temp->next[0] = next[0];
next[0]->prev[0] = temp;        //This is line 112
next[0] = temp;
}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Я думаю, что ответ, который подразумевал Zan Lynx, заключается в том, что вы используете threads в качестве индекса для ваших массивов в конструкторе MultiListADT. В AddToFront вы используете 0 в качестве индекса, но этот элемент в массиве никогда не был инициализирован.

0 голосов
/ 24 февраля 2012

Что ВЫ думаете, что означает ошибка?

В строке 112, откуда берутся значения next, prev и temp и на что они устанавливаются, когда происходит сбой?Зная значения, почему вы думаете, что он потерпел крах?

Также в одном из ваших конструкторов NodeADT вы присваиваете null последнему элементу массива.Или так оно и выглядит.

Вопрос: Что происходит, когда вы присваиваете значение элементу с номером 100 в массиве из 100 элементов, когда подсчет элементов начинается с 0?

...