Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2015, 20:21   #1
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию Ошибка,связанная с памятью

Приветствую.
Есть класс, в котором описан следующий метод :
Код:
void Pars::ConnectCount()
{
	++connect_count;
}
Вызывается он следующим способом :
Код:
c->ConnectCount();
Получаю ошибку :
Код HTML:
First chance exception at $004037FE. Exception class $C0000005 with message 'access violation at 0x004037fe: write of address 0x50308650'. Process Is.exe (6204)
connect_count имеет тип unsigned int
При инициализации объекта в переменную connect_count сохраняется 0

Подскажите, пожалуйста, в чем может быть ошибка.
Изображения
Тип файла: png 1.png (31.4 Кб, 59 просмотров)
Gdasar вне форума Ответить с цитированием
Старый 03.02.2015, 20:52   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Подскажите, пожалуйста, в чем может быть ошибка.
В объявлении переменной "с". Видимо Вы её инициировали без знака "*" поэтому указатель указывает на случайную область памяти.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 03.02.2015, 22:46   #3
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Переменная не одна. Инициализирую данным образом :

Код:
Parsing **c = new Parsing*[H];
for(iter = 0; iter < H ; iter++)
{
	c[iter] = new Parsing();
}
Gdasar вне форума Ответить с цитированием
Старый 03.02.2015, 23:24   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Gdasar Посмотреть сообщение
Переменная не одна. Инициализирую данным образом :

Код:
Parsing **c = new Parsing*[H];
for(iter = 0; iter < H ; iter++)
{
	c[iter] = new Parsing();
}
Не верно. c[iter] = new Parsing[H]; для квадратной матрицы или другое к-во столбцов.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 03.02.2015, 23:33   #5
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Заменил, но все равно проблема осталась.

Код:
c[iter] = new Parsing[1];
Как всегда ругается на строку :
Код:
++connect_count;
Gdasar вне форума Ответить с цитированием
Старый 03.02.2015, 23:57   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Gdasar Посмотреть сообщение
Заменил, но все равно проблема осталась.
Полный код с определением класса, если не трудно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.02.2015, 00:11   #7
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Код:
class Parsing
{
	private:
		unsigned int connect_count; // сколько раз отправляли запрос
	public:
		void ConnectCount(); // увеличиваем кол-во обращений
		int ConnectCountReturn(); // возвращаем количество коннектов
		Parsing(); // задаем начальные данные
		~Parsing(); // удаляем данные
};

Parsing::Parsing()
{
	connect_count = 0;
}

Parsing::~Parsing()
{
	connect_count = 0;
}

void Parsing::ConnectCount()
{
	++connect_count;
}

int Parsing::ConnectCountReturn()
{
	return connect_count;
}

Последний раз редактировалось Gdasar; 04.02.2015 в 00:18.
Gdasar вне форума Ответить с цитированием
Старый 04.02.2015, 00:16   #8
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Хотя так все работает.
Код:
	Parsing *c = new Parsing();
	c->ConnectCount();
	c->ConnectCount();
	c->ConnectCount();
	Edit3->Text = c->ConnectCountReturn();
Gdasar вне форума Ответить с цитированием
Старый 04.02.2015, 00:25   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Хотя так все работает.
Совершенно верно. Ещё не поняли почему? Из классов, содержащих исполняемые функции нельзя делать многомерные массивы. Исключением являются списки объектов на основе классов. Если Вы хотите создать ногомерный массив, используйте структуры (struct) или объединения (union).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.02.2015, 00:31   #10
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Ну или сперва взять значение connect_count, увеличить его, а уже потом обратно вернуть его в объект.
Спасибо.
Gdasar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка с памятью ArmanPrestige Общие вопросы C/C++ 4 19.12.2012 20:35
ошибка связанная с С++? MultiFrukt Компьютерное железо 4 26.05.2012 13:45
возникает ошибка, связанная с StrToInt в Delphi Kurai Помощь студентам 3 07.04.2010 20:38
Ошибка связанная с floating point... bloodeagle Помощь студентам 1 18.02.2010 18:15
Ошибка, связанная с загрузкой из файла! kayman Помощь студентам 5 01.06.2008 21:23