При попытке использовать header file появляется множество ошибок - C (СИ)
Формулировка задачи:
Есть файл с функциями, он компилется без ошибок и все работает нормально, но при попытке использовать , как header file появляется тьма ошибок
собственно сам файл с функциями
Сама прога даже так происходят ошибки компиляции
gcc -Wall -c "hell.c" (в каталоге: /home/user/Desktop/Hash)
In file included from hell.c:2:
rect:15: error: two or more data types in declaration specifiers
rect: In function ‘hash’:
rect:20: error: incompatible types when returning type ‘int’ but ‘struct cell’ was expected
In file included from hell.c:2:
rect: In function ‘add_cell’:
rect:56: error: invalid operands to binary + (have ‘struct cell’ and ‘int’)
rect: In function ‘search_cell’:
rect:96: error: invalid operands to binary + (have ‘struct cell’ and ‘int’)
rect: In function ‘delete_cell’:
rect:120: error: invalid operands to binary + (have ‘struct cell’ and ‘int’)
Сборка завершилась с ошибкой.
#ifndef rect_H
#define rect_H
#include <stdio.h>
#include <string.h>
struct cell // описание одной ячейки хэш таблицы
{
int infcell; // информация о ячейке (удалена=-1, пуста=0, занята=1)
char str[256]; // строка
}
int hash(char *str)
{
int h;
h=0;
while (*str) h += *str++;
return h;
}
//функция добавления записи в хэш таблицу
//возвращает значения
//0--таблица переполнена(слишком много коллизий)
//1--добавление прошло успешно
//2--добавление не произведено, строка уже есть в таблице
int add_cell(struct cell *table, char *string)
{
int pos; //индекс который указывает куда необходимо будет произвести запись новой строки
int i; //номер пробы
int j; //вспомогательный индекс для просмотра хэш таблицы
pos=-1;
i=0;
j=0;
do
{ //Алгорит добавление строки
j=hash(string)+i*256; //вычисление ключа для вставки в хэш таблицу
if (table[j].infcell==-1) //если ячейка была удалена
{
pos=j; //изменить значени pos на j
};
if ((table[j].infcell==1)&&(strcmp(table[j].str,string)==0)) //если ячейка с ключем занята и в ней содержется строка, которая идентична вставляемой,то
{
return 2; //завершить выполнение функции с значением 2
}
i++; //увеличить номер пробы
}
while (((i*256)>=1024) || (table[j].infcell!=0)); //выполнять алгоритм, пока хэш таблица не закончится или не встретим свободную ячейку
if (((i*256)>=1024) && (pos==-1)) //если таблица закончилась и не встретилась ячейка удаленная ячейка, то
{
return 0; //завершить выполнение функции с значением 0
};
if (pos==-1) //если не встретилась удаленная ячейка , то
{
pos=j; //изменить значение индекса вставляемой ячейки на индекс текущей пустой ячейки
};
table[pos].infcell=1; //статус ячейки занята
strcpy(table[pos].str,string); //скопировать данные из вставляемой строки в ячейку хэш таблицы
return 1; //завершить выполнение функции с значение 1
}
//функция поиска ячейки в хэш таблице
//возвращает номер элемента в таблице
//или -1 если элемент не найден
//передаем хэш таблицу и строку которую необходимо найти
int search_cell(struct cell *table, char *st)
{
int i; //номер пробы
int j; //индекс текущей ячеки в хэш таблице
j=0;
i=0;
do //алгоритм поиска
{
j=hash(st)+i*256; //вычисление индекса где возможно находится искомая строка
if ((table[j].infcell==1)&&(strcmp(table[j].str,st)==0)) //если ячейка занята и искомая строка совпадает с строкой из хэш таблицы, то
{
return j; //функция возращает номенр ячейки соднржащей ячейку и прекращает свою работу
};
i++; //увеличение номера пробы на +1
}
while (((i*256)>=1024) || (table[j].infcell!=0)); //выполняется пока не закончится хэш-таблтица
return -1; //функция не найдя соответствие возвращает -1
}
//функция которая удаляет из хэш таблицы строку
//возвращает 1, если удаление прошло успешно
//возвращает -1,если строка не была найдена в хэш таблице
int delete_cell(struct cell *table, char *st)
{
int i; //номер пробы
int j; //индекс текущей ячеки в хэш таблице
int k; //вспомогательный индекс для очистки строки
j=0;
i=0;
do
{
j=hash(st)+i*256; //вычисление индекса где возможно находится искомая строка
if ((table[j].infcell==1)&&(strcmp(table[j].str,st)==0)) //если ячейка занята и удаляема строка со впадает с данными в ячейке, то
{
for(k=0; k<256; k++) //удаление данных из ячейки
{
table[j].str[k]='\0';
};
table[j].infcell=-1; //изменение статуса ячейки
return 1; //завершение работы функции с значением 1
};
i++; //увеличение пробы на 1
}
while (((i*256)>=1024) || (table[j].infcell!=0)); //алгоритм выполняется, пока таблица не закончится или ячейка не будет свободной
return -1; //завершение работы функции с значением -1
}
#endif#include <stdio.h>
#include "rect"
int main()
{
return 0;
}Решение задачи: «При попытке использовать header file появляется множество ошибок»
textual
Листинг программы
unsigned int hash(char* str)
{
unsigned int h = 0; // можно использовать другое значение, например простое число или длину строки
while( *str ) {
h = 101 * h + *str++;
}
return h;
}
Объяснение кода листинга программы
В данном коде представлена функция с именем hash, которая принимает на вход указатель на строку символов (char*) и возвращает целочисленное значение (unsigned int). Список действий, выполняемых в коде:
- Инициализация переменной h значением 0.
- Запуск цикла while, который будет выполняться до тех пор, пока не встретится нулевой символ (*str).
- Внутри цикла значение переменной h увеличивается на 101, умноженное на текущее значение h, и к полученному результату добавляется значение символа, на который указывает текущий указатель str.
- После завершения цикла, функция возвращает полученное значение h.
Пример вызова функции:
int main()
{
char* str =
Пример строки; unsigned int h = hash(str); printf(%u\n, h); return 0; }