Показать сообщение отдельно
Старый 13.11.2013, 14:52   #1
dark
Читодел
Аватар для dark
OFFLINE
Регистрация: 09.04.2007
Сообщений: 965
Благодарностей:
36,577 всего
Мнения: + 37727
Репутация: 116394
Отправить сообщение для dark с помощью ICQ Отправить сообщение для dark с помощью Skype™

Загадка для программеров


Сегодня подруга обратилась за помощью по c++ лабе. Я по понятным причинам согласился

Итак, программа падает с нарушением целостности хипа.
Сорс:
Код:
// laba.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"

#include <iostream>
using namespace std;


class massiv  //объявили класс массив, блин
{	int len;    //в нем создали блин два поля блин: первое типо ддлинна массива
	int *p_mas;  //второе епт указатель на начало массива
public :
	massiv (int n)	// конструктор , блин
	{	
		int *p;   //тут то мы и создаем наш массив
		p= new int(n);
		p_mas= p;
		len=n;
		for( ; p<p_mas+len ; p++) {  //и заполняем его рандомными значениями
			*p = rand()%100;
		}

	}
	void display()		// метод для вывода массива на экран
	{	int *p;
		for(p=p_mas ; p<p_mas+len ; p++)
			cout<<(*p)<<'\n';   //берем и перебериаем все элементы массива и выводим их на епта экран

		cout<<endl;
	}

	  // вот тут то  мы и начниаем нашу работу по переопределению конструкторов
	void operator ++ ()	// перегруженный оператор «инкремент»
	{	int *p;   //этот операторт занимается тем, что ищет сумму в  нашем массве всех чисел. сумму всех чисел.
		int sum=0;
		for(p=p_mas ; p<p_mas+len ; p++)	
			sum+=*p;
		cout<<"sum="<<sum<<endl;   //и выводит ее на экран
	}

	  // а тут мы едрить переопределяем оператор деления, причем так что бы он не делил что-то то на что-то, а выбирал наименьшее или наибольше(смотри по заданию)
	massiv operator % (massiv &b)  
	{int temp_len,*pb,*pthis,*ptemp;
	  if (len>b.len)
	  temp_len=b.len;
	  else
		temp_len=len;
	  bool a=false;
	 massiv temp(temp_len);  //типо создали и записываем все по правилам
	 for(pb=b.p_mas,pthis=p_mas,ptemp=temp.p_mas ; pb<b.p_mas+temp_len ; 		pb++,pthis++,ptemp++)	
		{
			if(a) { *ptemp=*pb>*pthis?*pb:*pthis; }
			else {	*ptemp=*pb<*pthis?*pb:*pthis;	}
	  		a=!a;
	 
		}
	 return temp;
	}



};


int _tmain(int argc, _TCHAR* argv[])
{
int i;
	massiv S(10),D(5),SUM(10);  //создаем три объекта класса
	cout<<"----massiv S ---" <<endl;
	S.display();   //выводим на экран первый
	 
	S++;  //считаем сумму его элементов и вывводим ее на экран
	cout<<"----massiv S ---" <<endl;
	S.display();  //снова выводим первый на экран
	cout<<"----massiv D ---" <<endl;
	D.display();  //выводим второй на экран
	cout<<"---spec---\n"<<endl;
	SUM=S%D;   //создаем третий из первых двух
	SUM.display();  // и тип выводим его на экран
	cin>>i;
	return 0;
}
Честно, пропарился с ней минут 20, повреждение происходит либо при выделении памяти под первый массив, то ли при его заполнении. И то и то проверил, всё по книжкам. Решил выделять память под массив классически через malloc и собственно всё заработало. Неужели проблема в конструкторе?

Cheats Development | Создание читов на заказ

Я не оказываю услуги гаранта!
База данных кидал: blacklist.rf-cheats.ru
Обязательно проверяйте человека через чёрный список прежде чем совершать с ним сделку.
 
Ответить с цитированием