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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 20:05   #1
IROKEZ
 
Регистрация: 18.04.2010
Сообщений: 4
По умолчанию Не могу понять, где ошибка(

Пытаюсь сделать двунаправленный ассоциативный контейнер, хранящий структуры. Собственно до того, чтобы он был ассоциативным далеко, но пока сделал создание самого массива со структурами. Однако программа падает (по-видимому где-то утечка памяти), но где именно и как исправить не пойму.
Код:
#include <iostream>
#include <assert.h>
using namespace std;
 
class Massive
{
public:
    Massive();
    ~Massive();
    void getElement(int N);
    void setElement(char *NAME, int num, int N);
    void setSize(int N);
    void getSize(int &N);
private:
    struct PhoneBook {
        char *name;
        int number;
    } *PhoneBookTab;
    int N;
};
 
Massive::Massive()
{
    N=0;
    PhoneBookTab=NULL;
}
 
Massive::~Massive()
{
    for(int i=0; i<N; i++)
        delete []PhoneBookTab;
}
 
void Massive::getElement(int n) // Функцию вывода элементов пока не писал
{
 
}
 
void Massive::setElement(char *NAME, int num, int n)
{
    assert(n>=0 && n<=N);
    PhoneBookTab[n].name=NAME;
    PhoneBookTab[n].number=num;
}
 
void Massive::setSize(int lenght)
{
    assert(lenght>=0);
    for(int i=0; i<N; i++)
        delete[] PhoneBookTab;
    PhoneBook *PhoneBookTab = new PhoneBook[lenght];
    N=lenght;
}
 
void Massive::getSize(int &lenght)
{
    N=lenght;
}
 
int main()
{
    Massive tab;
    int n, num;
    char *NAME;
 
    cout<<"Input number: ";
    cin>>n;
 
    tab.setSize(n);
    for(int i=0; i<n; i++)
    {
        cout << "Input name of abonent: ";
        cin >> NAME;
        cout << "Input tel number: ";
        cin >> num;
        tab.setElement(NAME, num, i);
    }
 
    return 0; 
}
IROKEZ вне форума Ответить с цитированием
Старый 16.12.2010, 20:11   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Код:
Massive::~Massive()
{
    for(int i=0; i<N; i++)
        delete []PhoneBookTab;
}
Вы пытаетесь удалить одну и ту же память N раз. Уберите цикл, оставьте только delete[] PhoneBookTab;. В setSize тоже
netrino вне форума Ответить с цитированием
Старый 16.12.2010, 20:18   #3
IROKEZ
 
Регистрация: 18.04.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Вы пытаетесь удалить одну и ту же память N раз. Уберите цикл, оставьте только delete[] PhoneBookTab;. В setSize тоже
Убрал, но проблема осталась...
IROKEZ вне форума Ответить с цитированием
Старый 16.12.2010, 20:33   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Действительно, ошибок там куда больше)
Код:
#include <iostream>
#include <assert.h>
using namespace std;
 
class Massive
{
public:
	Massive();
	~Massive();
	
	void getElement(int N);
	void setElement(char *NAME, int num, int N);
	void setSize(int N);
	void getSize(int &N);
private:
	struct PhoneBook {
		char *name;
		int number;
	} *PhoneBookTab;
	
	int N;
};
  
Massive::Massive()
{
	N=0;
	PhoneBookTab=NULL;
}
 

// !!!
Massive::~Massive()
{
	delete []PhoneBookTab;
}
    
void Massive::getElement(int n) // Функцию вывода элементов пока не писал
{
	 
}


void Massive::setElement(char *NAME, int num, int n)
{
	assert(n>=0 && n<=N);
	PhoneBookTab[n].name=NAME;
	PhoneBookTab[n].number=num;
}

// !!!
void Massive::setSize(int lenght)
{
	assert(lenght>=0);
	delete[] PhoneBookTab;
	PhoneBookTab = new PhoneBook[lenght]; // !
	N=lenght;
}
	  
// !!!
void Massive::getSize(int &lenght)
{
	length = N;
}
	    
int main()
{
    Massive tab;
    int n, num;
    char NAME[100]; // !! Выделение буфера, куда будет производится чтение.
						 
    cout << "Input number: ";
    cin  >> n;
	
    tab.setSize(n);
    for(int i=0; i<n; i++)
    {
        cout << "Input name of abonent: ";
        cin >> NAME;
        cout << "Input tel number: ";
        cin >> num;
        tab.setElement(NAME, num, i);
    }

    return 0; 
}
Вот исправленный код. Я пометил восклицательными знаками функции, в которые я внёс изменения. Изменил только чтобы перестало ругаться
netrino вне форума Ответить с цитированием
Старый 16.12.2010, 21:00   #5
IROKEZ
 
Регистрация: 18.04.2010
Сообщений: 4
По умолчанию

netrino
Большое спасибо!
IROKEZ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где ошибка в коде ?не могу понять Qiper Общие вопросы C/C++ 26 02.04.2012 21:19
не могу понять где ошибка Neon-z PHP 13 22.01.2011 16:15
Не могу понять где ошибка при сортировке строки!? Dema91 Помощь студентам 1 14.04.2010 20:11
Нужна Помошь: Не могу понять где ошибка CSS_Maker HTML и CSS 1 12.02.2010 00:02
Не могу понять где ошибка в коде SeRhy Общие вопросы C/C++ 5 20.09.2009 13:10