LINUX.ORG.RU

как вернуть хеш в функцию? (язык С)


0

0

Есть прога

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <search.h>

void exists(char *k,int *ex,int f,int *count){
  ENTRY e,*ep;
  int bool;
// ищу, есть ли уже похожие ключи
  e.key = k;
  ep = hsearch(e, FIND);
// если есть - вывсти на печать
  if (ep){bool=1;
    printf("%9.9s -> %9.9s:%d \n", e.key,
      ep ? ep->key : "NULL",
      ep ? (int)(ep->data) : 0);
  } else {bool=0;}
// если что то еще, заполнить хеш новой парой ключ-значение.
  if (f){
    e.key=k;
    e.data = (char *)*count;
    ep = hsearch(e, ENTER);
    if (ep == NULL) {
      fprintf(stderr, "entry failed\n");
      exit(1);
    } 
  }
  *ex=bool;
}

void recursion(..., int *ex,int *count, ...){
.......
  ENTRY e,*ep;
// проверяю, существуют ли заранее известные ключи в
// хэше (они там точно должны быть)
  char *data[]={"27 18","27 21"};
  e.key=data[0];
  ep = hsearch(e, FIND);
// на печати видно, что ключи эти в наличии есть. т.е. 
// хэш на этом уровне виден просто замечательно
  printf("[%9.9s -> %9.9s:%d]\n", 
    e.key, 
    ep ? ep->key : "NULL", 
    ep ? (int)(ep->data) : 0);
.......  
  if (cc<sz){
    if (m[x][y]==3 && m[x-1][y]==255 && m[x-1][y-1]==255 &&
        m[x][y-1]==255 && m[x+1][y-1]==255 && m[x+1][y]==3 &&
        m[x+1][y+1]==3 && m[x][y+1]==3 && m[x-1][y+1]==255) {
      if (x==x1 && y==y1 && f!=1){
        printf("рекурсивный обход закончен\n");
      } else {
// вызываю функцию, заполняющую хеш с тем, чтобы посмотреть
// вызывать ли рекурсию дальше, если пары значений нет
        exists(nums,ex,1,count);
        if(!*ex){
          recursion(..., ex,count, ...);
        }
      }
    }
.......
  } else {
    printf ("deep recursion, closed!\n");
  }
  exists(nums,ex,1,count);
}
// тело основной функции

int main(int argc,char **argv) {
  ENTRY e,*ep;
.......
  ep=NULL;
//создаю хэш
  hcreate((int)(size/4));
.......
  char *data[]={"27 18","27 21"};
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      char nums[7];
      sprintf(nums,"%d %d",i,j);
// первый раз заполняю хеш
      exists(nums,&ex,0,&count);
      if(!ex){
        if (m[i][j]!=255 && c<size+1){
// вызываю функцию, из которой будет вызываться ф-я exist, 
// в которой будет происходить заполнение хеша
          recursion(..., &ex,&count, ...);
// после вызова функции я пытаюсь найти в хеше 
// хотябы какой-нибудь элемент (доподлинно знаю какой)
          e.key=data[0];
          ep = hsearch(e, FIND);
// и он его не находит, т.е. хеш остается незаполненным
          printf("[!%9.9s -> %9.9s:%d!]\n", 
            e.key, 
            ep ? ep->key : "NULL", 
            ep ? (int)(ep->data) : 0);
        }
      }
    }
  }
.......
}

в ней есть рекурсия, которая на каждой итерации вызывает
функцию exists. Заполнение хеша происходит в функции exists. 
То, что хеш заполняется и видим в в пределах функции 
recursion - видно, данные на печать выводятся замечательно. 
Но необходимо, чтобы хеш был виден в функции main, откуда 
вызывается функция recursion, т.е. явным образом сделать 
видимым этот хеш во всех функциях (с передачей параметров 
и пр.) его из функции в функцию - не пойму как.

Вся остальная логика этого суперизврата (почему такой сложный 
вызов рекурсивный - предмет будущей заметки на LOR :) ) работает нормально.
☆☆

а где тут хэш? разве он не глобальный?

k_andy ★★★
()

> ...необходимо, чтобы хеш был виден в функции main, ...

А почему ты решил, что он оттуда не виден? Ты же пользуешь дебильную функцию hcreate(), которая создает глобальную таблицу...

Die-Hard ★★★★★
()

2k_andy


> А где тут хеш, разве он не глобальный?

Да нифига он не глобальный, нет там данных и все... или я не того ожидаю от hcreate, делаю как в мануале man hcreate - все просто классно работает. делаю у себя в проге - как будто не было.

2Die-Hard
> А почему ты решил, что он оттуда не виден?

по идее у меня рекурсия циклиться не должна, т.к. хеш создается фиксированного объема, т.е. еслиб она поциклилась, значит я бы поимел ошибку.

> Ты же пользуешь дебильную функцию hcreate(), которая создает глобальную таблицу...

а другой недибильной я не нашел, нашел вот, тут на ЛОРе, даже вроде ты предлагал бинарный хеш, но я не разобрался с ним с наскоку сразу. Еще с hcreate подолбаюсь, может и получится, а так - будем бинаризовать или влоб циклы писать...

полный листинг проги вот: http://observ.inetcomm.ru/images/proga.html

файл, который она жрет на вход вот: http://observ.inetcomm.ru/images/kvadrat.bmp

(коэффициенты в условиях заточены под этот файл)

anonymous
()
Ответ на: комментарий от anonymous

> т.е. у меня, по видимому, ошибка в программе?

Угу

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.