排序算法在试图打印列表信息时崩溃
Sorting alghorytm crashes when trying to print information of list
在我的应用程序中,我想排序对象升序和降序。为此,我写了3个函数。它可能排序,但当我想打印所有的列表,我有错误,如:访问违反读取位置0x00000000。我想名单是空的,但我不确定。有什么问题吗?总而言之:排序后List似乎是空的。算法可以工作,但是打印列表的函数崩溃了。
JednostkaMaszyny是一个基本的抽象类。
//此函数负责查找列表中最大和最小的ID并返回其值。
int static findID(JednostkaMaszyny*& headOfList, short numberOfObjects,bool ascending)
{
short i = 0;
int IDtoFind = 0;
JednostkaMaszyny* iterator;
iterator = headOfList;
/*if(rosnaco)
{
IDtoFind = 999999999;
}
else
{
IDtoFind = 0;
}*/
while(i < numberOfObjects)
{
if(!ascending){
if(iterator->getID() > IDtoFind)
{
IDtoFind = iterator->getID();
}
//i++;
//iterator = iterator->nextObject;
}
else
{
if(iterator->getID() < IDtoFind)
{
IDtoFind = iterator->getID();
}
}
i++;
iterator = iterator->nextObject;
}
return IDtoFind;
};
该函数接受指向主列表的指针、列表中当前对象的个数和ID。
static JednostkaMaszyny*& getObjectAtIDAndAssignItToSortedList(JednostkaMaszyny*& headOfList, short numberOfObjects, int ID)
{
short i = 0;
JednostkaMaszyny* iterator;
JednostkaMaszyny* returnedObject = NULL;
int tmpBoolNumber;
bool tmpBool = false;
iterator = headOfList;
while(i < iloscObiektow)
{
tmpBoolNumber = iterator->getBoolSorted();
if((iterator->getID() == ID) && tmpBoolNumber)
{
cout<<iterator->getID();
if(typeid(*iterator) == typeid(Desktop))
{
returnedObject = new Desktop(((Desktop*)iterator)->getwysokosc(),((Desktop*)iterator)->getDlugosc(),((Desktop*)iterator)->getSzerokosc(),((Desktop*)iterator)->getClockProcessor()
,((Desktop*)iterator)->getIdNumber(),((Desktop*)iterator)->getprocessorType(),((Desktop*)iterator)->getnameInNetwork(),((Desktop*)iterator)->getID());
//((Desktop*)iterator) -> setBoolSorted(1);
break;
}
else
{
returnedObject = new Laptop(((Laptop*)iterator)->getWagaLaptopa(),((Laptop*)iterator)->getClockProcessor(),((Laptop*)iterator)->getIdNumber(),((Laptop*)iterator)->getprocessorType(),
((Laptop*)iterator)->getnameInNetwork(),((Laptop*)iterator)->getID());
//((Laptop*)iterator) -> setBoolSorted(1);
break;
}
iterator->setBoolSorted(1);
}
i++;
iterator = iterator->nextObject;
}
//iterator->setID(1); I've tried to set attribute of object that it is already sorted but it fails here saying: Access fail to object.......
return returnedObject;
};
最后一个函数。它是主要的"引擎"。它接受指向主列表的指针,对象数和指向列表中最后一个对象的有用指针。
void static sortListByUser(JednostkaMaszyny*& headOfList, short numberObjects, JednostkaMaszyny*& helpFullPointer)
{
JednostkaMaszyny* tmpSortedList = NULL;
JednostkaMaszyny* iterator;
short choice;
short numberOfObjects;
int tmpId;
numberOfObjects = numberObjects;
cout<<"1 - Ascending"<<endl;
cout<<"2 - Descending"<<endl;
cout<<"Your choice: "; cin>>choice;
if(choice == 1)
{
if(numberOfObjects > 0)
{
while(numberOfObjects > 0)
{
if(tmpSortedList == NULL)
{
tmpId = findID(headOfList,numberOfObjects,false);
tmpSortedList = getObjectAtIDAndAssignItToSortedList(headOfList,numberOfObjects,tmpId);
iterator = tmpSortedList;
//tmpSortedList->previousObject = NULL;
numberOfObjects--;
}
else
{
tmpId = findID(headOfList,numberOfObjects,false);
iterator->nextObject = getObjectAtIDAndAssignItToSortedList(headOfList,numberOfObjects,tmpId);
iterator->nextObject->previousObject = iterator;
iterator = iterator->nextObject;
numberOfObjects--;
}
//iterator->nextObject = NULL;
}
//iterator->
}
else
{
cout<<"LISTA JEST PUSTA"<<endl<<endl;
}
}
};
我查看了您的函数并尝试运行它,但我错过了您的程序的其余部分。但是,我想我知道你的代码中有什么问题,你在原始帖子中给我的错误。
ERROR: Access violation reading location 0x00000000
这种错误通常意味着你试图访问一个从未在其各自作用域中保留(分配)的内存地址。由于您试图读取十六进制值0x00000000的内存位置,这是一个32位的二进制值,所有的零,这是最有可能的,你正在试图尊重一个NULL指针,这是未定义的行为。这个指针指向的是32位数据类型我猜是整数
防止这种情况的一种方法是创建一个条件语句来测试指针是否为NULL。if (pointer)
cout << "pointer is pointing to an integer.";
else
cout << "pointer is a null pointer.";
这就解释了为什么你的算法可以工作,但当你试图读取值时却失败了。
对于将来的问题,请尝试缩小问题范围并在较小的程序中重新创建它,以便我和本网站的其他人可以更容易地帮助您。在这种情况下,如果您一开始就不知道问题出在哪里,可能很难做到这一点。
调试提示:使用断点和调用堆栈窗口可以帮助你找到你的程序在哪里分配了NULL指针,你不需要它们
- 正在查找文档以获得PS4平台的C++中的设备信息
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 如何从结构列表中筛选信息
- Qt - 信息未在列表视图中加载
- 超类需要比初始化列表提供的信息更多的信息
- 是否有办法将游戏列表信息从Steam进入桌面应用程序?
- 如何在列表框而不是编辑框中显示信息
- 排序算法在试图打印列表信息时崩溃