Estoy tratando de crear un puntero a la función que tome un puntero a la función como argumento, pero no estoy seguro de cómo hacerlo ... Se me aconsejó probar typedef-ing uno de mis punteros de función, pero obtiene el mismo error. ¿Podría alguien ayudarme con la sintaxis correcta?Crear un puntero a la función que toma un puntero a la función como argumento
int
186 main(int argc, char **argv)
187 {
188 int i;
194 typedef int (*search_alg) (int *, int, int);
195 typedef int (*search) (search_alg);
196 set_t (*intersect_alg) (list_t *, (search));
197
198 clo_t *iopts = parse_args(argc, argv);
199
200 /* select interstion algorithm */
201 switch (iopts->imode) {
202 case SVS:
203 fprintf(stdout, "ALGORITHM : SvS\n");
204 intersect_alg = svs;
205 break;
206 case SEQ:
207 fprintf(stdout, "ALGORITHM : Sequential\n");
208 intersect_alg = sequential;
209 break;
210 case ADP:
211 fprintf(stdout, "ALGORITHM : Adaptive\n");
212 intersect_alg = adaptive;
213 break;
214 default:
215 fprintf(stdout, "ALGORITHM : Unknown\n");
216 return (EXIT_FAILURE);
217 }
218
219 /* select fsearch algorithm */
220 switch (iopts->mode) {
221 case LIN:
222 fprintf(stdout, "F-SEARCH : Linear\n");
223 search = linear_fsearch;
224 break;
225 case BIN:
226 fprintf(stdout, "F-SEARCH : Binary\n");
227 search = binary_fsearch;
228 break;
229 case INP:
230 fprintf(stdout, "F-SEARCH : Interpolation\n");
231 search = interpolation_fsearch;
232 break;
233 case EXP:
234 fprintf(stdout, "F-SEARCH : Exponential\n");
235 search = exponential_fsearch;
236 break;
237 default:
238 fprintf(stdout, "F-SEARCH : Unknown\n");
239 return (EXIT_FAILURE);
240 }
241
244
245 /* perform intersection and run timings */
246 for (i = 0; i < iopts->runs; i++) {
248 /* perform intersect search */
249 intersect_alg (iopts->data_files, search);
252 }
La línea que estoy tratando de hacer que el trabajo es 249, que originalmente intentado
int (*search_alg) (int *, int, int);
set_t (*intersect_alg) (list_t *, (*) (int *, int, int);
y probablemente preferiría hacerlo de esa manera, si es posible. El error que estoy recibiendo es:
main.c:204: warning: assignment from incompatible pointer type
main.c:208: warning: assignment from incompatible pointer type
main.c:212: warning: assignment from incompatible pointer type
Y las funciones que estoy apuntando a son:
22 /** Finger Search Operations for array sets **/
23 int linear_fsearch(int *set, int len, int key);
24 int binary_fsearch(int *set, int len, int key);
25 int interpolation_fsearch(int *set, int len, int key);
26 int exponential_fsearch(int *set, int len, int key);
27
28 /** Intersect Algorithms **/
29 set_t *svs(list_t * list, int (*srch_alg) (int *, int, int));
30 set_t *sequential(list_t * list, int (*srch_alg) (int *, int, int ));
31 set_t *adaptive(list_t * list, int (*srch_alg) (int *, int, int));
Puede alguien ver lo que estoy haciendo mal? No puedo resolverlo. Gracias!
Rhys.
Ah, esto parece haber funcionado! (sin errores de compilación) Muchas gracias. Pero no estoy seguro de entender la lógica detrás de eso. ¿Por qué el asterisco extra? –
Oh espera, ya veo ... Tan obvio. Aclamaciones. –
Para crear eso, simplemente tomé la declaración de 'svs', eliminé los nombres de los parámetros y reemplacé' svs' con '(* intersect_alg)'. – caf