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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
S_hmel
 Аватар для S_hmel
3 / 3 / 0
Регистрация: 14.02.2012
Сообщений: 82
14.02.2012, 23:53     Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию #1
Здравствуйте!
Имеется программа поиска коллизий в хэш-функции
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, очевидно, указывает в никуда, но не могу понять, как исправить ситуацию. Помогите, пожалуйста.

Отладка

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

C++ Нарушение прав доступа при записи
Нарушение прав доступа при записи C++
нарушение прав доступа при записи. объясните, почему? и как избежать? C++
C++ Нарушение прав доступа при записи
C++ Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
C++ Нарушение прав доступа при записи
C++ Как исправить ошибку? Нарушение прав доступа при чтении по адресу
Нарушение прав доступа при записи C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.02.2012, 09:13     Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию #2
Переменная key в вашем коде не является указателем.
Переменная key имеет тип char.
C++
1
char key;
Получение адреса этой переменной всегда будет валидно и всегда будет указывать на адрес в памяти, где расположена переменная key. Поэтому, если вы про &key, то эта конструкция всегда будет указывать на валидный адрес переменной key в памяти.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
15.02.2012, 14:20     Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию #3
там же в отладке видно что ты вылазишь за пределы твоей таблицы
Yandex
Объявления
15.02.2012, 14:20     Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию
Ответ Создать тему
Опции темы

Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru