18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
||||||
1 | ||||||
Аварийное завершение программы, ошибка в функции вывода.21.10.2011, 07:08. Показов 2031. Ответов 12
Метки нет (Все метки)
Здравствуйте все. Пишу программу для сложения, вычитания матриц. Использую перегрузку операторов. При выводе результатов возникает ошибка и программа аварийно завершается. Я, наверное, неправильно работаю с выводом динамического массива, так как со статическим массивом вывод (void print() ) работает хорошо, ошибок не возникает. Если у кого - нибудь есть мысли по устранению ошибки, буду бесконечно благодарен.
0
|
21.10.2011, 07:08 | |
Ответы с готовыми решениями:
12
Ошибка. Аварийное завершение программы. Аварийное завершение программы Аварийное завершение программы Аварийное завершение работы программы |
45 / 45 / 9
Регистрация: 11.04.2010
Сообщений: 223
|
|
21.10.2011, 07:23 | 2 |
А память под массив кто выделять будет? Пардон, прогнал...
0
|
18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
|
21.10.2011, 07:25 [ТС] | 3 |
А что не так делаю? Можно подробнее, а то не понимаю.
0
|
45 / 45 / 9
Регистрация: 11.04.2010
Сообщений: 223
|
||||||
21.10.2011, 07:36 | 4 | |||||
Во первых память выделять принято в конструкторе, во вторых в строке 45 вы создаете локальную переменную a, и храните адрес выделенной памяти в ней... Вот рабочий код:
А еще у вас нет проверки размерности матриц в операторе +.
1
|
Заблокирован
|
|
21.10.2011, 07:41 | 5 |
Сейчас протестируем-с...
*через минутку* по поводу ошибок: в функции void Matrix::getData() error C2065: i: необъявленный идентификатор Добавлено через 2 минуты Matrix Matrix::operator+(const Matrix &p) warning C4018: <: несоответствие типов со знаком и без знака в строчке size_t i = 0; i < n; ++i Без знаковый сравнивается со знаковым. Предупреждение следует понимать так: мина замедленного действия.
1
|
18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
|
21.10.2011, 07:44 [ТС] | 6 |
Большое спасибо. Про выделение памяти в конструкторе я забыл...Сейчас исправлю.
А как лучше реализовать проверку размерности матриц?
0
|
45 / 45 / 9
Регистрация: 11.04.2010
Сообщений: 223
|
||||||
21.10.2011, 07:48 | 7 | |||||
0
|
18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
|
21.10.2011, 07:49 [ТС] | 8 |
Да, что - то я тут намудрил. А я компиллирую на Visual C++ 6.0 и никаких ошибок не возникает. Наверное, компиллятор древний.
0
|
Заблокирован
|
|
21.10.2011, 07:56 | 9 |
Память принято выделять тогда, когда это требуется по задаче. И далеко не всегда, это происходит в конструкторе.
Добавлено через 3 минуты нашел ошибку. В функции void Matrix::getData() int**a=new int*[n]; //объявление локальной переменной. Вам не нужно ничего объявлять. У вас итак есть переменная класса. Адрес примет локальная переменная, чей срок жизни быстро закончится. А вот настоящая переменная а, с которой работает метод Print() ничего не знает ни о каких выделялках. Правильно будит вот так: //int**a=new int*[n]; //ОШИБКА! НЕ НУЖНО СОЗДАВАТЬ ЛОКАЛЬНУЮ ПЕРЕМЕННУЮ! a=new int*[n]; //мы сразу присваиваем уже объявленной переменной значение Добавлено через 2 минуты Это точно) Компилятор древний. Рекомендую вам его заменить на более новые аналоги. Он уже не вполне соответствует стандарту языка.
1
|
18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
|
21.10.2011, 08:02 [ТС] | 10 |
Да просто в универе учусь, а там условие: разработка на VC++6.0 или Borland 5.0.
Вот и приходится мучиться.
0
|
Заблокирован
|
|
21.10.2011, 08:09 | 11 |
В таких случаях лучше писать безопасно:
int i; for ( i = 0; i < n; ++i) {} То есть, объявляйте счетчики вне цикла. Это прожуют и старые и новые компиляторы. Но вообще задумайтесь - почему у вас такие ограничения. Вас там что, сознательно обучают уже устаревшим стандартам? Вам же потом после такого обучения заново переучиваться придётся. Я бы на вашем месте призадумался - зачем тратить время и деньги на заведомо устаревшие стандарты? Не лучше ли договорится с преподавателем, объяснить ему, что я буду сидеть в новенькой студии, и писать в соответствии с новеньким стандартом. Если преподавателю нужен рабочий код, и знания - да пожалуйста. Но я не гарантирую совместимости с древними компиляторами.
1
|
18 / 18 / 8
Регистрация: 21.10.2011
Сообщений: 115
|
|
21.10.2011, 08:15 [ТС] | 12 |
0
|
Заблокирован
|
|
21.10.2011, 08:18 | 13 |
Ставьте себе дома студию поновее. И пишите код одновременно в и с шестерке, и в новой.
Если не хотите потом ходить по граблям и переучиваться.
0
|
21.10.2011, 08:18 | |
21.10.2011, 08:18 | |
Помогаю со студенческими работами здесь
13
Рекурсивная функция/аварийное завершение программы Аварийное завершение программы (Прата, глава 12, string1) Abnormal program termination (аварийное завершение программы) Аварийное завершение программы (Process terminated with status -1073741510) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |