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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 17:02   #1
takeNmake
 
Регистрация: 31.03.2013
Сообщений: 7
Сообщение Проблема с динамическим распределением памяти

Ребята, несколько дней сижу, не могу понять, как решить проблему:

при показе массива первые символы инициализированы мусором (в функции "initRepeats()")

код конечно нечитабельный, просто некогда...
Код:
// Работа 12.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <vector>
#include <cmath>

using namespace std;

class Vector
{
private:
	bool condition;
	int randDigit;
    int sizeVect;
	int *classVect;
	int *repeatVect; // можно и не объявлять его в классе
	int minNumber;
	int indexMax;

	// int repeatCount;// также
public:

	void setVect(int);
    void searchRepeats();
	void initRepeats(int, int, int);
	void searchMin(int);
    void showRepeatNum();
	void removeAll();
	~Vector(){     }
};

//==============================//

// создание и показ вектора:
void Vector::setVect(int size)// всё хорошо
{
	sizeVect = size;
	classVect = new int[sizeVect];
	cout<<" Случайный вектор из "<<sizeVect<<" элементов :"<<endl<<endl;
	for(int i=0; i<sizeVect; i++){
		randDigit = rand()%19-9;
		classVect[i] = randDigit;
		cout<<" "<<fixed<<setw(2)<<classVect[i];
	}
	cout<<endl<<" Повторяющиеся элементы: "<<endl;
}

//=============================//

// поиск повторов:
void Vector::searchRepeats()// всё хорошо
{
	condition = false;
	int board = sizeVect-1;
	int indxRep;
	int repeatCount = 0;
	for(int i=0, indxRep = 0; i<sizeVect; i++){
		for(int j=i+1; j<sizeVect; j++){
			if(classVect[i] == classVect[j] ){
				repeatCount = classVect[i];
				int indx = indxRep;
				indxRep++;
				initRepeats(indx, indxRep, repeatCount);
			}
			if(classVect[i] == classVect[j] && j == board){// условие вызова след. функции
				condition = true;
				repeatCount = classVect[i];
				int indx = indxRep;
				indxRep++;
				indexMax = indxRep; 
				repeatCount = 255;// присвоили максимальное значение типа int(не может быть минимальным!:)
				initRepeats(indx, indxRep, repeatCount);
            }
			// создать условие, если таких элементов нет
		}
    }
}

//================================================//

// создание массива повторов:
void Vector::initRepeats(int indx, int indxRep, int repeatCount)  
{
	/* 
	    Каждый раз при нахождении нужного элемента в предыдущей функции,
	вызывается эта, выделяется память под массив( каждый раз она различна зависит о indxRep),
	элементы массива инициализируются повторными числами. 
	    Далее они показываются (правильно), но при повторном обращении к массиву
	(простой вывод на экран содержимого, в конце данной функции или поиск максимального),
	инициализируются мусором(не ячейки памяти, а именно мусор)! 
	    Скорее всего причина в изменении адреса хранящихся повторных чисел
	(эти числа сохраняются, но индексы меняются)
	Возможно нужно использовать malloc(), realloc(), calloc(), вместо new , del.
	    Или причина в неправильном использовании памяти( нужно выделять память в массив,
		как объект класса)
	В любом случае проблема с памятью, указателями и индексацией.
		
	*/
	int indxMax = 0;
	indxMax = indxRep;
    repeatVect = new int[indxMax];
	for(int i = indx; i<indxMax; i++){
		cout<<endl<<" index Max  ::"<<indxMax<<endl<<endl;// temp
        repeatVect[indx] = repeatCount;
		cout<<" RV"<<indx<<": "<<repeatVect[indx]<<endl;// temp
	}
	//   temp-------------------temp
	cout<<endl;
	if(condition == true){
		for(int i=0; i<indxMax; i++){
			int *ptr = &repeatVect[i];
			cout<<" RV (after)"<<i<<": "<<*ptr<<endl;// temp
		}
	}
	//   temp-------------------temp
}

//==============================//

// поиск минимального значения:
void Vector::searchMin(int indxMax) // всё хорошо
{
	for(int j=0, minNumber = 0; j<indxMax; j++){
		minNumber = repeatVect[0];
		if(minNumber > repeatVect[j]){
			minNumber = repeatVect[j];
		}
		cout<<endl<<" MinNumber::"<<minNumber<<endl;// temp
	}
	// showRepeatNum(); // in future adding!
}
	
//==============================//

// показ искомого элемента:
void Vector::showRepeatNum() // всё хорошо
{
	cout<<endl<<endl<<" Минимальное число в векторе, встречающееся в нём более одного раза: "
	<<fixed<<setw(2)<<minNumber;
	condition = false;
	// removeAll(); // in future adding!
}

//==============================//

// что-то на подобии деструктора:
void Vector::removeAll()// всё хорошо
{
	for(int cV=0; cV<sizeVect; cV++){
		 classVect[cV] = 0;
	}
	for(int rV=0; rV<indexMax; rV++){
		repeatVect[rV] = 0;
	}
	sizeVect = 0;
	minNumber = 0;
	indexMax = 0;
}

//=======================================================================//

// головная программа:
int main(int argc, _TCHAR* argv[])// всё хорошо
{
	Vector declare;
	setlocale(LC_ALL, "Russian");
	int size = 0;
	while(true)
	{
		cout<<endl<<" Введите длину вектора:";
		cin>>size;
		if(size<=0)
		{
			cout<<endl<<" Некорректный ввод!!!"<<endl;
			continue;
		}
		else
		{ 
			declare.setVect(size);
			break; 
		}
	}

	// вызов методов класса:
	declare.searchRepeats();
	cin.get();
	declare.removeAll();
	cin.get();
	return 0;
}

Последний раз редактировалось Stilet; 01.04.2013 в 08:21. Причина: нет причин
takeNmake вне форума Ответить с цитированием
Старый 01.04.2013, 04:29   #2
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию

При вызове "initRepeats(...)", каждый раз создается новый массив и записывается в "repeatVect", так что при каждом обращении к "initRepeats(...)" ты работаешь с новым массивом, а к старому не имеешь доступа.

Первым аргументом функции "initRepeats(indx, indxRep, repeatCount)" может передаться не 0, а в функции есть код:

for(int i = indx; i<indxMax; i++){
cout<<endl<<" index Max ::"<<indxMax<<endl<<endl;// temp
repeatVect[indx] = repeatCount;
cout<<" RV"<<indx<<": "<<repeatVect[indx]<<endl;// temp
}

так что цикл может начаться не с нуля и элементы repeatVect[с 0 до indx], не будут инициализированы.
OktXIV вне форума Ответить с цитированием
Старый 01.04.2013, 16:06   #3
takeNmake
 
Регистрация: 31.03.2013
Сообщений: 7
По умолчанию

OktXIV, в любом случае спасибо, учту.
Также спасибо Stilet за редакцию кода
takeNmake вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с динамическим массивом Noob(c++) Общие вопросы C/C++ 56 02.08.2012 23:09
Двумерный массив с динамическим распределением памяти C++ ВладКлимов Помощь студентам 5 09.01.2012 13:41
Проблемы с динамическим распределением памяти в Си Семоха Валерий Помощь студентам 4 05.10.2011 16:10