Есть прога #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)
- Форум Соединится с сервером по сокету? (2020)
- Форум Ошибка при компиляции (2015)
- Форум видимость переменных в разных функциях в С (2005)
- Форум GLib проблема с потоками GMainLoop (2014)
- Форум Не работает велосипед pwd на сях (2015)
- Форум OpenSSL (2006)
- Форум OpenSSL ЭЦП, как проверить на Си (2006)
- Форум Чтение выхлопа процесса без ожидания его завершения (2019)