Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Реализация Хэш таблицы, исходник не компилируется в borland c++  
:(
    Опции темы
ahito1
Дата 13.11.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 20.8.2007

Репутация: нет
Всего: -1



Доброго времени суток есть два файла PROG.CPP и MODUL.H - это исходники программы, которая реализует хеш-таблицы.
Нужно скомпилировать и запустить программу в borland c++ builder или в другой ide, пробую появляется много непонятных ошибок.
Помогите пожалуйста откомпилировать и запустить программу.

C++ не знаю абсолютно, изучаю джаву, до си++ ещё не дошёл.
PROG.CPP
Код

#include "modul.h"
void main()
{
char* command;
int i_key;
hash htbl(17,17);
htbl.load_from_file("file.ini");
htbl.insert_loaded();
while (strcmp(command,"exit")!=0)
{
htbl.view();
gets(command);
if (strcmp(command,"add")==0)
  {
    htbl.view();
    printf("Введите новый ключ: ");
    scanf("%i",&i_key);
    htbl.insert(i_key);
  };
if (strcmp(command,"find")==0)
  {
    htbl.view();
    printf("Введите искомый ключ: ");
    scanf("%i",&i_key);
    htbl.find(i_key);
  };
if (strcmp(command,"help")==0)
  {
    htbl.logo();
    htbl.view();
  };
if (strcmp(command,"delete")==0)
  {
    htbl.view();
    printf("Введите удаляемый ключ: ");
    scanf("%i",&i_key);
    htbl.delete_key(i_key);
  };
};
};



MODUL.H
Код

#include <conio.h>
#include <stdio.h>
#include <alloc.h>
#include <string.h>
#include <STDLIB.H>
struct hash_tbl
  {
  int key;//ключ
  int data;//данные
  int links;//ссылка
  };
struct kolision_tbl
  {
  int kolision_key;//ключ
  int kolision_data;//данные(работа с ними не реализована)
  int kolision_links;//ссылка
  };
struct info_key
  {
  int no_tbl;//номер таблицы
  int pos;   //номер строки
  int hashf; //вычисленная хеш фу-я для ключа
  int prekey;//номер строки ссылающегося на него ключа
  int pretbl;//номер ссылающейся таблицы
  };
class hash
{
private:
hash_tbl* wrk;//массив хранит основную ХЕШ таблицу
kolision_tbl* col;//массив хранит таблицу цепочек переполнения
info_key key_info;//структура хранит информацию о текущем ключе
char* msg_er;//сообщения об ошибках
int* input_key;//массив загруженных ключей
int loaded_key;//кол-во загруженных ключей
int er_f;//флаг критической ошибки (почти не используется)
char ops_msg[80];//оперативные сообщения о выполнении комманд
int N;//размер таблицы основной
int NC;//размер таблицы цепочек переполнения
int hash_f(int i);
int col_rekursion(int g);
fill(char* c,int n);
int find_key(int k);
public:
int load_from_file(char f_name[]);
hash(int n,int nk);
int insert(int key);
int delete_key(int key);
insert_loaded();
int find(int k);
view();
logo();
};
hash::insert_loaded()//фу-я добовления загруженных из файла ключей в таблицу
{
int y;
if (loaded_key!=0)
{
for (y=0;y<loaded_key;y++) insert(input_key[y]);
free(input_key);
stpcpy(ops_msg,"Ключи из файла успешно добавлены!");
loaded_key=0;
};
return(0);
};
hash::load_from_file(char f_name[])//фу-я загрузки таблицы из файла
{
FILE *in;
int n;
/*формат файла:
первая цифра-количество ключей
последующие цыфры - ключи
*/
 if ((in = fopen(f_name, "rt"))== NULL)
{
printf("\nНевозможно открыть файл!\n");
return(1);
}
else {
fscanf(in,"%i",&n);
loaded_key=n;
if ((input_key=(int*)calloc(n,sizeof(int)))==NULL)
{
er_f=1;
msg_er="Недостаточно памяти !";
};
for(int i=0;i<n;i++)
{
float f;
fscanf(in,"%i",&input_key[i]);
}
fclose(in);
}
return(0);
}
hash::fill(char* c,int n)//функция выводит знаки указанное кол-во раз
{
for(int d=0; d<n; d++) printf(c);
return(0);
}
hash::view()//процедура отображения таблицы и служебных сообщений
{
int v;
fill("\n",25);
puts(ops_msg);
puts(msg_er);
msg_er="Ошибок нет! ";
fill("-",80);
for (v=0;v<N;v++) {
printf("-%4.1i-%28.1i-%4.1i-",v,wrk[v].key,wrk[v].links);
printf("%4.1i-%29.1i-%4.1i-",v,col[v].kolision_key,col[v].kolision_links);
};
fill("-",80);
return(0);
};
hash::hash(int n,int nk)//конструктор класса для работы с хеш таблицами
{
int m;
loaded_key=0;
msg_er="Ошибок нет! " ;
stpcpy(ops_msg,"Наберите HELP для просмотра опций!");
if ((wrk=(hash_tbl*)calloc(n,sizeof(hash_tbl)))==NULL)
{
er_f=1;
msg_er="Недостаточно памяти !";
};
if ((col=(kolision_tbl*)calloc(nk,sizeof(kolision_tbl)))==NULL)
{
er_f=1;
msg_er="Недостаточно памяти !";
};
N=n;
NC=nk;
for(m=0;m<n;m++)
{
wrk[m].links=-2;
wrk[m].key=0;
};
for(m=0;m<nk;m++)
{
col[m].kolision_links=-2;
col[m].kolision_key=0;
};
};
hash::col_rekursion(int g)//рекурсивная прцедура поиска последней записи в цепочке переполнения
{
if (col[g].kolision_links==-1) return(g);
if (col[g].kolision_links>-1)
  {
   g=col[g].kolision_links;
   g=col_rekursion(g);
   return(g);
  };
};
hash::find_key(int k)//поиск ключа в таблицах
{
int guard=0;
key_info.hashf=hash_f(k);
key_info.prekey=key_info.hashf;
key_info.pos=key_info.hashf;
key_info.no_tbl=1;
key_info.pretbl=key_info.no_tbl;
if ((wrk[key_info.hashf].key==k)&&(wrk[key_info.hashf].links>-2)) return(1);//доп условие чтобы не находились нули
if (wrk[key_info.hashf].links>-1)
{
key_info.pretbl=key_info.no_tbl;
key_info.no_tbl=2;
key_info.pos=wrk[key_info.hashf].links;
while (guard<10000)//защита от сбоя структуры таблицы
{
if (col[key_info.pos].kolision_key==k) return(1);
if (col[key_info.pos].kolision_links==-1) return(0);
if (col[key_info.pos].kolision_links>-1)
key_info.pretbl=key_info.no_tbl;
key_info.prekey=key_info.pos;
key_info.pos=col[key_info.pos].kolision_links;
guard++;
};
if (guard>9999) msg_er="Сбой структуры таблиц!";
};
return(0);
};
hash::find(int k)//оболочка для получения отчета о поиске ключа
{
char s[80]="";
char t[10]="";
int f;
f=find_key(k);
if (f==1)
{
strcat(s,"Ключ найден");
if (key_info.no_tbl==1) strcat(s," в осн. табл. ");
if (key_info.no_tbl==2) strcat(s," в табл. цепочек переп. ");
itoa(key_info.pos, t, 10);
strcat(s,"номер строки - ");
strcat(s,t);
if ((key_info.pos!=key_info.prekey)||(key_info.pretbl!=key_info.no_tbl))
{
strcat(s," [стр. ");
itoa(key_info.prekey, t ,10);
strcat(s,t);
if (key_info.pretbl==1) strcat(s," в осн.таб.]");
if (key_info.pretbl==2) strcat(s," в таб.цеп.переп.]");
};
stpcpy(ops_msg,s);
};
if(f!=1) stpcpy(ops_msg,"Ключ к сожелению не найден!");
return(0);
};
hash::hash_f(int i )//собственно процедура расчета ХЕШ функции для всех
{                   //объектов класса
i=i%N;
return(i);
};
hash::delete_key(int key)
{
if (find_key(key)!=1)
{
stpcpy(ops_msg,"Не возможно найт указанный ключ в таблицах!");
return(0);
};
if (find_key(key)==1)
{
if(key_info.no_tbl==1)
  {
  if(wrk[key_info.pos].links==-1)
    {
     wrk[key_info.pos].key=0;
     wrk[key_info.pos].links=-2;
     stpcpy(ops_msg,"Ключ удален из таблиц!");
     return(1);
    };
  if(wrk[key_info.pos].links>-1)
    {
     wrk[key_info.pos].key=col[wrk[key_info.pos].links].kolision_key;
     wrk[key_info.pos].links=col[wrk[key_info.pos].links].kolision_links;
     stpcpy(ops_msg,"Ключ удален из таблиц!");
     return(1);
    };
  };
if(key_info.no_tbl==2)
  {
     col[key_info.pos].kolision_key=0;
     if (key_info.pretbl==2) col[key_info.prekey].kolision_links=col[key_info.pos].kolision_links;
     if (key_info.pretbl==1) wrk[key_info.prekey].links=col[key_info.pos].kolision_links;
     col[key_info.pos].kolision_links=-2;
     stpcpy(ops_msg,"Ключ удален из таблиц!");
     return(1);
  };
};
return(0);
};

hash::insert(int key)//процедура добавления ключа в таблицы
{
int r;
int v;
int u;

if (find_key(key)==1)
{
stpcpy(ops_msg,"Такой ключ уже присутствует в таблице!");
return(0);
};
r=hash_f(key);
if (wrk[r].links>-1)
{
u=wrk[r].links;
u=col_rekursion(u);
for (v=0;v<NC;v++)
{
if (col[v].kolision_links<-1)
  {
    col[v].kolision_key=key;
    col[v].kolision_links=-1;
    col[u].kolision_links=v;
    stpcpy(ops_msg,"Ключ успешно добавлен!");
    return(1);
  };
};
};
if (wrk[r].links==-1)
{
for (v=0;v<NC;v++)
{
if (col[v].kolision_links<-1)
  {
    col[v].kolision_key=key;
    col[v].kolision_links=-1;
    wrk[r].links=v;
    stpcpy(ops_msg,"Ключ успешно добавлен!");
    return(1);
  };
};
};
if (wrk[r].links<-1)
{
  wrk[r].key=key;
  wrk[r].links=-1;
  stpcpy(ops_msg,"Ключ успешно добавлен!");
  return(1);
};
  stpcpy(ops_msg,"Ключ не добавлен. Взможно табл. цепочек переполнена!");
return(0);
};



Это сообщение отредактировал(а) ahito1 - 13.11.2011, 19:03
PM MAIL   Вверх
bsa
Дата 13.11.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Цитата(ahito1 @  13.11.2011,  20:02 Найти цитируемый пост)
void main()

замени тут void на int.

Кстати, а что за ошибки (интересует несколько первых)
PM   Вверх
tzirechnoy
Дата 13.11.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Попробуйте разобраться с ошыбками и исправить их.

PM MAIL   Вверх
ahito1
Дата 13.11.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 20.8.2007

Репутация: нет
Всего: -1



ошибка такая
[C++ Fatal Error] Unit1.cpp(48): F1004 Internal compiler error at 0xc9f7cc with base 0xc10000


заменил void на int теперь:
[C++ Error] Unit1.cpp(2): E2176 Too many types in declaration
[C++ Error] Unit1.cpp(2): E2040 Declaration terminated incorrectly

Если у вас есть какая-нибудь ide под с++ не могли бы вы открыть эти файлы и попробовать скомпилировать,
может я что-то не так делаю? или мой билдер не соответсвует исходнику? (я не знаю в какой среде писались эти исходники)
PM MAIL   Вверх
volatile
Дата 13.11.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 8
Всего: 85



Цитата(ahito1 @  13.11.2011,  19:02 Найти цитируемый пост)
PROG.CPP
Цитата(ahito1 @  13.11.2011,  19:02 Найти цитируемый пост)
MODUL.H

Цитата(ahito1 @  13.11.2011,  19:26 Найти цитируемый пост)
[C++ Error] Unit1.cpp(2): 

У вас как минимум ошибка не вотом модуле что вы привели

Цитата(ahito1 @  13.11.2011,  19:26 Найти цитируемый пост)
Internal compiler error at 0xc9f7cc with base 0xc10000

И, походу, такой компилер на свалку!

PM MAIL   Вверх
ahito1
Дата 13.11.2011, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 20.8.2007

Репутация: нет
Всего: -1



Поставил Dev c++ создал проект, заменил текст файла main.cpp на текст из файла prog.cpp
и добавил в директорию проекта файл MODUL.H

правильно ли я делаю???

вот какие ошибки появились


Это сообщение отредактировал(а) ahito1 - 13.11.2011, 19:45

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  11111.png 37,46 Kb
PM MAIL   Вверх
volatile
Дата 13.11.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 8
Всего: 85



Ну, посмотрел я картинку.
Первая ошибка жалуется что функция
fill(char* c,int n);
в классе
class hash
{
...
fill(char* c,int n);

не имеет возвращаемого типа.

Правильно жалуется.
Дальше смотреть не стал.
имхо, код тоже на свалку  smile 
PM MAIL   Вверх
ahito1
Дата 13.11.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 20.8.2007

Репутация: нет
Всего: -1



посоветуйте где найти аналогичные исходники, нужна реализация хеш-таблицы 
точнее

Задание 4.Постоить ХЕШ - таблицу для заданной последовательности ключей.
Размеp  ХЕШ-  таблицы  N'  =  N+6,  где  N  -  длина заданной последовательности. Способ устpанения колизий выбpать по таблице: 1 - откpытое пеpемешивание, 2 - пеpемешивание с цепочками пеpеполнения.


Это сообщение отредактировал(а) ahito1 - 13.11.2011, 20:25
PM MAIL   Вверх
bsa
Дата 13.11.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM   Вверх
t_gran
Дата 14.11.2011, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



ahito1, товарищу, который написал этот код, я бы посоветовал:
  •  учиться форматировать код;
  •  выкинуть BorlandC на помойку;
  •  учить C++.

В общем исправил я ваш код. Теперь он будет компилироваться в dev-cpp. Советую dev-cpp не использовать, а лучше пользуйтесь codelite или code::blocks. Бинарник с исправленными исходниками в архиве ниже.

Присоединённый файл ( Кол-во скачиваний: 97 )
Присоединённый файл  prog.zip 8,72 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
ahito1
Дата 14.11.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 20.8.2007

Репутация: нет
Всего: -1



Цитата(t_gran @ 14.11.2011,  04:50)
ahito1, товарищу, который написал этот код, я бы посоветовал:

  •  учиться форматировать код;
  •  выкинуть BorlandC на помойку;
  •  учить C++.

В общем исправил я ваш код. Теперь он будет компилироваться в dev-cpp. Советую dev-cpp не использовать, а лучше пользуйтесь codelite или code::blocks. Бинарник с исправленными исходниками в архиве ниже.

СПАСИБО ВАМ ОГРОМНОЕ!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.