Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
S_hmel
3 / 3 / 0
Регистрация: 14.02.2012
Сообщений: 82
#1

Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию - C++

14.02.2012, 23:53. Просмотров 1393. Ответов 2
Метки нет (Все метки)

Здравствуйте!
Имеется программа поиска коллизий в хэш-функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
 
#define n 30 //размер таблицы
 
unsigned int ELFHash(char* str, unsigned int len) // хэш-функция ELF
{
   unsigned int hash = 0;
   unsigned int x    = 0;
   unsigned int i    = 0;
 
   for(i = 0; i < len; str++, i++)
   {
      hash = (hash << 4) + (*str);
      if((x = hash & 0xF0000000L) != 0)
      {
         hash ^= (x >> 24);
      }
      hash &= ~x;
   }
                              
 
        return hash%21; //коллизия при ключах 22-30
}
 
void main ()
{
        int table[n][2];
        int i, j=0, ch=1; // параметры цикла,  вводная переменная
        char key; // ключ
        //очищение хэш-таблицы
        for(i=0; i<n; i++)
        {
                table[i][0] = 0; //место для ключа
                table[i][1] = 0; //место для адреса в таблице
        }
        
        system("cls");
        while(ch != 0)
        {
                printf("\t\t\tMenu: Please select\n\t1 - Watch hash-table.\n\t2 - new key.\n\t3 Search. 0 Exit\n"); // имитация меню
                scanf("%d", &ch); // считывание символа
                if(ch > 1)
                {
                        printf("Enter the key: ");
                        scanf ("%c", &key);
                }
                switch(ch){
                        case 1: printf("[N]\tKey\tAdress", table[i][0], table[i][1]);  //вывод на экран хэш-таблицы
                                for(i=0; i<n; i++)
                                        printf("[%d]\t%d\t%d", i+1, table[i][0], table[i][1]);
                                break;
                        case 2: for(i=0; i<n*10; i++)                             //n*10 потому что после 250 проверок функции бессмысленно проверять дальше
                                        if(table[ELFHash(&key, n)+i*3+i*i*7][0] != 0) //проверка на свободное место в таблице
                                        {
                                                table[ELFHash(&key, n)+i*3+i*i*7][0] = key;
                                                table[ELFHash(&key, n)+i*3+i*i*7][1] = ++j;
                                                printf("\tKey was write after %d attempt", i);
                                        }
                                if(i==n*10) printf("Table is overload! Needs rehashing!!!");
                                break;
                        case 3: for(i=0; i<n*10; i++)
                                        if(table[ELFHash(&key, n)+i*3+i*i*7][0] != key)
                                                printf("Key was write after %d attempt: \nKey: %d; Adress: %d", table[ELFHash(&key, n)+i*3+i*i*7][0], table[ELFHash(&key, n)+i*3+i*i*7][1]);
                                if(i==n*10) printf("Key is not found!");
                                break;
                        default: printf("Error!");
                }
        }
}

Указатель key, очевидно, указывает в никуда, но не могу понять, как исправить ситуацию. Помогите, пожалуйста.

Отладка

И еще есть замечания такого типа.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2012, 23:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию (C++):

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу - C++
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу 0x77D88E19 (ntdll.dll) в Lab11.exe: 0xC0000005: нарушение...

Как исправить ошибку? Нарушение прав доступа при чтении по адресу - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;fstream&gt; #define MAIN3DS 0x4D4D #define EDIT3DS 0x3D3D #define EDIT_OBJECT...

нарушение прав доступа при записи. объясните, почему? и как избежать? - C++
void Stroka::F1(char*word) { char *point; if((point=strstr(data,word))) { strrev(word); } } нарушение прав доступа при...

Нарушение прав доступа при записи - C++
#include &lt;iostream&gt; void testfunc(char*&amp; test) { test = 's'; } int main() { char* test = &quot;Test&quot;;

Нарушение прав доступа при записи - C++
Доброго времени суток всем! Перечитал много тем на форуме и в интернете. Никак не могу решить свою проблему. Мне нужно сравнить символ...

Нарушение прав доступа при записи - C++
Создаю свой класс ошибок следующим образом: class SecureTransportException { private: SecureLibraryErrorCode errorCode_; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
15.02.2012, 09:13 #2
Переменная key в вашем коде не является указателем.
Переменная key имеет тип char.
C++
1
char key;
Получение адреса этой переменной всегда будет валидно и всегда будет указывать на адрес в памяти, где расположена переменная key. Поэтому, если вы про &key, то эта конструкция всегда будет указывать на валидный адрес переменной key в памяти.
1
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
15.02.2012, 14:20 #3
там же в отладке видно что ты вылазишь за пределы твоей таблицы
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2012, 14:20
Привет! Вот еще темы с ответами:

Нарушение прав доступа при записи - C++
void FilterStamp() { char ch; cout&lt;&lt;&quot;Введите Да или Нет: &quot;; scanf_s(&quot;%s&quot;,ch); cout&lt;&lt;endl; l1=first; while(l1!=0)...

Нарушение прав доступа при записи - C++
Пытаюсь написать класс, который бы выполнял инициализацию шрифта в directx и печатал строку на экран. Написал рабочий вариант, где...

Нарушение прав доступа при записи - C++
Привет всем! Извините за тупизм но у меня проблема. #include &lt;iostream&gt; using namespace std; void f(char* str) { int length =...

Нарушение прав доступа при записи - C++
Всем привет, нужно было сделать справочник, atoi(a) выделяет как ошибку, ЧЯДНТ? #include &lt;iostream&gt; #include &lt;fstream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru