Я получаю странную ошибку для программы, которая, похоже, должна «просто работать».

Я представляю вам все программы, над которыми я работаю, для моего курса по программированию в колледже. У меня еще есть несколько способов пройти, прежде чем он полностью выполнит требования моего задания, но я получил базовый черновик программы без ошибок (предположительно), и он, кажется, запускается … но потом он неожиданно пинает меня в отладчик Xcode и дает мне:

Thread 1: EXC_BAD_ACCESS(code=2, address=0x7fff95c1e5f5)

Вот вывод командной строки, пока он не выкинет меня:

    -----------------------
Quarterly_sales_taxator
-----------------------How many company divisions will we be dealing with?  2Am I correct in assuming that there are 4 sales quarters?    yesPlease enter the sales Company Division #1 brought in for Sales Quarter #1   20
(lldb)

Вот мой код:

    //
//  quarterly_sales_taxator.cpp
//  Ch. 7 program #7
//
//  Created by John Doe on 11/27/12.
//

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cctype>
using namespace std;

void read_company_divisions_and_sales_quarters(double **, int, int);
//void write_company_divisions_and_sales_quarters_to_array(double **, int, int);    // This will be used later on to read data from a file.
void display_quarterly_sales_array(double **, int, int);

string temp;    // A global temporary placeholder variable; I use this several times.int main()
{
int COMPANY_DIVISIONS,
SALES_QUARTERS = 4;

double **quarterly_sales_form;cout << "\n\n-----------------------\nQuarterly_sales_taxator\n-----------------------\n\n";

cout << "\nHow many company divisions will we be dealing with?  ";
getline(cin, temp);
stringstream(temp)>>COMPANY_DIVISIONS;

while (COMPANY_DIVISIONS < 1 || isdigit(COMPANY_DIVISIONS == false))
{
cout << "\n\n------"<< "\nError:"<< "\n------"<< "\n\nYou have entered an invalid choice."<< "\nPlease type a number greater than zero.    ";

getline(cin, temp);
stringstream(temp)>>COMPANY_DIVISIONS;
}

cout << "\n\nAm I correct in assuming that there are 4 sales quarters?    ";
getline(cin, temp);

// Convert to uppercase.
for (int count = 0; count < temp.length(); count ++)
{
temp[count] = toupper(temp[count]);
}

if (temp == "NO" || temp == "NOPE" || temp == "INCORRECT" || temp == "YOU ARE NOT" || temp == "YOU ARE INCORRECT" || temp == "NEGATIVE" || temp == "NEGATORY")
{
cout << "\nOk, then how many sales quarters are we dealing with?    ";
getline(cin, temp);
stringstream(temp)>>SALES_QUARTERS;
}

cout << endl << endl;

// This sets up the 2d array.
quarterly_sales_form = new double *[COMPANY_DIVISIONS];
for (int count = 0; count < COMPANY_DIVISIONS; count ++)
{   quarterly_sales_form[COMPANY_DIVISIONS] = new double [SALES_QUARTERS];  }

read_company_divisions_and_sales_quarters(quarterly_sales_form, COMPANY_DIVISIONS, SALES_QUARTERS);
//  write_company_divisions_and_sales_quarters_to_array(quarterly_sales_form, COMPANY_DIVISIONS, SALES_QUARTERS);   // I'll add this feature later.cout << "\n\nHere's what you entered:\n\n";
display_quarterly_sales_array(quarterly_sales_form, COMPANY_DIVISIONS, SALES_QUARTERS);

// Since we used a series of pointers, we need to free the allocated space back up.
for (int count = 0; count < COMPANY_DIVISIONS; count ++)
{   delete[] quarterly_sales_form[COMPANY_DIVISIONS];  }
delete[] quarterly_sales_form;return 0;
}/*############################################
# read_company_divisions_and_sales_quarters #
############################################*/
void read_company_divisions_and_sales_quarters(double **array, int DIVISIONS, int QUARTERS)
{

for (int count = 0; count < QUARTERS; count++)
{

for (int index = 0; index < DIVISIONS; index++)
{
cout << "\nPlease enter the sales Company Division #" << count+1 << " brought in for Sales Quarter #" << index+1 << "   ";
getline(cin, temp);
stringstream(temp) >> array[count][index];
}
}
}/*################################
# display_quarterly_sales_array #
#################################*/
void display_quarterly_sales_array(double **array, int DIVISIONS, int QUARTERS)
{
for (int count = 0; count < DIVISIONS; count++)
{
cout << "\nCompany division #" << count+1 << ":\n";
for (int index = 0; index < QUARTERS; index++)
{    cout << array[count][index] << ", ";    }
}

}

Может ли какая-то добрая душа сказать мне, что я делаю не так?

1

Решение

    {   quarterly_sales_form[COMPANY_DIVISIONS] = new double [SALES_QUARTERS];  }

В этой строке COMPANY_DIVISIONS должно быть count,

5

Другие решения

В дополнение к тому, что сказал Дэн Халм, кажется, эта строка

stringstream(temp) >> array[count][index];

должно быть

std::istringstream(temp) >> std::skipws >> array[index][count];

В дополнение к использованию std::istringstream скорее, чем std::stringstream и убедившись, что lvalue находится под рукой, которая не является строго необходимой, пока тип чтения не станет более интересным, это также меняет индексы: index пробегает COMPANY_DIVISIONS а также count над SALES_QUARTERS,

Конечно, реальный вопрос: кто раздает такие задания? Манипуляции с указателями и их распределение лучше оставить авторам библиотек низкого уровня. Это C ++, а не C: мы можем и должны использовать абстракции. Обеспечение безопасности этого кода является серьезной проблемой, и нет смысла учить людей писать испорченный (например, небезопасный) код.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector