Массив не назначен правильно - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь написать программу, которая принимает пользовательский ввод для имени файла.Оттуда он хранит числа в файле в массив, сортирует их, а затем отображает их.Тем не менее, я получаю большие числа, похожие на доступ к массиву за пределами, но я могу сказать, что я не отладчик.

  #include <iostream>
using namespace std; 

class TestScores
{ 
public:
    TestScores();

    TestScores(int scores);

    ~TestScores();

    void AddScore(int newScore);

    void DisplayArray();

    void SortScores();

    bool ArraySorted();

    int AvgScore();

private:
    int *scoresArray;  //Dynamically allocated array 
    int numScores;  //number of scores input by user
    int scoreCounter;
    const static int default_NumArrays=10; //Default number of arrays
};

#include <iostream>
#include "TestScores.h"

TestScores::TestScores()
{
    scoresArray=new int[default_NumArrays];
    scoreCounter=0;
    numScores=default_NumArrays;
}

TestScores::TestScores(int scores)
{
    scoresArray=new int[scores];
    numScores=scores;
    scoreCounter=0;
    for(int i=0; i<scores;i++)
        scoresArray[i]=0;
}

TestScores::~TestScores()
{
    delete[] scoresArray;
}

void TestScores::AddScore(int newScore)
{
    if(scoreCounter<numScores){
        scoresArray[scoreCounter]=newScore;
        scoreCounter++;
    }
    else
        cout<<"More scores input than number of scores designated"<<endl;
}

void TestScores::DisplayArray()
{
    for(int i=0; i<numScores; i++)
        cout<<scoresArray[i]<<endl;
    cout<<endl<<"This is scoresArray"<<endl;
}

bool TestScores::ArraySorted()
{
    for(int i=0; i<(scoreCounter-1);i++){
        if(scoresArray[i]<=scoresArray[i+1])
            continue;
        else
            return false;
    }
    return true;
}

void TestScores::SortScores()
{
    int tempValue;

    while(ArraySorted()!=true){
        for(int i=0; i<(scoreCounter-1); i++){
            if(scoresArray[i]<=scoresArray[i+1])
                continue;
            else{
                tempValue=scoresArray[i+1];
                scoresArray[i+1]=scoresArray[i];
                scoresArray[i]=tempValue;
            }
        }
    }
}


int TestScores::AvgScore()
{
    int sumScores=0;

    if(scoreCounter>0){
        for(int i=0; i<scoreCounter; i++)
            sumScores+=scoresArray[i];
        return (sumScores/scoreCounter);
    }
    else{
        cout<<"There are no scores stored."<<endl;
        return 0;
    }
}

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

using namespace std; 
//Function prototypes
bool FileTest(ifstream& inData);
void StoreScores(ifstream& inData, int& newNumScores, TestScores satScores);

int main()
{   
    int newNumScores=0;
    string inputFile;   //Contains name of the user file being used

    //Opening file stream
    ifstream inData;

    //User prompt for input file
    cout<<"Please enter the file name containing the student scores you wish to "
        <<"have stored, sorted, and displayed."<<endl;

    cin>>inputFile;

    //Opening file streams
    inData.open(inputFile.c_str());

    while(FileTest(inData)==false){
        cout<<"I'm sorry, the file you entered was not a valid file.  "
            <<"Please enter another file name, or enter q to exit"<<endl;
        cin>>inputFile;
        if(inputFile=="q")
            return 0;

        //Opening file streams
        inData.open(inputFile.c_str());
    }

    inData>>newNumScores;  
    TestScores satScores(newNumScores);   //Instantiating TestScores variable
    StoreScores(inData, newNumScores, satScores);  //Storing scores into array

    satScores.DisplayArray();
    satScores.SortScores();
    satScores.DisplayArray();
    cout<<endl<<"This is the array after sorting"<<endl<<endl;

    cout<<"This is the average score "<<satScores.AvgScore()<<endl;

    //Program pauses for user input to continue
    char exit_char; 
    cout<<"\nPress any key and <enter> to exit\n";
    cin>>exit_char;

    inData.close();

    return 0;   
}


bool FileTest(ifstream& inData)
{
    if(!inData)
    {
        cout<<"Your file did not open.\n";
        return false;
    }
    return true;
}


void StoreScores(ifstream& inData, int& newNumScores, TestScores satScores)
{   
    int userScore;
    while(inData>>userScore){
        satScores.AddScore(userScore);
    }
}

Мой тестовый файл random.dat и содержит следующее:

15
67
76
78
56
45
234

Основываясь на просмотре отладчика, я могу сказать, что ScoreCounter правильно увеличивается, а newScore содержитследующее значение, так почему же оно не сохраняется в массиве?Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

У вас есть пользовательский деструктор, но нет конструктора копирования или оператора присваивания.Неудивительно, что назначение не работает правильно, вы получаете утечку одного буфера и двойное освобождение от другого.

Следуйте правилу трех .Или, что еще лучше, используйте уже отлаженный контейнер, например std::vector.

2 голосов
/ 29 марта 2011

Хорошо, проблема довольно проста: вы передаете satScores по значению StoreScores. Это заполнит только локальную копию, для исправления измените подпись StoreScores на следующую:

void StoreScores(ifstream& inData, int& newNumScores, TestScores& satScores)

(Кстати, вы на самом деле не используете переменную newNumScores.) Выходные данные тогда, как и ожидалось:

15
67
76
78
56
45
234
0
0
0
0
0
0
0
0
0
0

Для дальнейшего улучшения вашего кода см. Комментарий GMan и ответ Бена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...