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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 17:37   #1
thrashkid
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию ошибка в работе с динамической памятью

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

Код:
class Group
{
public:
	Group();
	void printaveret();
	void count();
	void add( Marks  );
	void print();
	
private:
	int n;
	double averet;
	int k;
	Marks * array;   // Marks это еще один класс, к которому вроде идет обращение
};


Group::Group()
{
	k = 0;
	averet = 0;
	n = 50;
	array = new Marks[n];
}

void Group::add( Marks  newElement )
{
	array[k].set(newElement.firstMark,newElement.secondMark,newElement.thirdMark,newElement.firstPtr,newElement.lastPtr,
		newElement.year,newElement.course,newElement.firstDiscipline,newElement.secondDiscipline,newElement.thirdDiscipline);
	k++;
}

void Group::count()
{
	double sum = 0;
	for ( int i = 0; i < k; i++ )
	{
		Marks *m = new Marks;     тут ошибка вроде 
		*m=array[i];     и тут........прога работает, но препод говорит, что память используется не так как нужно....я вообще не понимаю в чем тут косяк
		double s;
		run(m);
		
		s=m->averageMark;
		array[i].averageMark=m->averageMark;
		sum += s;
	}

Последний раз редактировалось pproger; 28.06.2011 в 22:40.
thrashkid вне форума Ответить с цитированием
Старый 28.06.2011, 22:19   #2
MaVaL
 
Регистрация: 23.06.2010
Сообщений: 9
По умолчанию

Что за run(m); ?

Последний раз редактировалось MaVaL; 28.06.2011 в 22:22.
MaVaL вне форума Ответить с цитированием
Старый 28.06.2011, 22:39   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
Marks *m = new Marks;
*m=array[i];
ну а что непонятного то. почитай про динамическую память
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.06.2011, 22:41   #4
MaVaL
 
Регистрация: 23.06.2010
Сообщений: 9
По умолчанию

(1) Marks *m = new Marks;
(2) *m=array[i];
(3) double s;
(4)run(m);
(5)s=m->averageMark;
(6)array[i].averageMark=m->averageMark;
(7)sum += s;

Так по порядку:
(1) - Обьявил указатель и создал объект класса Marks указатель m - указывает, на вновь созданный объект.
(2) - Новый объект равен объекту из массива.
(4) - неведомая функция, которая возможно меняет член данных averageMark объекта находящегося по указаелю m.

Ошибка - после выхода из тела цикла созданы k штук объектов класса Marks. За ними помять не очищена. И указатели на них утеряны.

P.S. я бы написал:
for ( int i = 0; i < k; i++ )
{
Marks m;
run(&m);
double s=m.averageMark;
array[i].averageMark=m.averageMark;
sum += s;
}
На каждой итерации объект создаётся и уничтожается по выходу.
MaVaL вне форума Ответить с цитированием
Старый 28.06.2011, 23:00   #5
thrashkid
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

run описывается в классе Marks

void run( Marks* marks )
{
marks->averageMark = ( (double) marks->firstMark + (double) marks->secondMark + (double) marks->thirdMark ) / 3;
}
thrashkid вне форума Ответить с цитированием
Старый 28.06.2011, 23:09   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
marks->averageMark = ( (double) marks->firstMark + (double) marks->secondMark + (double) marks->thirdMark ) / 3;
так никто не делает. хочешь получить double без каста, так и дели на double, либо кастуй по-человечески

Код:
double val = static_cast<double>(first_int + second_int + third_int) / 3;
Код:
double val = (first_int + second_int + third_int) / 3.0;
выбирай
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.06.2011, 23:10   #7
MaVaL
 
Регистрация: 23.06.2010
Сообщений: 9
По умолчанию

Цитата:
run описывается в классе Marks
Тогда его нужно делать методом класса. Ещё лучше определять значение averageMark в констукторе класса Marks
В таком случае у тебя получится цикл таким:
Код:
for ( int i = 0; i < k; i++ )
 sum += array[i].averageMark;
И ни какой долбёжки не будет)
MaVaL вне форума Ответить с цитированием
Старый 28.06.2011, 23:15   #8
thrashkid
 
Регистрация: 28.06.2011
Сообщений: 3
По умолчанию

в твоем 1ом варианте Maval выдается направильный ответ, вместо среднего бала выдает -858993000,
поменял
for ( int i = 0; i < k; i++ )
sum += array[i].averageMark; ответ все равно -858993000

Последний раз редактировалось thrashkid; 28.06.2011 в 23:26.
thrashkid вне форума Ответить с цитированием
Старый 30.06.2011, 00:48   #9
MaVaL
 
Регистрация: 23.06.2010
Сообщений: 9
По умолчанию

Цитата:
for ( int i = 0; i < k; i++ )
{
Marks m=array[i];
run(&m);
double s=m.averageMark;
array[i].averageMark=m.averageMark;
sum += s;
}
Да ошибся прошу прощения. Строчку подчеркнул.

Второй случай не работает. Т.к. ты не изменил констуктор класса. Соответственно у тебя выводилось не инициализированное значение.
Цитата:
Ещё лучше определять значение averageMark в констукторе класса Marks
Если этого не даелать то чможно сделать так:

Код:
for ( int i = 0; i < k; i++ ){
 run(&array[i]) - здесь произоёдет определение значения члена данного объекта
 sum += array[i].averageMark;
}

Последний раз редактировалось Stilet; 30.06.2011 в 08:06.
MaVaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка работы с памятью Alex Cones Общие вопросы Delphi 4 04.12.2010 06:45
Работа с ListBox и Edit и динамической памятью Serebah Помощь студентам 5 19.11.2010 13:41
Странный баг при работе с разделяемой памятью в C mephisto123 Qt и кроссплатформенное программирование С/С++ 2 01.08.2008 18:10
Помогите пожалуйста с динамической памятью и указателями Riddick2013 Помощь студентам 1 19.12.2007 14:41