Проблема динамического вывода массива - PullRequest
2 голосов
/ 21 сентября 2011

Я работаю над домашним заданием, в котором мне пришлось преобразовать все статические массивы в программе в динамические массивы с помощью указателей. Я почти уверен, что понимаю концепцию, внес изменения и моя программа запускается. Проблема с моими результатами вывода. Я подозреваю, что неправильно ввел данные из файла, который я использую. Вот фотография моей проблемы, а также соответствующий код:

ИЗМЕНЕНИЯ ИЗ 9/21 ПОСЛЕ ЭТОГО ТОЧКИ:

Файл вывода и данных: enter image description here

main

#include "Ch9_Ex7.h"

int main()
{
    int numCandidates;
    string *allCandidates;
    int *votes;
    int index, totalVotes;
    ifstream infile;

    allCandidates = new string[1];
    votes = new int[1];


    infile.open("./Ch9_Ex7Data.txt");
    if (!infile)
    {
        cerr << "Cannot open input file. Program terminates!" << endl;
        return 1;
    }

// read number of candidates

    readVotes (infile, votes, allCandidates, numCandidates);

    //delete [] votes;
    //delete [] allCandidates;

Функция ввода:

#include "Ch9_Ex7.h"

void readVotes (ifstream & infile, int *&votes,
                string *&allCandidates, int & numCandidates)
{

//    read number of candidates
    infile >> numCandidates;
    infile.ignore();  // carriage return

    //delete [] votes;
    //delete [] allCandidates;

    allCandidates = new string[numCandidates];
    votes = new int[numCandidates];

    for (int index = 0; index < numCandidates; index++)
    {
        infile >> votes[index];
        infile.ignore();  // space
        getline(infile, allCandidates[index]);
    }

}

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Вы создаете массив из одного char и одного int с этим кодом:

allCandidates = new char[1];
votes = new int[1];

Я полагаю, вы имели в виду:

allCandidates = new char[numCandidates];
votes = new int[numCandidates];

, который создает динамические массивы размером numCandidates.

Кроме того, когда вы вводите имена кандидатов, которые вы, вероятно, хотели бы использовать std::string, примерно так:

string *allCandidates;
allCandidates = new string[numCandidates];

(Спасибо Бену Фойгту за указание на это) И поскольку вы вводите их полное имя, вам нужно будет вводить его по-другому. Возможно использовать getline():

getline(cin, allCandidates[i]);

В ответ на ваше редактирование:

Вы должны будете передать свои указатели как ссылки:

void readVotes (ifstream & infile, int *&votes, string *&allCandidates, int & numCandidates)

и освободите их в main()

delete[] votes;
delete[] allCandidates;
1 голос
/ 21 сентября 2011

Во-первых, это абсолютно ужасный дизайн, поэтому, пожалуйста, не делайте этого за рамками этого упражнения.

Теперь перейдем к вопросу. Если вы хотите создать динамический объект (или массив) где-нибудь и передать ему указатель обратно, вы должны взять указатель по ссылке. Вы также должны прочитать имена в строку, а не в один символ.

void readVotes (std::ifstream & infile, int * & votes, std::string * & allCandidates, int & numCandidates)
{
  // read numCandidates

  votes = new int[numCandidates];
  allCandidates = new std::string[numCandidates];

  // populate
}

Звонящий должен помнить, чтобы убрать:

int main()
{
  int n;
  int * votes;
  std::string * names;

  readVotes(std::cin, votes, names, n);

  // ...

  delete[] votes;
  delete[] names;
}

(В реальной ситуации у меня была бы функция, возвращающая std::vector<std::pair<int, std::string>>.)

...