Member 12812147 Ответов: 3

У меня проблема с хешированием.


Привет,
Я пытаюсь хэшировать английские слова из txt-файла и хранить их в таблице с помощью метода цепочки. но я не знаю, что не так, когда я пытаюсь искать и сравнивать .
эта ошибка :
"Выброшено исключение: нарушение доступа на чтение.
поиск был 0x1.
Если есть обработчик для этого исключения, программа может быть безопасно продолжена."


спасибо.

Что я уже пробовал:

#include <iostream>
#include <string> 
#include <sstream>
#include <fstream>
using namespace std;

#define a 1
#define b 2
#define p 311
#define size 355063

struct Node
{
	char* word;
	Node* next;
};
int ASCII_sum(char* word)
{
	int sum=0;
	for (int i = 0;i<strlen(word);i++) {="" sum="" +="word[i];" }="" return="" sum-2;="" int="" h(int="" k)="" (((a*k="" b)="" %="" p)="" size);="" void="" insert(node**="" d,="" index,="" node*="" word)="" if="" (d[index]="=" null)="" d[index]="word;" d[index]-="">next = NULL;
	}
	else
	{
		word->next = D[index];
		D[index] = word;
	}
}


Node** Hash(char* file_name)
{
	FILE* dictionary = fopen(file_name, "r");
	char w[128];
	Node** Dictionary = new Node* [size];
	for (int j = 0;j < size;j++) { Dictionary[j] = NULL; }
	int i = 0;
	while (i<354986)
	{
		fscanf(dictionary, "%s",w);
		Node* new_word = new Node;
		//new_word->word = strcpy(new_word->word, w);
		new_word->word = w;
		//insertion:
		int index = H(ASCII_sum(w));
		if (Dictionary[index] == NULL)
		{
			new_word->next = NULL;
			Dictionary[index] = new_word;
			
		}
		else
		{
			new_word->next = Dictionary[index];
			Dictionary[index] = new_word;
		}//insertion
		

		//insert(Dictionary, H(ASCII_sum(w)), new_word);
		//cout << Dictionary[index]->word<< endl;
		i++;
	}
	return &Dictionary[size];
}

/*void print_index(Node** table, int index)
{
	Node* P = table[index];
	while (P != NULL)
	{
		cout << P->word<<endl;
		P = P->next;
	}
}*/


bool check_sentence(string s,Node** Dectionary)
{
	bool found = true;
	istringstream split(s);
	while (split)
	{
		string tmp;
		split >> tmp;
		if (tmp == "") continue;
		char *t = new char[tmp.length()+1];
		t = strcpy(t, tmp.c_str());
		Node* search = Dectionary[H(ASCII_sum(t))];
		
		cout << H(ASCII_sum(t))<<endl;
		if (search == NULL)
		{
			return false;
		}
		while (search != NULL)
		{
			
			if (strcmp(search->word, t))
			{
				cout << search->word;
				found = true;
				break;
			}
			else
			{
				search = search->next;
				cout << search->word << endl;
			}
		}
		return false;
		
	delete [] t;	
	}
	
	return found;
}
void case_insensitive(char* text)
{
	return;
}
int main() {
	cout << "Processing...\n";
	Node* table = *Hash("words.txt");
	cout << "Finished.\n";
	string s;
	cin >> s;

	if (check_sentence(s,&table))
	{
		cout << "True\n";
	}
	else
	{
		cout << "False\n";
	}
}

Afzaal Ahmad Zeeshan

нарушение доступа к чтению.

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

Кроме того, он также направляет вас, говоря:, поиск был 0x1. У вас есть переменный поиск. Проверьте его еще раз на 0x1; отладьте его здесь.

jeron1

Звучит как хорошее время, чтобы пройти через код с помощью отладчика.

3 Ответов

Рейтинг:
2

CPallini

Предполагая, что это не домашнее задание, вы должны использовать std:: unordered_map[^].


Рейтинг:
2

Richard MacCutchan

fscanf(dictionary, "%s",w);
Node* new_word = new Node;
//new_word->word = strcpy(new_word->word, w);
new_word->word = w;

Таким образом, каждое слово Node. word в вашем словаре указывает на временный блок памяти, который принадлежит Hash функция и исчезнет, как только эта функция вернется. Вам нужно выделить память для каждого слова и скопировать строку из w, например:
Node* new_word = new Node;
int size = strlen(w) + 1;  // size of required buffer
new_word->word = new char[size];
strcpy(new_word->word, w);


Рейтинг:
0

Patrice T

Цитата:
"Выброшено исключение: нарушение доступа на чтение.
поиск был 0x1.
Если есть обработчик для этого исключения, программа может быть безопасно продолжена."
Простая обработка исключения никак не может позволить вашей программе безопасно продолжить работу.
Это сообщение любезно сообщит вам, что у вас есть проблема с "инициализацией указателя", "выделением памяти" или "путаницей указателя". Проблема может заключаться в сочетании вышеперечисленного.

Отладчик-лучший инструмент для отслеживания такого рода проблем.

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: возьмите лист бумаги и попробуйте сделать это вручную, ваша программа должна использовать ту же процедуру.

Примечание: ошибка в СР изменили свой код.