Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как такое может быть?! Динамический массив 
:(
    Опции темы
math_beginer
Дата 31.3.2004, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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"

Почему так, и как с этим бороться? Заранее благодарен
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
maxim1000
Дата 31.3.2004, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



вообще-то желательно бы привести весь код, чтобы люди могли запустить его у себя, попробовать...


--------------------
qqq
PM WWW   Вверх
OlegsDP
Дата 31.3.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 25.2.2004

Репутация: нет
Всего: 1



Я попробовал вот такую программку - все работает.

Код

#include <stdio.h>
#include <windows.h>

void main ()
{
 int row = 30, colomn = 10;
 double **array = new double*[row];

 if(!array){
   printf("!array\r\n");exit(1);
 }
 for(int i = 0; i < row; i++) {
   array[i]=new double [colomn];
   if(!array[i]) {
     printf ("!array[i]\r\n");
     exit(1);
   }
   for (int j = 0; j < colomn; j++) array[i][j] = colomn * i + j;
 }

 for(i = 0; i < row; i++) {
   for (int j = 0; j < colomn; j++) {
     printf ("%3.0f ", array[i][j]);
   }
   printf ("\r\n");
 }
}


А в Вашем коде в строке

Код

array=new double *[row]


отсутствует ';'
PM MAIL   Вверх
math_beginer
Дата 31.3.2004, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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);}
}
}
Цитата
Я попробовал вот такую программку - все работает.

Сам по себе приведенный код у меня тоже работает, объекты (матрицы) создаются, перемножаются, инвертируются, память после использования освождается и т.д.
Но вся беда втом что в этой программе столько нагромождено, что локализовать ошибку у меня не получается sad.gif
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
bel_nikita
Дата 31.3.2004, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Но вся беда втом что в этой программе столько нагромождено, что локализовать ошибку у меня не получается

Дык, а для чего тогда DEBUG режим?
Я не знаю, как там в Борландах, но если у тебя MVC, запусти дебаггер, и когда прога вылетит посмотри Call Stack.
Можно exception подрубить и посмотреть.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
DenDen
Дата 31.3.2004, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



Строго говоря, когда создаются указатель они в Борландах НЕ ОБЯЗАТЕЛЬНО NULL перед каждым объявлением принудительно присваевай каждому указателю NUUL.
PM MAIL   Вверх
Fantasist
Дата 31.3.2004, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Строго говоря, когда создаются указатель они в Борландах НЕ ОБЯЗАТЕЛЬНО NULL


Это не только в Борландах. Строго говоря, new должен выбрасывать bad_alloc, если выделить память не удалось, и уж по крайней мере возвращать 0.


Цитата
Но вся беда втом что в этой программе столько нагромождено, что локализовать ошибку у меня не получается


Хе. Так придется. Здесь мы тебе ошибку не локализуем.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
srd
Дата 1.4.2004, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата
Это не только в Борландах

В MSVC++ в отладочной версии неинициализированным указателям автоматом присваивается 0xcccccccc. В релизной версии проекта, разумеется, ничего подобного не делается.
Цитата
Строго говоря, new должен выбрасывать bad_alloc, если выделить память не удалось, и уж по крайней мере возвращать 0.

Если включен какой-нибудь хедер из STL, хотя бы <new>, то бросается bad_alloc, если STL не используется, то оператор new просто вернет нулевой указатель.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
math_beginer
Дата 1.4.2004, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 29.5.2003

Репутация: нет
Всего: 1



Цитата
принудительно присваевай каждому указателю NUUL.

Так я уже пробовал так делать - никакой разницы, похоже что ошибка на самом деле не там где о ней выдается сообщение...
Будем искать...
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
bel_nikita
Дата 1.4.2004, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Сам по себе приведенный код у меня тоже работает, объекты (матрицы) создаются, перемножаются, инвертируются, память после использования освождается и т.д.

Так может с delet'ом проблемы?
Что юзаешь, Борланд аль Визуал.
Если Визуал, то посмотри Call Stack. Увидешь фукцию, где прога виснет (ну, возможно)


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 1.4.2004, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
math_beginer
Дата 1.4.2004, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 29.5.2003

Репутация: нет
Всего: 1



Цитата
Так может с delet'ом проблемы?

кажется, нет. У меня раньше прога память кушала, так я спецально проверял - делал в больших циклах большие матрицы. Так что освобождается все нормально.
Цитата
Что юзаешь, Борланд аль Визуал.
Если Визуал, то посмотри Call Stack. Увидешь фукцию, где прога виснет (ну, возможно)

Визуал вообще ни разу не видел. Но вборланде такое тоже есть. Тока я не знаю как это дело работает...
поэтому пока пользуюсь проверенным способом:
Цитата
удалять части программы, пока эта ошибка остается
довольно часто таким образом получается не очень большая программка, которая глючит и размер имеет небольшой...


Это сообщение отредактировал(а) math_beginer - 1.4.2004, 17:58
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
bel_nikita
Дата 2.4.2004, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
поэтому пока пользуюсь проверенным способом

Да, нет, не прав ты. Если бы способ был проверен, то уже давно бы нашел ошибку wink.gif
Цитата
Визуал вообще ни разу не видел. Но вборланде такое тоже есть. Тока я не знаю как это дело работает...

Запускаешь прогу в дебаге. Когда прога сваливается. Смотришь Call Stack. И в ентом самом Call Stack увидешь функцию (то местно в проге) где софт вылетает. А дальше дело техники smile.gif

Thread'ы юзаешь??



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
DenDen
Дата 2.4.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



Это ж как его добыть, то чего неможет быть?
А вообще смени new/delete на malloc/free--и отлаживать легче и лучше понимаешь,что там творится....Лучше замолчать, пока поклонники Страуструпа не забили меня "C++ 3-d Edition",тяжелая книженция,понимаешь smile.gif


Это сообщение отредактировал(а) DenDen - 2.4.2004, 16:45
PM MAIL   Вверх
OlegsDP
Дата 2.4.2004, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 25.2.2004

Репутация: нет
Всего: 1



Цитата
И в ентом самом Call Stack увидешь функцию (то местно в проге) где софт вылетает. А дальше дело техники


Так ведь проблема в том, что программа рушится совсем не там, где ошибка. Я в таких случаях делаю так: заключаю в комментарии все, что может вызывать ошибку. После этого ошибки нет. Затем начинаю постепенно снимать комментарии и проверять, не проявляется ли ошибка. Таким образом мне удавалось отловить "неуловимые" ошибки даже в Ч_У_Ж_И_Х проектах.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1497 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.