Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 14.02.2012
Сообщений: 82
1

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

14.02.2012, 23:53. Показов 1645. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2012, 23:53
Ответы с готовыми решениями:

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

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

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

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

2
3055 / 1460 / 492
Регистрация: 29.11.2010
Сообщений: 2,893
15.02.2012, 09:13 2
Переменная key в вашем коде не является указателем.
Переменная key имеет тип char.
C++
1
char key;
Получение адреса этой переменной всегда будет валидно и всегда будет указывать на адрес в памяти, где расположена переменная key. Поэтому, если вы про &key, то эта конструкция всегда будет указывать на валидный адрес переменной key в памяти.
1
30 / 30 / 6
Регистрация: 15.12.2011
Сообщений: 108
15.02.2012, 14:20 3
там же в отладке видно что ты вылазишь за пределы твоей таблицы
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2012, 14:20

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Нарушение прав доступа при записи
void FilterStamp() { char ch; cout&lt;&lt;&quot;Введите Да или Нет: &quot;; scanf_s(&quot;%s&quot;,ch);...

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

Нарушение прав доступа при записи
подскажите почему возникает ошибка void ChangeBrightness(HDC hdc, RECT In, RECT Out, DWORD Mode,...

Нарушение прав доступа при записи
Есть следующий код: class A { public: virtual someFuncA() = 0; }; class B : public A


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

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

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