Получить значение из функции

318
15 мая 2017, 01:06

Здравствуйте, подскажите , пожалуйста, ошибку. Не могу найти в чем проблема.

Имеется класс lisdtADT, который содержит в себе maxSize, size и cursor. Для утверждения инициализирую maxSize=11;` сразу, остальные переменные в конструкторе.

Проблема в том, что метод DataType getCursor(); *typedef int DataType; возвращает неверное значение(мусор).

После дебаггинга, я понял, что newDataItem в методе insert инициализируется правильными введенными значениями.

Далее, в файле source.cpp я пытаюсь подсчитать сумму моих введенных значений строкой total += samples.getCursor();. И именно getCursor(); возвращает мне мусор, который конечно же неправильно считает сумму.

Я думаю, что я выхожу в каком-то месте прибавляю лишнюю еденицу и поэтому происходит такая ошибка.

Помогите,пожалуйста, разобраться.Спасибо.

Мой код:

ListADT.h

#include<iostream>
const int defMaxListSize = 10;
typedef int DataType;
class ListADT
{
private:
    //Data members
    int maxSize=11;
    int size;
    int cursor;
    DataType *dataItems=NULL;
public:
    //Constructor
    ListADT(int maxNumber = defMaxListSize);
    //Destructor
    ~ListADT();
    //List manipulation operations
    void insert(const DataType &newDataItem);   //Insert after cursor
    void remove();                              //Remove Data item
    //void replace(const DataType &newDataItem);    //Replace data item

    //List status operations 
    bool isEmpty()const;                        //List is empty
    bool isFull() const;                        //List is full
    //List iteration operations
    void gotoBeginning() ;  //Go to beginning
    void gotoEnd();         //Go to end
    bool gotoNext();        //Go to next data item
    bool gotoPrior();       //Go to prior data item
    DataType getCursor();   //Return data item
    //Output the list structure -used in testinf/debugging
    //void showStructure()const;
};

ListADT.cpp

#include "ListADT.h"
ListADT::ListADT(int maxNumber):cursor(0),size(0)
{
    if (maxNumber <= defMaxListSize)
        dataItems = new DataType[maxNumber];
    else
        std::cout << "The list is overloaded" << std::endl;
}
ListADT::~ListADT()
{
    delete dataItems;
}
void ListADT::insert(const DataType & newDataItem)
{
    if (size + 1 <= maxSize) 
    {
        dataItems[cursor] = newDataItem;
        size++;
        cursor++;
    }
}
void ListADT::remove()
{
    if (size - 1 >= 0)
        cursor--;
}
bool ListADT::isEmpty() const
{
    if (size <= 0)
        return true;
    else
        return false;
}
bool ListADT::isFull() const
{
    if (size == defMaxListSize)
        return true;
    else
        return false;
}
void ListADT::gotoBeginning()
{
    cursor = 0;
}
void ListADT::gotoEnd()
{
    cursor = size;
}
bool ListADT::gotoNext()
{
    if (cursor < size)
    {
        cursor++;
        return true;
    }
    return false;
}
bool ListADT::gotoPrior()
{
    if (!isEmpty() && cursor != 1)
    {
        cursor--;
        return true;
    }
    else return false;
}
DataType ListADT::getCursor()
{
    if (!isEmpty())
    {
        //std::cout << "C: " << cursor << std::endl; //правильный результат
        //cursor--;
        return dataItems[cursor]; // возвращает мусор
    }
    else
    {
        std::cout << "Empty list" << std::endl;
    }
}

Source.cpp

#include <iostream>
#include "ListADT.h"
void main()
{
    ListADT samples;
    int newSample=0;
    int total = 0;
    //Read in a set of samples from the keyboard.
    std::cout << "Enter list of samples (end with eof): ";
    for (int i = 0; i < 10; i++)
    {
        std::cin >> newSample;
        samples.insert(newSample);
    }
    //Sum the samples and output the result.
        if (!samples.isEmpty())
        {
            samples.gotoBeginning();
            do {
                std::cout << "CUR " << samples.getCursor() << std::endl;
                total += samples.getCursor();
            }
            while (samples.gotoNext());
        }
        std::cout << "Sum is " << total << std::endl;
        system("pause");
}

Результат:

Answer 1

Ошибка была найдена в методе bool ListADT::gotoNext(). Происходил лишний шаг на единицу и поэтому десятый элемент возвращал мусор.

  1. Метод insert() остается без изменений:

     void ListADT::insert(const DataType & newDataItem)
    {
       if (size + 1 <= maxSize) 
      {
        dataItems[cursor] = newDataItem;
        size++;
        cursor++;
      }
    }
    
  2. Метод bool ListADT::gotoNext(). Меняем в условии size на size-1

     bool ListADT::gotoNext()
     {
           if (cursor < size-1)
          {
             cursor++;
           return true;
          }
         return false;
     }
    
READ ALSO
SFML - C++ - Рисование фигуры из класса

SFML - C++ - Рисование фигуры из класса

Не могу нарисовать фигуру, которую создал в классеУ меня есть функция Main и класс Player

502
Василий и подарок [требует правки]

Василий и подарок [требует правки]

Василий в магазине и выбирает ровно два подаркаУ Василия есть K монет, а в магазине можно купить N типов подарков

255
MPI - Сортировка Шелла

MPI - Сортировка Шелла

Добрый деньМне необходим программный код параллельной сортировки Шелла, написанный на C++, с использованием MPI

866
Как получить текущую позицию в std алгоритме

Как получить текущую позицию в std алгоритме

Нужно изнутри std алгоритма получить текущий индекс в коллекции или итератор текущего элемента, то можно как-нибудь сделать? Например, в std::generate_n...

231