IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Контейнеры в Си, .
сообщение
Сообщение #21


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской

Репутация: -  -1  +


Посмотрел, работает вывод последовательностей, но вот что интересно, как я понялсначало мы в счтроку выводим значение count всех этих элементов, так? он почему то печатает все нули... т.е. получается, что все манипуляции с полем count что я проводил как бы не имеют следа?


Добавлено через 14 мин.
Заметил, что более ничего не работает вставка например в таком виде


vrem = (void*)5;

printf("%d", cont_size(cont));
// cont_insert(cont, 3, &vrem);

ругается на стек



Сообщение отредактировано: Neonig -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Гость






Цитата
сначало мы в счтроку выводим значение count всех этих элементов, так? он почему то печатает все нули...

Ты посты читать будешь? Я же написал в начале 19-го поста, почему это происходит...

Добавлено через 2 мин.
Цитата
Заметил, что более ничего не работает
Исправь все функции - будет работать ... Я исправил только то, что показал. Не буду я делать чужую работу.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской

Репутация: -  -1  +


Извини, все читал, просто забыл, суть понял... я задаю вопрсоыы когда уже реальн не втыкаю что происходит - как сейчас например, соверешнно не могу понять почему прямой просмотр работает, а обратный начинается с цифры на едницу больше чем размер контейнера, доходит до нуля и вылетает с ошибкой... более того я сделал обратный (на время) прямым обходом, он обходит с этим же косяком с +1 к размеру и опять вылетает с ошибкой показывая на ассемблер....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Новичок
*

Группа: Пользователи
Сообщений: 25
Пол: Мужской

Репутация: -  -1  +


Снова дравствуйте.
Можно как нибудь исходник ориентированный видимо на C++ переделать на C обычный в частности избавиться от NEW всяческих?

Пример...
#include "map.h"
#include "container.h"
#include <iostream>

HashIndex getHashIndex(void *key){ // хэш-функция
int _key = (int) key;
HashIndex index = _key % HashTableSize;
return index;
}

Item *search(void *cont, void *key){ // функция поиска
int i = 0;
int size = cont_size(cont);
void *item = NULL;
for (i = 0; i < size; i++){
item = cont_get(cont, i);
if (((Item *)item)->key == key) break;
}
if (i == size) return NULL;
else return (Item *)item;
}

int getPos(void *cont, void *key){ // функция поиска позиции по ключу (нужна для функции удаления)
int pos = 0;
int size = 0;
Item *item = NULL;
size = cont_size(cont);
for (pos = 0; pos < size; pos++){
item = (Item *) cont_get(cont, pos);
if (item->key == key) break;
}
return pos;
}

void* assoc_allocate(){
Map *map = new Map;
map->size = 0;
for (int i = 0; i < HashTableSize; i++)
map->HashTable[i] = cont_allocate();
return map;
}
void assoc_release(void* cont){
Map *map = (Map *) cont;
for (int i = 0; i < HashTableSize; i++)
cont_release(map->HashTable[i]);
delete map;
}
void* assoc_put(void* cont, void* key, void* data){
Map *map = (Map *) cont;
HashIndex index = getHashIndex(key);
void *oldData = NULL;
Item *item = NULL;
Item *newItem = NULL;
item = search(map->HashTable[index], key);
if (item){ // если нашли такое - просто меняем значение
oldData = item->data;
item->data = data;
return oldData;
}
newItem = new Item;
newItem->data = data;
newItem->key = key;
cont_add(map->HashTable[index], newItem);
map->size++;
return oldData;
}
int assoc_size(void* cont){
return ((Map *)cont)->size;
}
void* assoc_get(void* cont, void* key){
Map *map = (Map *) cont;
HashIndex index = getHashIndex(key);
void *data = NULL;
Item *item = NULL;
item = search(map->HashTable[index], key);
if (item) data = item->data;
return data;
}
void* assoc_get_key(void* cont, int pos){ // пробегает контейнеры, исчерпывая переменную pos
Map *map = (Map *) cont;
if (pos > map->size-1 || !map->size){error(); return NULL;}
void *key = NULL;
int i = 0;
Item *item = NULL;
while (pos > 0 && i < HashTableSize){
pos -= cont_size(map->HashTable[i++]);
}
if (pos <= 0){
if (pos) i--;
if (pos) pos += cont_size(map->HashTable[i]);
while (!cont_size(map->HashTable[i])) i++;
item = (Item *) cont_get(map->HashTable[i], pos);
if (item) key = item->key;
}
return key;
}
void* assoc_get_value(void* cont, int pos){ // то же самое : )
Map *map = (Map *) cont;
if (pos > map->size-1 || !map->size){error(); return NULL;}
void *data = NULL;
int i = 0;
Item *item = NULL;
while (pos > 0 && i < HashTableSize){
pos -= cont_size(map->HashTable[i++]);
}
if (pos <= 0){
if (pos) i--;
if (pos) pos += cont_size(map->HashTable[i]);
while (!cont_size(map->HashTable[i])) i++;
item = (Item *) cont_get(map->HashTable[i], pos);
if (item) data = item->data;
}
return data;
}
void* assoc_remove(void* cont, void* key){
Map *map = (Map *) cont;
HashIndex index = getHashIndex(key);
void *oldData = NULL;
Item *item = NULL;
if (search(map->HashTable[index], key) == NULL) {error(); return NULL;}
int pos = getPos(map->HashTable[index], key);
cont_get(map->HashTable[index], pos);
item = (Item *) cont_remove(map->HashTable[index], pos);
oldData = item->data;
map->size--;
return oldData;
}
void assoc_foreach(void* cont, assoc_handle proc){
Map *map = (Map *) cont;
for (int i = 0; i < HashTableSize; i++){
int size = cont_size(map->HashTable[i]);
for (int j = 0; j < size; j++){
Item *item = (Item *) cont_get(map->HashTable[i], j);
proc(item->key, item->data);
}
}
}
void assoc_foreach_reverse(void* cont, assoc_handle proc){
Map *map = (Map *) cont;
for (int i = HashTableSize - 1; i >=0; i--){
int size = cont_size(map->HashTable[i]);
for (int j = size-1; j >=0; j--){
Item *item = (Item *) cont_get(map->HashTable[i], j);
proc(item->key, item->data);
}
}
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гость






Можно... Только надо видеть программу полностью...

new заменять на malloc, delete - на free, убирать работу с потоками cin/cout (если есть), переносить описания всех переменных до первой строки выполнимого кода (описание переменных в любом месте программы допустимо только в С++)...
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 12:47
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name