排序算法在试图打印列表信息时崩溃

Sorting alghorytm crashes when trying to print information of list

本文关键字:列表 信息 崩溃 打印 算法 排序      更新时间:2023-10-16

在我的应用程序中,我想排序对象升序和降序。为此,我写了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指针,你不需要它们