|
Модераторы: Daevaorn |
|
math_beginer |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 108 Регистрация: 29.5.2003 Репутация: нет Всего: 1 |
Есть такой код:
{ ... double **array; array=new double *[row] if(!array){ ShowMessage("...");exit(1);} for(int i=0;i<row;i++) { array[i]=new double [colomn]; if(!array[i]) {ShowMessage("...");exit(1);} } ... Проблема в том, что в строке array[i]=new double [colomn]; при i меньшем row при выполнении вываливается сообщение об ошибке: "Access violation at address... etc" Почему так, и как с этим бороться? Заранее благодарен --------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником. |
|||
|
||||
maxim1000 |
|
|||
Эксперт Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
вообще-то желательно бы привести весь код, чтобы люди могли запустить его у себя, попробовать...
-------------------- qqq |
|||
|
||||
OlegsDP |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.2.2004 Репутация: нет Всего: 1 |
Я попробовал вот такую программку - все работает.
А в Вашем коде в строке
отсутствует ';' |
||||
|
|||||
math_beginer |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 108 Регистрация: 29.5.2003 Репутация: нет Всего: 1 |
Я бы срадостью, только код большой. Вообще-то это выполняется в констукторе класса, который является членом другого класса, все это делается в циклах и т.д. вот кусок описания класса: class matrica{ protected: double **array; int row,colomn; public: ... matrica(int a,int b); ... }; вот конструктор: matrica::matrica(int a,int b) {row=a;colomn=b; array=new double * [row]; if(!array){cout<<"!array";getch();exit(1);} for(int i=0;i<row;i++) { array[i]=new double [colomn]; if(!array[i]){cout<<"!array[i]!";getch();exit(1);} } }
Сам по себе приведенный код у меня тоже работает, объекты (матрицы) создаются, перемножаются, инвертируются, память после использования освождается и т.д. Но вся беда втом что в этой программе столько нагромождено, что локализовать ошибку у меня не получается --------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником. |
||||
|
|||||
bel_nikita |
|
|||
Эксперт Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Дык, а для чего тогда DEBUG режим? Я не знаю, как там в Борландах, но если у тебя MVC, запусти дебаггер, и когда прога вылетит посмотри Call Stack. Можно exception подрубить и посмотреть. |
|||
|
||||
DenDen |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Строго говоря, когда создаются указатель они в Борландах НЕ ОБЯЗАТЕЛЬНО NULL перед каждым объявлением принудительно присваевай каждому указателю NUUL.
|
|||
|
||||
Fantasist |
|
||||
Лентяй Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это не только в Борландах. Строго говоря, new должен выбрасывать bad_alloc, если выделить память не удалось, и уж по крайней мере возвращать 0.
Хе. Так придется. Здесь мы тебе ошибку не локализуем. -------------------- Волны гасят ветер... |
||||
|
|||||
srd |
|
||||
Нереварин Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
В MSVC++ в отладочной версии неинициализированным указателям автоматом присваивается 0xcccccccc. В релизной версии проекта, разумеется, ничего подобного не делается.
Если включен какой-нибудь хедер из STL, хотя бы <new>, то бросается bad_alloc, если STL не используется, то оператор new просто вернет нулевой указатель. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
math_beginer |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 108 Регистрация: 29.5.2003 Репутация: нет Всего: 1 |
Так я уже пробовал так делать - никакой разницы, похоже что ошибка на самом деле не там где о ней выдается сообщение... Будем искать... --------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником. |
|||
|
||||
bel_nikita |
|
|||
Эксперт Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Так может с delet'ом проблемы? Что юзаешь, Борланд аль Визуал. Если Визуал, то посмотри Call Stack. Увидешь фукцию, где прога виснет (ну, возможно) |
|||
|
||||
maxim1000 |
|
|||
Эксперт Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно попробовать так:
удалять части программы, пока эта ошибка остается довольно часто таким образом получается не очень большая программка, которая глючит и размер имеет небольшой... -------------------- qqq |
|||
|
||||
math_beginer |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 108 Регистрация: 29.5.2003 Репутация: нет Всего: 1 |
кажется, нет. У меня раньше прога память кушала, так я спецально проверял - делал в больших циклах большие матрицы. Так что освобождается все нормально.
Визуал вообще ни разу не видел. Но вборланде такое тоже есть. Тока я не знаю как это дело работает... поэтому пока пользуюсь проверенным способом:
Это сообщение отредактировал(а) math_beginer - 1.4.2004, 17:58 --------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником. |
||||||
|
|||||||
bel_nikita |
|
||||
Эксперт Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Да, нет, не прав ты. Если бы способ был проверен, то уже давно бы нашел ошибку
Запускаешь прогу в дебаге. Когда прога сваливается. Смотришь Call Stack. И в ентом самом Call Stack увидешь функцию (то местно в проге) где софт вылетает. А дальше дело техники Thread'ы юзаешь?? |
||||
|
|||||
DenDen |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Это ж как его добыть, то чего неможет быть?
А вообще смени new/delete на malloc/free--и отлаживать легче и лучше понимаешь,что там творится....Лучше замолчать, пока поклонники Страуструпа не забили меня "C++ 3-d Edition",тяжелая книженция,понимаешь Это сообщение отредактировал(а) DenDen - 2.4.2004, 16:45 |
|||
|
||||
OlegsDP |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.2.2004 Репутация: нет Всего: 1 |
Так ведь проблема в том, что программа рушится совсем не там, где ошибка. Я в таких случаях делаю так: заключаю в комментарии все, что может вызывать ошибку. После этого ошибки нет. Затем начинаю постепенно снимать комментарии и проверять, не проявляется ли ошибка. Таким образом мне удавалось отловить "неуловимые" ошибки даже в Ч_У_Ж_И_Х проектах. |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |