Newsgroup: it.comp.lang.c
Titolo: Stringa di formato per 'unsigned short' e funzione di confronto per quicksort

2 domandine 2
Domanda 1)
Nel mio programma devo leggere da un file (agents_info) 4 valori di tipo
'unsigned short' (2 byte) e metterli in un vettore allocato dinamicamente:
unsigned short  *samples;
samples= calloc(4 ,sizeof(unsigned short));
position=0;
while (! feof(agents_info))
    {
        fscanf (agents_info, "%u" , samples+position);
        position++;
    }
Il problema è che, se uso la stringa di formato "%u", il compilatore (GNU C
egcs-2.91.57) segnala il warning:
  warning: unsigned int format , different type  ( arg 3 )
Lo stesso accade usando "i%" (warning: int format , different type (arg 3))
e "%d"
C'è una stringa di formato specifica per gli unsigned short?
Domanda 2)
Sempre nel programma definisco una struttura:
struct flag {
                    unsigned short card;
                    unsigned short *addr;
                    unsigned short pPos;
                  }
dopo definisco una funazione di confronto da passare come argomento al
quicksort :
int compNum (struct flag *first,struct flag *second)
{
   if ((first->card ) < (second->card)) return 1;
   else if ((first->card ) > ( second->card)) return -1;
      else return 0;
}
infine invoco il quicksort
  quicksort ( flags_array , flags_size , sizeof (struct flag) , compNum);
dove flags_array è una array di struct flags e flags size è la sua
dimensione.In questo caso il compilatore segnala:
  warning: passing arg 4 of 'qsort' from incompatible pointer type
Che cosa sbaglio?
Grazie, Fabio.

 wrote:
[ snip ]
FM>while (! feof(agents_info))
FM>    {
FM>        fscanf (agents_info, "%u" , samples+position);
                                ^^^^
                                "%hu"
[root@fokhouse /root]# man 3 printf | printlines - 151 7
       o      The optional character h, specifying that a follow-
              ing d, i, o, u, x, or X conversion corresponds to a
              short int or unsigned short int argument, or that a
              following n conversion corresponds to a pointer  to
              a short int argument.
FM>Domanda 2)
[ snip ]
FM>int compNum (struct flag *first,struct flag *second)
                ^^^^^^^^^^^^^      ^^^^^^^^^^^^^
Questi devono essere (const void *).
FM>{
FM>   if ((first->card ) < (second->card)) return 1;
FM>   else if ((first->card ) > ( second->card)) return -1;
FM>      else return 0;
FM>}
In questi casi si usano spesso cose del genere (non testato ;)
int compNum(const void *first, const void *second)
{
   return (((struct flag *)second)->card - ((struct flag *)first)->card);
}
[ snip ]
FM>  quicksort ( flags_array , flags_size , sizeof (struct flag) , compNum);
La funzione si chiama 'qsort'.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Che cosa sbaglio?
Bisogna vedere come hai costruito il prototipo o hai definito la
funzione quicksort.
Dovresti scrivere qualcosa del genere :
#include <stdio.h>
int a()
{
    puts( "chiamata ad a() avvenuta con successo !" ) ;
    return 0 ;
}
void quicksort( int a, int b, int c, int (*p)() )
{
     p() ;
}
int main()
{
    quicksort( 1, 2, 3, a ) ;
    return 0 ;
}
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

 wrote:
[ snip ]
AF>[root@fokhouse /root]# man 3 printf | printlines - 151 7
                                ^^^^^^
Ho usato la man page sbagliata ;)
Il comportamento e' lo stesso, comunque...
[root@fokhouse /root]# man fscanf | printlines - 78 5
       h      Indicates  that the conversion will be one of dioux
              or n and the next pointer is a pointer to  a  short
              int (rather than int).


>C'è una stringa di formato specifica per gli unsigned short?
AL>No, in C (standard) non esiste uno specificatore di formato specifico
AL>per gli unsigned short, ma solo per gli unsigned int.
Non e' vero:
"I caratteri di conversione d, i, n, o, u ed x possono essere preceduti da h,
 se l'argomento e' un puntatore ad uno short invece che ad un int, oppure da
 l (lettera elle) se l'argomento e' un puntatore a long."
(K&R, II ed. (italiana), pag. 327)
Pertanto lo specificatore di un unsigned short e' "%hu".


 (K&R, II ed. (italiana), pag. 327)
Strano. Come mai che in LIBC.INF del DJGPP non ne parla?
EMG

 'Numeric Input Conversions' 2>/dev/null | printlines - 35 15
   The default type of the corresponding argument for the `%d' and `%i'
conversions is `int *', and `unsigned int *' for the other integer
conversions.  You can use the following type modifiers to specify other
sizes of integer:
`hh'
     Specifies that the argument is a `signed char *' or `unsigned char
     *'.
     This modifier was introduced in ISO C 9x.
`h'
     Specifies that the argument is a `short int *' or `unsigned short
     int *'.
