При попытке использовать 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д