Есть прога
#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)