Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Pipe, scanf e roba varia

    Sto lavorando ad un progetto per l'università e ho incontrato alcuni problemi durante la realizzazione.
    A grandi linee il progetto riguarda una rubrica tenuta da un server alla quale client possono accedere svolgendo alcune operazioni. La comunicazione avviene tramite pipe e una volta che il client è stato servito, termina, mentre il server si rimette in ascolto di altre richieste.

    Faccio un esempio pratico di una esecuzione per farvi capire i problemi che ho:
    - Parte il server e si mette in ascolto sulla pipe
    - Parte il client con richiesta di aggiungere un contatto
    - dopo aver immesso i dati necessari (da tastiera) a creare il contatto, viene spedito al server uno stringone con vari campi (definiti dalle specifiche) da spezzare per ricavare le info necessarie (vi basti sapere che i messaggi hanno lunghezza fissa)
    - il server estrae le info necessarie (una parte dello stringone è il nome della pipe su cui rispondere, una parte rappresenta il tipo di operazione e un'altra rappresenta in questo caso i dati del contatto).
    - il campo dati contatto viene salvato su una stringa e poi si fanno le operazioni necessarie..
    Il problema nasce dopo. Il server serve la richiesta, e torna in ascolto, faccio partire un altro client sempre con la richiesta di aggiunta, e a questo punto il server legge dalla pipe e salva cio che gli serve nella sua stringa di appoggio. Il problema è proprio questa stringa, in quanto risulta inconsistente con i dati letti. cioe se stampo i vari campi del contatto, vengono fuori tutti simboli strani e nel campo cognome viene scritto INEVITABILMENTE il nome della pipe della richiesta precedente....

    Ho provato a far si che ad ogni ciclo (quindi finito di servire una richiesta e prima di accettarne un'altra ) questa stringa di appoggio venisse riempita di spazi per togliere eventualmente roba precedente, ma il nome della pipe rimane, anzi, sembra quasi che mi metta tutti gli spazi spostando semplicemente i caratteri presenti in precedenza. QUindi se stampo la stringa dopo il ciclo di "sbiancatura" mi vengono tanti spazi e alla fine il nome della pipe della richiesta appena servita....

    Scusate se sono lungo ma non sono bravo a spiegarmi tra l'altro non ho il codice qui a casa spero possiate darmi qualch consiglio (ci sarebbe un altro problema ma eventualmente dopo, ora questo è quello che blocca di piu)
    grazie!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Se scrivi un pò di codice è meglio. Comunque mi puzza di passaggio di puntatori non allocati. Ricordati che quando fai funzioni con stringhe e simili devi usare spesso malloc per non scrivere sempre sugli stessi blocchi di memoria. E poi, sei sicuro che la tua stringa sia null-terminated ?

  3. #3
    Se per null- terminated intendi il \0 alla fine della stringa si.
    Per quanto riguarda le malloc, ci avevo pensato ed nfati ho provato a fre una cosa del genere:

    .
    .
    .
    ...

    char *msg;
    ...
    int main(...){
    ...
    while(.......){
    msg = malloc(161*sizeof(char));

    /* Gestione della richiesta */
    /*Fine Gestione richiesta*/

    free(msg);
    /*fine ciclo - ritorno al while*/
    }

    solo che mi si blocca quando lo faccio partire con le malloc !! Dove sbagliO??? Forse nel dichiarare msg fuori dal main? (cosi mi è venuto un dubbio ora)
    Tra poco sarò all'uni e magari se non risolviamo posto qualche riga di codice

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    devi fare:
    codice:
    msg = (char*)malloc(161*sizeof(char))
    Il "sizeof(char)" è superfluo perchè di norma è superfluo.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,318
    Originariamente inviato da pprllo
    Il "sizeof(char)" è superfluo perchè di norma è superfluo.
    Io direi che è superfluo nella maggioranza dei casi, perchè un char, solitamente, occupa 1 byte.
    Non è così per tutte quelle architetture in cui un char occupa di più (architetture, ad esempio, che implementano nativamente i caratteri UNICODE).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Originariamente inviato da pprllo
    devi fare:
    codice:
    msg = (char*)malloc(161*sizeof(char))
    Il "sizeof(char)" è superfluo perchè di norma è superfluo.
    Ma va bene la free alla fine del ciclo?
    Oggi ci rimettiamo le mani dato che ieri ci siamo inchiodati una po sul client ma alla fine abbiamo risolto (credo). Aggiornamenti piu tardi!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.