2015-05-30 42 views
-2

在我的应用程序中,我想排序对象升序和降序。为此,我写了3个函数。它可能排序,但是当我想打印所有列表我有错误,如:访问冲突读取位置0x00000000。我认为这份清单是空的,但我不确定。有什么问题?总结:列表在排序后似乎是空的。 alghorytm的作品,但打印列表崩溃的功能。尝试打印列表信息时排序alghorytm崩溃

JednostkaMaszyny是一个基本的抽象类。

//这个函数负责寻找最大的list中的最低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; 
     } 
    } 
}; 
+0

总之,简单的示例代码,只有为了演示一般原则,更喜欢像'JednostkaMaszyny'长,领域特定标识的短标识符,比如'Foo'。 –

+0

应该在发布之前获得不必要的代码,例如,“短期选择”等。 –

回答

0

我查看了你的函数并试着运行它,但是我错过了你程序的其余部分。但是,我想我知道您的代码中出现了什么问题,因为您在原始帖子中给出的错误。

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."; 

这将解释为什么您的算法可以正常工作,但在尝试读出值时会失败。

对于未来的问题,尽量缩小了问题,然后重新创建一个小程序,以便自己和别人在这个网站可以更容易地为您提供帮助。在这种情况下,如果您不明白问题出在哪里,那么这样做可能会很困难。


调试运行TIPS:使用断点和调用堆栈窗口,可以帮助你找到你的程序被分配NULL指针,你不希望他们。