Модераторы: 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   Вверх
math_beginer
Дата 2.4.2004, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Thread'ы юзаешь??

Вот, точно, сделал без потоков - все работает smile.gif. Только почему в потоках неработает - все равно не понятно...
Цитата
А вообще смени new/delete на malloc/free--и отлаживать легче и лучше

А вчем разница?
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
bel_nikita
Дата 2.4.2004, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



to OlegsDP
Цитата
Так ведь проблема в том, что программа рушится совсем не там, где ошибка

Программа всегда рушится только там, где ошибка wink.gif
Включаете ДЕБАГ режим. Запускаете софт. Софт вылетает, типа Access Violation и т.п.
В Call Stack будет находиться текущаю функция, т.е. фукция в которой произошел сбой!
Смотрите параметры функции и т.п. Т.е. возможно локализовать ошибку без комментария.
to math_beginer
Цитата
Вот, точно, сделал без потоков - все работает . Только почему в потоках неработает - все равно не понятно...

Синхронизация нам поможет tounge.gif

Разные треды иммеют доступ к ресурсу! А это очень плохо. Надо синхронизировать доступ


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


Шустрый
*


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

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



Цитата
Программа всегда рушится только там, где ошибка

Но ведь в данном конкретном случае это не так!!!
Сам по себе конструктор работает! И что самое непонятное: Принудительно присваеваем указателю NULL (допустим даже, что при этом теряется память). ПОЧЕМУ NULL-вому указателю не может быть выделена память????? Даже пусть память не выделяется, но не работает ведь именно оператор new, до проверки выделилась память или нет программа даже не доходит!!
ЗЫ Я скоро уже начну сомневаться что С++ самый надежный язык программирования butbut.gif
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
bel_nikita
Дата 2.4.2004, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



math_beginer
А в борланде проверка типа
Код
char* p=new char[100];
if (p==NULL ) ....

не катит. Как я знаю ( сам борланд не юзаю ) тама генерится ecxeption bad_allocate. Так что в строку if (p==NULL ) ты уже ни как не попадешь.
Цитата
ЗЫ Я скоро уже начну сомневаться что С++ самый надежный язык программирования

А что ты понимаешь под надежностью???
С++ это скорее мощный инструмент для программирования, а надежность тут не причем

Что-то мы отвлеклись от темы. Так что у тебя за проблемы?

РS: Еще раз: программа рушится только там где ошибка wink.gif



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


Нереварин
**


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

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



Цитата
А вообще смени new/delete на malloc/free--и отлаживать легче и лучше

В программах на C++ этого делать ни в коем случа нельзя. new/delete вызывают конструктор и деструктор, а malloc/free нет.

Цитата
Как я знаю ( сам борланд не юзаю ) тама генерится ecxeption bad_allocate. Так что в строку if (p==NULL ) ты уже ни как не попадешь.

Повторюсь, но скажу, что и в MSVC++ в случае неудачи new кидает bad_alloc, если включен любой хедер из STL, т.к. они включают стандартный заголовок <new>


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1317 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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