Newsgroup: it.comp.lang.c
Titolo: perchè non mi compila? (puntatori a funzione)

Il seguente **copiato** dal libro K&R2 mi da come risposta alla
compilazione l'errore
Error E2354 C:\atj\5_11.c 23: Two operands must evaluate to the same
type in function main
mi piacerebbe conoscere il perché: grazie.
Voi come lo risolvereste?
(io ho aggungendo una parola e un particolare carattere ecc)
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000
char *lineptr[MAXLINES];
int  readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qsort1(void* lineptr[], int left, int right,
           int (*comp)(void* , void* ) );
int numcmp(char* , char* );
int main(int argc, char* argv[])
{int nlines;    /* numero di linee di input lette */
 int numeric=0; /* 1 in caso di ordinamento numerico */
 if(argc>1 && strcmp(argv[1], "-n")==0)
                                      numeric=1;
 if((nlines=readlines(lineptr, MAXLINES))>= 0)
     {qsort1( (void**) lineptr, 0, nlines-1,
/*ERRORE*/
   ( int (*) (void* , void* ) ) ( numeric ? numcmp : strcmp ) );
/*ERRORE*/
      writelines(lineptr, nlines);
      return 0;
     }
 else {printf("Errore: troppe linee in input");
       return 1;
      }
}
#define MAXLEN 1000
int getline(char* , int);
char* alloc(int);
int readlines(char** lineptr, int maxlines)
{int len, nlines;
 char * p, line[MAXLEN];
 nlines=0;
 while( ( len=getline(line, MAXLEN) ) > 0)
    if(nlines>=maxlines || (p=alloc(len))==NULL)
                                        return -1;
    else {if(line[len-1]=='\n') line[len-1]='\0';
          strcpy(p, line);
          lineptr[nlines++]=p;
         }
 return nlines;
}
void writelines(char** lineptr, int nlines)
{printf("\n \n \n");
 while(nlines-- >0)
    printf("%s\n", *lineptr++);
}
int getline(char* s, int lim)
{int c, i;
 for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) *(s+i)=c;
 if(c=='\n') *(s+(i++))=c;
 *(s+i)= '\0';
 return i;
}
void qsort1(void* v[], int left, int right,
                     int (*comp)(void* , void*) )
{int i, last;
 void swap(void* v[], int i, int j);
 if(left>=right) return;
 swap(v, left, (left+right)/2);
 last=left;
 for(i=left+1; i<=right; i++)
        if((*comp)(v[i],v[left])<0) swap(v, ++last, i);
 swap(v, left, last);
 qsort1(v, left, last-1, comp);
 qsort1(v, last+1, right, comp);
}
void swap(void* v[], int i, int j)
{ void * temp; temp=v[i]; v[i]=v[j]; v[j]=temp; }
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char * allocp=allocbuf;
char* alloc(int n)
{ if(allocbuf + ALLOCSIZE - allocp >= n)
       {allocp += n;
        return allocp-n;
       }
 else return 0;
}
void afree(char* p)
{if(p>=allocbuf && p<allocbuf + ALLOCSIZE)
         allocp = p;
}
#include <stdlib.h>
int numcmp(char* s1, char* s2)
{double v1, v2;
 v1=atof(s1); v2=atof(s2);
 if(v1<v2) return -1;
 else if(v1>v2) return 1;
 else return 0;
}

 /*ERRORE*/
Perche'
numcmp e' int (*)(char*, char*)
strcmp e  int (*)(const char*, const char*)
dichiara 
int numcmp(const char*, const char*);
...
int numcmp(const char* s1, const char* s2)
{
   corpo della funzione
}
e l'errore sparisce.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

e l'errore sparisce.
hai ragione in pieno (non ci potevo arrivare mai ... grazie );
l'avevo risolto (probabilmente sbagliando) sostituendo la linea
incriminata con
( int (*) (void* , void* ) ) ( numeric ? numcmp : (void*) strcmp ) );
notare______________________________^^^^^
Saluti a tutti

 /*ERRORE*/
I  due  operandi  devono  essere  dello  stesso  tipo  (magari  con  una
promozione). In questo caso numcmp e strcmp hanno due tipi differenti:
strcmp e` di tipo int (*)(char const *, char const *)
numcomp e` di tipo int (*)(char *, char *)
Hai due possibilita`: modifichi la tua funzione in:
int numcmp(char const *, char const *);
che  non  e` male  visto  che  il  confronto  non modifica  le  stringhe
che  tu gli  passi. Oppure sposti  il cast  all'interno dell'espressione
condizionale riscrivendo la riga incriminata come:
(numeric ? (int (*)(void*, void*))numcmp :(int (*)(void*, void*))strcmp));
che  e`  abbastana brutto  :@  Se  vuoi  seguire questa  strada  sarebbe
auspicabile un typedef per rendere piu` chiaro il cast:
typedef int (*pfcmp)(void *, void*);
...
(numeric ? (pfcmp)numcmp: (pfcmp)strcmp)
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"I've seen things you people wouldn't believe...
 Attack Ships on fire off the shores of Orion.
 I've watched C-beams glitter in the dark off of Tanhauser Gate.
 All those moments will be lost in time...like tears, in rain.
 Time to die." -- Roy Batty (played by Rutger Hauer)