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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2011, 21:52   #1
РагнаР
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию Странное поведение функции работы с массивом(шаблон)

Нужно написать функцию, которая из динамического массива удаляет все повторяющиеся элементы(остается только первый), массив сжимается.То есть , если наш массив 3 3 3 4 0 4 0 0 0, то результат 3 4 0.
Функцию реализовать шаблонной.
Код:
#include<iostream>
#include<time.h>
using namespace std;
template<typename T>
 
void szhatie(T* mas,unsigned &size)
{
        int s=size,q=size;
        T *temp=new T[size];
        for(unsigned i=0;i<size;i++)
        {
                temp[i]=mas[i];
                for(unsigned j=i+1;j<size;j++)
                {
                        if(mas[i]==mas[j])
                        {
                                q--;
                                break;
                        }
                }
        }
        size=q;
        delete[]mas;
        mas=new T[size];
        unsigned index=0;
        for(unsigned i=0;i<s,index<size;i++)
        {
                bool a=true;
                for(unsigned j=0;j<i;j++)
                {
                        if(temp[i]==temp[j])
                        {
                                a=false;
                                break;
                        }
                }
                if(a)
                {                       
                        mas[index++]=temp[i];
                }
        }
        
        delete[]temp;
//      for(int i=0;i<size;i++)
//      {
//              cout<<"Element"<<mas[i]<<endl;
//      }
//}
 
int main()
{
        setlocale(LC_ALL,".1251");
        unsigned size;
        //srand(time(0));
        cout<<"Введите размер массива ";
        cin>>size;
        int *mas=new int[size];
        for(unsigned i=0;i<size;i++)
        {
                //mas[i]=rand()%5;
                cin>>mas[i];
                //cout<<mas[i]<<" ";
        }
        szhatie(mas,size);
        cout<<endl<<"Сжатый массив"<<endl;
        for(unsigned i=0;i<size;i++)
        {
                cout<<mas[i]<<" ";
        }
        return 0;
}
Если я ввожу числа 3 3 3 4 0 4 0 0 0, то результат выводит -572662307 1 0
Если раскомментировать последние строки в функции(которые выводят массив), то результат с теми же числами будет 1433284136 1 0
Если же я прогоняю программу построчно (ctrl+f10) или текст функции засовываю в мэйн, то результат 3 4 0, то есть то что надо.
РагнаР вне форума Ответить с цитированием
Старый 16.03.2011, 00:03   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

хотя бы в предыдущей своей теме ответил бы. а то получил ответ - и в игнор
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 вне форума Ответить с цитированием
Старый 16.03.2011, 01:04   #3
РагнаР
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию

Действительно. нехорошо я поступил. Спасибо за помощь. Может еще здесь поможешь?
РагнаР вне форума Ответить с цитированием
Старый 16.03.2011, 01:37   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

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

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

//------------------------------------------------------------
template <typename T>
void compress(T *&mass, int &size)
{
	int count = 0;
	int *id_list = new int[size];

	for (int i = 0, j = 0; i < size; i++, j = 0) {
		while (j < i && mass[i] != mass[j])
			j++;
		if (j == i)
			id_list[count++] = i;
	}

	if (size != count) {
		T *new_mass = new T[count];

		for (int i = 0; i < count; i++)
			new_mass[i] = mass[*(id_list + i)];

		delete [] mass;
		
		size = count;
		mass = new_mass;
	}

	delete [] id_list;
}

//------------------------------------------------------------
int main()
{
	int len = 10;
	int *mass = new int[len];

	srand(time(0));

	for (int i = 0; i < len; i++) {
		mass[i] = rand() % 10;
		cout << mass[i] << " ";
        }

	compress(mass, len);

	cout << endl;
	for (int i = 0; i < len; i++)
		cout << mass[i] << " ";

	delete [] mass;

	return 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; 17.03.2011 в 01:28.
pproger вне форума Ответить с цитированием
Старый 17.03.2011, 00:30   #5
РагнаР
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию

void szhatie(T*& mas,unsigned &size)
Вот этого изменения хватило, спасибо за помощь
РагнаР вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение realloc eraserhp Общие вопросы C/C++ 7 17.05.2010 09:52
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение процедуры Sergey1974 Общие вопросы Delphi 2 11.12.2009 21:41
Странное поведение DLL Yurk@ Компоненты Delphi 4 01.02.2009 01:23
Странное поведение ПОИСКПОЗ ZORRO2005 Microsoft Office Excel 5 19.05.2008 14:02