Newsgroup: it.comp.lang.c
Titolo: chiamata puntatore a funzione

Ho un problema sulla chiamata di un ptr a funzione. La function
seguente è presa dal "Numerical Recipes in C"; lo scopo è quello di
plottare una funzione non lineare:
#include "StdAfx.h"
#include <stdio.h>
#include <math.h>
#define ISCR 60  /*Number of horizontal and vertical positions in
display*/
#define JSCR 21
#define BLANK ' '
#define ZERO '-'
#define YY 'l'
#define XX '-'
#define FF 'x'
void scrsho (float (*fx)(float));
int main(void)
{
	float x, (*fx)(float);
fx=&((float)20.85-logf(x));
scrsho(fx);                ??
return 0;
}
void scrsho (float (*fx)(float))
{
int jz,j,i;
float ysml,ybig,x2,x1,x,dyj,dx,y[ISCR+1];
char scr[ISCR+1][JSCR+1];
for (;;) {
printf("\nEnter x1 x2 (x1=x2 to stop):\n");
scanf("%f %f",&x1,&x2);
if (x1 == x2) break;
	for (j=1;j<=JSCR;j++)  	/*Fill vertical sides with character 'l'. */
	scr[1][j]=scr[ISCR][j]=YY;
		for (i=2;i<=(ISCR-1);i++) {
		scr[i][1]=scr[i][JSCR]=XX; 
		for (j=2;j<=(JSCR-1);j++) 	/*Fill interior with blanks.*/
		scr[i][j]=BLANK;
		}
dx=(x2-x1)/(ISCR-1);
x=x1;
ysml=ybig=0.0; /* Limits will include 0*/
	for (i=1;i<=ISCR;i++) { 
	y[i]=(*fx)(x);
	if (y[i] < ysml) ysml=y[i];
	if (y[i] > ybig) ybig=y[i];
	x += dx;
	}
if (ybig == ysml) ybig=ysml+1.0; 
dyj=(JSCR-1)/(ybig-ysml);
jz=1-(int) (ysml*dyj); 
	for (i=1;i<=ISCR;i++) { 
	 scr[i][jz]=ZERO;
	j=1+(int) ((y[i]-ysml)*dyj);
	scr[i][j]=FF;
	}
printf(" %10.3f ",ybig);
	for (i=1;i<=ISCR;i++) printf("%c",scr[i][JSCR]);
	printf("\n");
	for (j=(JSCR-1);j>=2;j--) { 
	printf("%12s"," ");
	for (i=1;i<=ISCR;i++) printf("%c",scr[i][j]);
	printf("\n");
}
printf(" %10.3f ",ysml);
for (i=1;i<=ISCR;i++) printf("%c",scr[i][1]);
printf("\n");
printf("%8s %10.3f %44s %10.3f\n"," ",x1," ",x2);
}
}
E' la prima volta che mi capitano ptr a funzioni, e ne dovrò usare
tanti visto che nelle routine del NumRecipes abbondano.
 Mi dareste una mano?
Grazie.

 Grazie.
Si': leggiti un libro di C, ce ne sono tanti anche online.
Scusa la risposta acida, ma prova prima almeno a documentarti da solo, 
_poi_, se continui ad avere le idee poco chiare, esponi qui i tuoi 
dubbi. Almeno dimostri di aver fatto il tentativo :P
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

Ho riprovato e adesso sembra funzionare:
...
float func1(float);
void scrsho (float (*)(float));
int main(void)
{
float x;
float (*fx)(float a);
fx=func1;
scrsho(fx);
return 0;
}
void scrsho (float (*fx)(float))
.....
//questa č la funzione che voglio graficare
float func1(const float x)
{
return (20.85 -log(x));
}
La mia domanda č questa: se voglio plottare piů funzioni insieme nello
stesso grafico come posso procedere? Devo far puntare fx ad un array
di funzioni dello stesso tipo, come func1, func2, e poi usare la
stessa chiamata  a
scrsho(fx)? Esiste una strada piů semplice?
Igor

 scrsho(fx)? Esiste una strada piů semplice?
Fantasioso.
Ovviamente non funziona: scrsho vuole un puntatore a funzione, e bona. 
Seguendo il tuo ragionamento, perche' non passargli una lista 
concatenata, e sperare che lui capisca che vuoi fargli plottare piu' 
funzioni? :)
Non ho voglia di capire il codice di scrsho (molto matematico, ma non 
proprio molto commentato), pero' direi che devi modificare la scrsho se 
vuoi che questo venga fatto. Quindi, la soluzione che ti serve e' piu' 
complicata del semplice cambiamento che volevi...
