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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2016, 22:25   #1
aven1q
 
Регистрация: 06.07.2016
Сообщений: 3
По умолчанию Код не заводится в visual studio 2015. Не выводится дерево.

Пытаюсь повторить Хаффмана у себя в VS15.
Код рабочий. Проверял в cpp.sh все выводит корректно.
Хочу писать в VS. Настроить нормально среду.

платформа win32
конфигурация релиз x86

консоль

code generation / runtime library - Multi-threaded (/MT)
general / character set - Use Multi-Byte Character Set

при запуске выбрасывает исклчение

"Exception thrown: read access violation.

root was 0x4E0049.

If there is a handler for this exception, the program may be safely continued."

запускал в codeblocks - та же картина.


Код:
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <iterator>


using namespace std;

class Node {

public:
	int a;
	char c;
	Node *left, *right;

	bool operator< (Node t) const
	{
		return a < t.a;
	}

	Node() {};

	Node(Node *L, Node *R)
	{
		left = L;
		right = R;
		a = L->a + R->a;
	}

};


struct Compare {

	bool operator() (Node *l, Node *r) const
	{
		return l->a < r->a;
	}
};

//void traversal(Node* root,unsigned k);
//void buildTable(Node *root);
void traversal(Node* root, unsigned k)
{

	if (root)
	{

		for (unsigned i = 0; i < k; i++)
		{
			cout << " ";
		}

		if (root->c) cout << root->a << " (" << root->c << ")" << endl;
		else cout << root->a << endl;

		traversal(root->left, k + 3);
		traversal(root->right, k + 3);

	}

}

vector<bool> code;
map<char, vector<bool> > table;

void buildTable(Node *root)
{
	if (root->left)
	{
		code.push_back(0);
		buildTable(root->left);
	}

	if (root->right)
	{
		code.push_back(1);
		buildTable(root->right);
	}

	if (root->c) table[root->c] = code;

	//for (int i = 0; i < code.size(); i++) cout << code[i];

	//cout<<endl;

	code.pop_back();
}


int main()
{

	string s = "my son is my sun!";

	map<char, int> M;



	for (int i = 0; i < s.length(); i++)
	{
		M[s[i]]++;
	}


	list<Node*> Tree;

	map<char, int>::iterator M_itr;

	for (M_itr = M.begin(); M_itr != M.end(); ++M_itr)
	{
		Node* one = new Node;
		one->c = M_itr->first;
		one->a = M_itr->second;
		Tree.push_back(one);
	}

	list<Node*>::iterator L_itr;

	for (L_itr = Tree.begin(); L_itr != Tree.end(); L_itr++)
	{
		cout << (*L_itr)->c << ":" << (*L_itr)->a << endl;
	}


	while (Tree.size() != 1)
	{
		Tree.sort(Compare());

		Node *son_L = Tree.front();
		Tree.pop_front();

		Node *son_R = Tree.front();
		Tree.pop_front();

		Node *parent = new Node(son_L, son_R);

		Tree.push_back(parent);
	}

	cout << endl;

	Node* root = Tree.front();

	traversal(root, 0);

	buildTable(root);

	for (int i = 0; i<s.length(); i++)
	{
		vector<bool> t = table[s[i]];
		vector<bool>::iterator V;

		for (V = t.begin(); V != t.end(); V++)
		{
			//cout<<t[k];    
			cout << *V;
		}
	}

	return 0;
}
aven1q вне форума Ответить с цитированием
Старый 06.07.2016, 23:01   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от aven1q Посмотреть сообщение
Код рабочий.
код содержит UB.
к вашему несчастью он успешно отрабатывает в линуксовой среде,
потому что там при старте,
операционка всю память процессу чистит в ноль.

но вам повезло: ошибки (их несколько)
сразу проявилась в виндузятной среде.

лекарство:

http://rextester.com/EVUI91969

Код:
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <iterator>

#include <cassert>


using namespace std;

class Node {

public:
	int a = 0;
	char c = 0;
	Node *left = nullptr;
    Node *right = nullptr;

	bool operator< (const Node& t) const { return a < t.a; }

	Node(){};

	Node(Node *L, Node *R)
	{
        assert(L);
        assert(R);
        
		left  = L;
		right = R;
		a = L->a + R->a;
	}

};


struct Compare {

	bool operator() (Node *l, Node *r) const
	{
        assert(l);
        assert(r);
		return l->a < r->a;
	}
};

void traversal(Node* root, unsigned k)
{
	if (root)
	{
		for (unsigned i = 0; i < k; i++)
			cout << " ";

        assert(root->a);
        if (root->c) 
            cout << root->a << " (" << root->c << ")" << endl;
		else 
            cout << root->a << endl;

		traversal(root->left , k + 3);
		traversal(root->right, k + 3);

	}

}

vector<bool> code;
map<char, vector<bool> > table;

void buildTable(Node *root)
{
    assert(root);
    
	if (root->left)
		code.push_back(0),
		buildTable(root->left);

	if (root->right)
		code.push_back(1),
		buildTable(root->right);

	if (root->c) 
        table[root->c] = code;
    
    if(!code.empty())
	    code.pop_back();
}


int main()
{
	string s = "my son is my sun!";

	map<char, int> M;

	for (int i = 0; i < s.length(); i++)
		M[s[i]]++;

	list<Node*> Tree;

	map<char, int>::iterator M_itr;

	for (M_itr = M.begin(); M_itr != M.end(); ++M_itr)
    {
		Node* one = new Node;
		one->c = M_itr->first;
		one->a = M_itr->second;
		Tree.push_back(one);
    }

	list<Node*>::iterator L_itr;

	for (L_itr = Tree.begin(); L_itr != Tree.end(); L_itr++)
	{
        assert((*L_itr)->c);
        assert((*L_itr)->a);
		cout << (*L_itr)->c << ":" << (*L_itr)->a << endl;
	}


	while (Tree.size() != 1)
	{
		Tree.sort(Compare());

		Node *son_L = Tree.front();
		Tree.pop_front();

		Node *son_R = Tree.front();
		Tree.pop_front();

		Node *parent = new Node(son_L, son_R);

		Tree.push_back(parent);
	}

	Node* root = Tree.front();

	traversal(root, 0);
	buildTable(root);
    
	for (int i = 0; i<s.length(); i++)
	{
		vector<bool> t = table[s[i]];
		vector<bool>::iterator V;

		for (V = t.begin(); V != t.end(); V++)
			cout << *V;
	}
}
_Bers вне форума Ответить с цитированием
Старый 06.07.2016, 23:54   #3
aven1q
 
Регистрация: 06.07.2016
Сообщений: 3
По умолчанию

я подозревал что дело в инициализации указателей
до этого они ссылались на недоступную область памяти

но в VS15 assert сразу выбрасывает ошибки

в codeblocks работает, спасибо.

похоже null недостаточно и где-то все-таки нужно чистить память?
aven1q вне форума Ответить с цитированием
Старый 07.07.2016, 09:18   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от aven1q Посмотреть сообщение
но в VS15 assert сразу выбрасывает ошибки
я представил вам не только рабочий код,
но и ссылку на онлайн компилятор,
которая иллюстрирует успешную работу VS15

Цитата:
Сообщение от aven1q Посмотреть сообщение
похоже null недостаточно и где-то все-таки нужно чистить память?
1.
вам нужно слить этот код в унитаз.
и забыть о нем, как о страшном ужасе.

2.
перестать делать ни на чем не обоснованные предположения.

3.
почитать зачем нужны ссылки.

4.
почитать правило трех.

5.
почитать зачем нужна инициализация.

6.
почитать о конструкторах копии.

7.
почитать о стилях и нотациях кода.

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

9.
если вы удаляете элемент из контейнера - сначала проверьте,
что контейнер не пуст.

10.
сначала проверяй, потом уже делай.

11.
научиться пользоваться отладчиком.

12.
открыть для себя "логгирование".
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сломалась Visual Studio 2015 flesyyykkk Общие вопросы C/C++ 1 27.05.2016 00:08
Не запускаются экзешники созданные в Visual Studio 2015 Konark WPF, UWP, WinRT, XAML 5 06.12.2015 17:18
написать программу в visual studio 2015 Lera_94 Помощь студентам 2 14.10.2015 21:32
Подправить код в Visual studio noob_11 Помощь студентам 0 04.04.2010 22:42