Pages: [1]   Go Down
Print
Author Topic: piccola porzione di codice...  (Read 1648 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« on: 30-09-2010, 11:26:14 »

ciao a tutti, credo che mi sfugga qualcosa di molto importante sulla funzione printf....

Code:
        buffer[retcode] = '\0';
        printf("\nil client ha inviato : %s",buffer);
        printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s) :\n",
               retcode, inet_ntoa(client_addr.sin_addr));     

        printf("\nil client ha inviato : %s",buffer); //non arriva a questa printf

prima di questa porzione di codice ricevo un messaggio dal client e lo metto in buffer, il primo printf funziona, il secondo pure ma il terzo non funziona!! nel senso che non stampa niente... questo dipende dalla variabile "buffer" perchè se sostituisco l'ultima printf con printf("CIAO MAMMA"); la esegue....

sicuramente sara' una cosa semplicissima... ovvia per molti di voi ma per me no Sad help please!
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 30-09-2010, 12:46:55 »

Se commenti la seconda printf, la terza funziona?
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #2 on: 30-09-2010, 13:08:11 »

no
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #3 on: 30-09-2010, 13:10:25 »

emm scusa avevo confuso la seconda con la prima.... non ho provato, appena posso lo faccio e ti risp
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #4 on: 30-09-2010, 14:10:08 »

intendi cosi??
Code:
 
         buffer[retcode] = '\0';
         printf("\nil client ha inviato : %s",buffer);
       //printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\n",
    //           retcode, inet_ntoa(client_addr.sin_addr));    
//       buffer[retcode] = '\0';
         printf("\nil client ha inviato : %s",buffer); //non arriva a questa printf

in questo modo si blocca... cioè stampa solo la prima
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #5 on: 30-09-2010, 14:21:01 »

ho fatto altre prove.... praticamente cosi funziona:

Code:
       
        buffer[retcode] = '\0';
   
        printf("\nil client ha inviato : %s",buffer);   
        printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\n",
                retcode, inet_ntoa(client_addr.sin_addr));     
        //printf("\nil client ha inviato : %s",nuovoBuffer); //non arriva a questa printf


mentre cosi non funziona

Code:
        buffer[retcode] = '\0';

printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\n",
retcode, inet_ntoa(client_addr.sin_addr));
//printf("\nil client ha inviato : %s",nuovoBuffer); //non arriva a questa printf
        printf("\nil client ha inviato : %s",buffer);


 testate testate testate testate testate testate testate testate
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #6 on: 30-09-2010, 14:33:26 »

ho provato a mettere tutto dentro la stessa printf e viene fuori una situazione ANCORA PIU STRANA!!!

primo tentativo:

Code:

                buffer[retcode] = '\0';
// printf("\nil client ha inviato : %s",buffer);
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\nil client ha inviato : %s",
retcode, inet_ntoa(client_addr.sin_addr),buffer);

//printf("\nil client ha inviato : %s",buffer); //non arriva a questa printf


risultato:    27 bytes ricevuti dal client 127.0.0.1  (attendendo la stringa s)
e poi va a capo... cioè pur essendo tra gli stessi doppi apici si ferma al carattere '\n'

secondo tentativo, provo a mettere dei caratteri tra "...stringa s)"  e il carattere '\n'

Code:

       buffer[retcode] = '\0';
// printf("\nil client ha inviato : %s",buffer);
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s) CIAO MAMMA \nil client ha inviato : %s",
retcode, inet_ntoa(client_addr.sin_addr),buffer);

//printf("\nil client ha inviato : %s",buffer); //non arriva a questa printf

risultato:   27 bytes ricevuti dal client 127.0.0.1  (attendendo la stringa s) CIAO MAMMA
e poi va a capo... a questo punto tolgo il carattere '\n'

terzo tentativo:

Code:
       buffer[retcode] = '\0';
// printf("\nil client ha inviato : %s",buffer);
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s) CIAO MAMMA il client ha inviato : %s",
retcode, inet_ntoa(client_addr.sin_addr),buffer);

//printf("\nil client ha inviato : %s",buffer); //non arriva a questa printf



risultato:   la printf non viene eseguita....


ULTIMO tentativo:   (quello piu assurdo)

Code:

                buffer[retcode] = '\0';
printf("\nil client ha inviato : %s",buffer);
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)",
retcode, inet_ntoa(client_addr.sin_addr));



risultato:  esegue la prima ma non la seconda.....  PERO'   se nella seconda aggiungo \n le esegue entrambe, cioè cosi:

Code:

                buffer[retcode] = '\0';
printf("\nil client ha inviato : %s",buffer);
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\n",
retcode, inet_ntoa(client_addr.sin_addr));




..... non so proprio cosa significa
da quello che ho scritto magari qualcuno riesce a trovare cosa c'è che non va?!  mi sembra una cosa assurda
« Last Edit: 30-09-2010, 14:45:23 by alex180788 » Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #7 on: 30-09-2010, 15:20:48 »

Questo è un problema vecchio come il mondo (del C ) legato al fatto che il buffer che printf usa non viene svuotato necessariamente alla fine della sua esecuzione, ma certamente ad ogni occorrenza del carattere new line '\n'.

Questo vuol dire che se non metti un esplicito newline alla fine di una printf, ma vuoi essere sicuro che prima di eseguire le prossime istruzioni l'output sia stato correttamente stampato (e il buffer in cui viene temporaneamente inserito svuotato), conviene che usi la funzione fflush, passandole come unico parametro il descrittore di standard output, ovvero stdout.

A titolo esemplificativo, considera questo codice:
Code:
#include <stdio.h>
#include <unistd.h>

#define DELAY 5

int main (int argc, char* argv [])
{
    printf ("Prima stringa. Ora aspetto %d secondi", DELAY);
//    fflush (stdout);   //decommentare per vedere l'output PRIMA della pausa

    sleep (DELAY); //pausa intermedia tra le due printf

    printf ("\n%d secondi trascorsi. buona sera\n", DELAY);
    return 0;
}
Salvalo il un file con estensione .c e compilalo così com'è (pure con make te ne esci subito).
Alla prima esecuzione noterai che le due printf avvengono entrambe dopo il ritardo programmato, non una prima e una dopo del ritardo.

Se però decommenti la riga con fflush noterai che la prima printf (o meglio la funzione write del livello sottostante ) scrive effettivamente i dati prima della pausa univ.
 
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #8 on: 30-09-2010, 15:36:22 »

quindi nel mio caso dovrei usare...

Code:

                buffer[retcode] = '\0';
       
printf("\n%d bytes ricevuti dal client %s  (attendendo la stringa s)\n",
         retcode, inet_ntoa(client_addr.sin_addr));
                fflush(stdout);
                printf("\nil client ha inviato : %s",buffer);



.... adesso funziona ok ok ok 
stavo per diventare pazzo... grazie mille!
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Pages: [1]   Go Up
Print
Jump to: