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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2012, 16:22   #1
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию Хеш таблица C++

Здравствуйте! Сделал я наконец эту хеш таблицу.
Метод открытой адресации. элемент массив - пара ключ значение оба string.
Три функции добавление пары, удаление и получение значения.
Но при попытке вывести на экран полученное значения функции нахождения значения мне выдаёт предупреждение (cannot pass objects of non-POD type 'struct std::string' throught '...') и при запуcке программы программа вылетает.
Код GetKey (вообще-то значения, то лень переименовывать всё)
Код:
string Hash::GetKey(string x)
{
	int i,m,s;
	i=Crc32((unsigned char *)x.c_str(), x.size());
	i=i%50;
	s=i;
	for (;i<m;i++)
	{
		if (xesh[i].Key==x)
			return xesh[i].znach;
		if (i==50-1)
		{
			m=s;
			i=0;
		}
	}
	return "";
}
Вот сосбвтенно вызов
Код:
int main ()
{
	Hash x;
	x.AddKeyValue("boris", "one");
	x.AddKeyValue("petr", "two");
	x.AddKeyValue("petya", "three");
	printf("%s\n",x.GetKey("boris"));
	scanf("%*c");
	return 0;

}

Последний раз редактировалось Jirogirg; 02.07.2012 в 16:25.
Jirogirg вне форума Ответить с цитированием
Старый 02.07.2012, 18:08   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Попробуй std::cout
rlib вне форума Ответить с цитированием
Старый 02.07.2012, 18:24   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

printf должен в данном случае принимать char*, так что в данном случае вы можете написать
Код:
printf("%s\n",x.GetKey("boris").c_str());
Но зачем в C++ использовать функции семейства printf, когда у вас есть потоки типа того же std::cout?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.07.2012, 17:29   #4
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Ребят, создал конструктор для хеш.
Код:
Hash::Hash(int m)
{
	int i;
	tab xesh[m];
	for (i=0;i<m;i++)
	{
		xesh[i].Key=NULL;
		xesh[i].znach=NULL;
		xesh[i].none=1;
	}
}
Key и znach=NULL;
none=bool;

Выдаёт ошибку ambiguous overload for "operator=".

Последний раз редактировалось Jirogirg; 14.07.2012 в 17:52.
Jirogirg вне форума Ответить с цитированием
Старый 14.07.2012, 21:19   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

1.
Код:
tab xesh[m];
Зачем вам локальный массив, который пропадет сразу же после того, как конструктор закончит работу?
2. Такое вообще не должно работать, поскольку по крайней мере C++ 03 не поддерживает статические массивы с неизвестным на момент компиляции размером. Вам нужно выделять память динамически.
3. По поводу вашего вопроса - попробуйте присвоить не 1, а true.
4. Перечитайте все-таки еще разок-другой хорошую книжку по плюсам...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 15.07.2012, 18:19   #6
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Хм... А если создавать конструктор без параметра, полю none не присвоится никакое значение ведь так? А далее я сравниваю с этим параметром в программе. Поэтому я и решил создать такой конструктор.

Вот целая программа, но мне кажется полю none при создании объекта класса HASH надо задать какое-то значение.
Код:
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <stdint.h>
#include <string>
#include <set>
using namespace std;

typedef struct tab
{
	string Key;
	string znach;
	bool none;
} tab;

class Hash
{
public:
	tab xesh[50];
	void AddKeyValue (string x, string y);
	void DelKey (string x);
	string GetKey (string x);
	Hash ();
	~Hash ();
};

Hash::Hash()
{
}
Hash::~Hash()
{
}




uint_least32_t Crc32(unsigned char *buf, size_t len)
{
    uint_least32_t crc_table[256];
    uint_least32_t crc; int i, j;
 
    for (i = 0; i < 256; i++)
    {
        crc = i;
        for (j = 0; j < 8; j++)
            crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1;
 
        crc_table[i] = crc;
    };
 
    crc = 0xFFFFFFFFUL;
 
    while (len--) 
        crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8);
 
    return crc ^ 0xFFFFFFFFUL;
}

void Hash::AddKeyValue (string x, string y)
{
	int i,s,m;
	i=Crc32 ((unsigned char *)x.c_str(), x.size());
	i=i%50;
	s=i;
	m=50;
	for (;i<m;i++)
	{
		if (xesh[i].none==true)
		{
			xesh[i].Key=x;
			xesh[i].znach=y;
			xesh[i].none=false;
			return;
		}
		if (i==50-1)
		{
			m=s;
			i=0;
		}
	}
}

void Hash::DelKey(string x)
{
	int i,s,m;
	i=Crc32 ((unsigned char *)x.c_str(),x.size());
	i=i%50;
	s=i;
	m=50;
	for (;i<m;i++)
	{
		if (xesh[i].Key==x)
		{
			xesh[i].none=true;
			return;
		}
		if (i==50-1)
		{
			m=s;
			i=0;
		}
	}
}

string Hash::GetKey(string x)
{
	int i,m,s;
	i=Crc32((unsigned char *)x.c_str(), x.size());
	i=i%50;
	s=i;
	m=50;
	for (;i<m;i++)
	{
		if (xesh[i].Key==x)
			return xesh[i].znach;
		if (i==50-1)
		{
			m=s;
			i=0;
		}
	}
	return "no such key";
}
int main ()
{
	Hash x;
	x.AddKeyValue("boris", "one");
	//x.AddKeyValue("petr", "two");
	//x.AddKeyValue("petya", "three");
	cout<<x.GetKey("boris");
	scanf("%*c");
	return 0;

}

Последний раз редактировалось Jirogirg; 15.07.2012 в 18:37.
Jirogirg вне форума Ответить с цитированием
Старый 15.07.2012, 18:40   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Хм... А если создавать конструктор без параметра, полю none не присвоится никакое значение ведь так?
никакое значение нет такого.
есть неопределенное значение.
вообще лучше явно инициализировать все.
а так же не забывать что списки инициализации предпочтительнее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.07.2012, 19:25   #8
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

А как мне через список инициализации инициализировать значения в массиве? То есть там же должен быть какой-то цикл, чтобы каждый элемент массива был инициализирован.
Мне нужно написать список инициализации в самой структуре, да?
Jirogirg вне форума Ответить с цитированием
Старый 15.07.2012, 19:56   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

про список это я не туда глянул, вообще полю none, надо присваивать значение которое оно имеет в момент инициализации.(true или false, в зависимости от смысла значения)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.07.2012, 20:24   #10
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Прошу прощения, а в какой момент мне нужно давать значение пункту none? В самом конструкторе наверное рано. Тогда в классе. А как можно задать каждому из 50-ти элементов полю none значение true?
Jirogirg вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хеш-таблица с разрешением коллизий связыванием Ovis Помощь студентам 0 18.05.2012 00:36
Хеш-таблица на основе стеков. Dephi Satevg Помощь студентам 1 17.04.2011 23:48
хеш-таблица CHUCKe Помощь студентам 2 17.11.2010 23:30
ХЕШ-таблица iceman2112 Общие вопросы C/C++ 0 09.05.2010 13:07
Хеш-таблица. Непонятно с решением коллизии методом перемешивания внутренними цепочками Познающий Помощь студентам 9 05.12.2009 02:48