Есть прога
#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 :) ) работает нормально.

    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от k_andy 
  
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум Ошибка сегментирования. Рекурсивный обход каталогов (2017)
 - Форум Канал загадок (2007)
 - Форум видимость переменных в разных функциях в С (2005)
 - Форум Соединится с сервером по сокету? (2020)
 - Форум Ошибка при компиляции (2015)
 
- Форум GLib проблема с потоками GMainLoop (2014)
 - Форум Не работает велосипед pwd на сях (2015)
 - Форум OpenSSL (2006)
 - Форум OpenSSL ЭЦП, как проверить на Си (2006)
 - Форум openssl - работа с ключами (2006)