Newsgroup: it.comp.os.linux.development
Titolo: librerie: stdio c'e' ma la funzione non funziona :(

Sto' compilando un programma in c ma pur avendo messo la riga #include
<stdio.h> la funzione sprintf non funziona. gdb mi risponde:
sprintf.c: file o directory insesistente
Questo accade con RH6.2 (kernel ricompilato) mentre con mandrake il
programma funziona. Ho provato a dare:
(RH6.2)     ldd nomeprogramma
        libncurses.so.4 => /usr/lib/libncurses.so.4 (0x4001a000)
        libc.so.6 => /lib/libc.so.6 (0x4005c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
(mandrake 7.1)  ldd nomeprogramma
        libncurses.so.5 => /usr/lib/libncurses.so.5 (0x4001a000)
        libc.so.6 => /lib/libc.so.6 (0x40061000)
        libgpm.so.1 => /usr/lib/libgpm.so.1 (0x40148000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Eppure il programma e' lo stesso. Mi manca qualche link?
Vi prego di suggerirmi qualcosa :((
Grazie, Nicola.

Vi prego di suggerirmi qualcosa :((
Posta un pezzo del sorgente incriminato, e le istruzioni che usi per
compilazione e link.
Leonardo
".signature": bad command or file name

sprintf.c: file o directory insesistente
Questo significa solo che i sorgenti della libc non sono installati e
quindi non puoi fare il debugging della funzione. Cosa non molto utile,
visto che dubito seriamente che sprintf sia buggata.
-- 
ciao, | * The Internet is full. Go away.  -- Joel Furr *
Marco | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 sprintf.c: file o directory insesistente
Vuol dire che non hai il sorgente, non che la funzione non c'e'. Il
fatto che non funzioni e' molto piu' probabile che dipenda da come l'hai
chiamata.
Ciao
-- 
Simone Piccardi
Microsoft is NOT the answer. Microsoft is the Question.
The answer is: "NO!"

 chiamata.
Grazie delle risposte. In effetti la funzione potrebbe anche funzionare.
Certo che ho cercato sprintf.c in mandrake e mi ha trovato quello di
winzozz, mi pare strano che abbia guardato quella libreria.
Be' comunque avrei un dubbio sul fatto che si dice che sprintf su linux
funzioni in modo differente rispetto ad altri OS: in particolare il
programma in questione proviene da sco unix.
Ad ogni modo posto il pezzo di codice incriminato.
Grazie ancora dei suggerimenti di prima (ora non devo piu' tentare di
aggiornare le librerie :)))))))))))
Nicola.
/* =========================== INIT ============================== */
void init(void)
{
  int temp;
  initscr();                    /* inizializza dati in <curses.h> */
  if (start_color()==OK)        /* se il terminale e' a colori .. */
    {
     for (temp=0; temp<128; temp++)               /* iniz. colori */
sprintf(colori[temp],"\x01B[=%dF\x1B[=%dG\x1B[0m",temp%16,temp/16);
/*<<<<<<<<<<questo e' il problema<<<<<<<<<*/
    }
  printf("\x01B[0m");             /* resetta modalita' grafiche */
  input = open ("/dev/tty", O_RDONLY | O_NDELAY);  /* imposta param.
tastiera */
  output= open ("/dev/tty", O_WRONLY | O_NDELAY);
  if (temp=ioctl(input, TCGETA, &old_tio))
    {
     refresh();
     printf("Errore in init():ioctl():1:%d\n\r",temp);
     exit(-1);
    }
  tio = old_tio;             /* imposta nuovi parametri in input */
  tio.c_iflag = IGNBRK;
  tio.c_lflag = 0;
  tio.c_cc[VMIN] = 0;
  tio.c_cc[VTIME]= 0;
  if (temp = ioctl(input, TCSETA, &tio))
    {
     refresh();
     printf("Errore in init():ioctl():2:%d\n\r",temp);
     exit(-1);
    }
  atexit(uscita_prg);
}

 /*<<<<<<<<<<questo e' il problema<<<<<<<<<*/
Mi apre che stai usando dei codici di controllo del terminale (non sono
sicuro, sono piuttosto ignorante in materia), il punto e' che qui non
vedo la definizione di colori, e comunque oltre al codice sarebbe
diciamo abbastanza importante che ti spiegassi in che senso non ti
funziona (ti da' un errore il compliatore? ti crasha all'esecuzione?),
capirai che "non mi funziona" e' un tantinellino generico...
Ciao
PS1 sprintf credo sia definita in standard, quindi di sicuro in linux
funziona come deve; cio' non e' detto per gli altri; man sprintf ti da i
dettagli.
PS2, se puoi comunque evitala e usa snprintf, che di buffer overflow ce
ne sono gia' abbastanza (non mi pare il caso in questione, ma e' meglio
prendere subito buone abitudini).


 prendere subito buone abitudini).
Ehm..... il programma non e' mio, lo sto solo spostando da sco unix a
linux; sfortunatamente sto imparando solo ora ad usare le librerie del c
(meglio tardi che mai!).
Grazie mille delle spiegazioni, mi auguro che mi possiate sopportare anche
nei prossimi giorni ;-)
Ciao, Nicola.