Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45

    [C] Aggiornamento testa lista

    Salve,

    ho creato dinamicamente una lista linkata...nel mio caso però l' aggiornamento della testa della lista non lo posso fare nella funzione dove inserisco il nuovo elemento,in quanto nel mio codice faccio uso della primitiva fork ed il figlio creato si incarica di aggiungere l'elemento nella lista mentre il padre si incarica di aggiornare la testa della lista in modo tale che tutti i figli possano vedere il giusto valore della testa.
    Detto ciò quando mando in esecuzione il programma ho un MALEDETTO "Segmentation fault" proprio quando il padre va ad eseguire la funzione di aggiornamento testa...
    Ora vi posto il codice:


    struct rich{

    int richfd; // file descriptors
    int frequenza;
    struct rich* succ;
    struct risp* rispostarelativa;
    };

    typedef struct rich* richiesta;
    richiesta inserimentorichieste(int i,richiesta* start,char* buff){

    richiesta q;
    char nome1[LUNGH1]="./cache/richiesta";
    char nome2[LUNGH2]=".txt";
    char* n1;

    n1=itostring(i);
    strcat(nome1,n1);
    strcat(nome1,nome2);


    q= (richiesta)malloc(sizeof(struct rich));


    if((q->richfd=open(nome1,O_RDWR | O_CREAT,S_IROTH | S_IWOTH))<0){
    printf("errore nella creazione del file: %s\n",strerror(errno));
    }

    if((write(q->richfd,buff,strlen(buff)))<0){
    printf("errore nella scittura del file: %s\n",strerror(errno));
    }


    close(q->richfd);
    return q;}
    void aggiornatestarich(richiesta* testa,richiesta q){
    q->succ=*testa;
    *testa=q;
    }
    void aggiornatestarich(richiesta* testa,richiesta* q){
    *q->succ=*testa;
    *testa=*q;
    }
    Non so quale delle 2 è valida,ma vi posso dire che:
    la seconda funzione di aggiornamento testa mi da un errore di compilazione :"error: request for member ‘succ’ in something not a structure or union"
    mentre la prima non da errori di compilazione,ma accade quanto detto sopra....
    Vi prego datemi una mano....
    GRAZIE

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    ehiiii, ma nessuno può darmi qualche consiglio????

  3. #3
    Se non posti tutto il codice, per vedere come gestisci la fork, mi pare arduo darti un aiuto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Prima di questo pezzo di codice vi è tutta la parte relativa alla creazione e configrazione della socket (socket,bind,listen ecc) che non ho riportato...


    [QUOTE] while(1){

    len = sizeof(cli_add);
    if((conn_fd=accept(list_fd,(struct sockaddr*) &cli_add,&len))<0){
    perror("errore nell' esecuzione della accept\n");
    exit(1);
    }

    if((pid=fork())<0){
    perror("errore nella creazione del figlio\n");
    exit(1);
    }

    if(pid==0){ // processo figlio
    close(list_fd);
    proxyhttp(conn_fd);
    exit(0);
    }

    else{ // processo padre
    close(conn_fd);
    }
    }QUOTE]

    ho pensato che forse l'aggiornarnamento della testa debba essere fatto nel padre...ma poi sorgono i probeli enunciati all'inizio del post...

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    la funzione proxy svolge le normali funzioni di un proxy,cioè controlla se la richiesta è presento o meno nella cache,manda eventuali richieste al server e memorizza le pagine ricevute...

  6. #6
    Bisogna vedere anche come chiami la aggiornatestarich (se posti tutto il codice facciamo prima non credi?)

    In ogni modo la seconda aggiornatestarich che non riesci a compilare, si compila se aggiungi delle parentesi:
    Codice PHP:
    void aggiornatestarich (richiestatestarichiestaq){
        (*
    q)->succ=*testa
        *
    testa=*q


  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    while(1){

    len = sizeof(cli_add);
    if((conn_fd=accept(list_fd,(struct sockaddr*) &cli_add,&len))<0){
    perror("errore nell' esecuzione della accept\n");
    exit(1);
    }


    printf("pid %d: prima di fork \n", getpid());
    printf("pid %d: valore di i prima di proxy: %d\n", getpid(),i);

    if((pid=fork())<0){
    perror("errore nella creazione del figlio\n");
    exit(1);
    }

    if(pid==0){ // processo figlio

    printf("pid %d: valore di i prima di proxy ora sto nel figlio: %d\n", getpid(),i);
    childpid=getpid();
    proxyhttp(conn_fd);
    printf("pid %d: valore di i dopo proxy: %d\n",getpid(),i);
    exit(0);
    }

    else{ // processo padre
    close(conn_fd);
    i++;
    j++;
    printf("SONOOOOOOOOOOOOOOOOOO QUIIIIIIIIIIIIII\n");
    //while(waitpid(childpid,NULL,0)>0);
    aggiornatestarich(&testa,q); usando la prima versione di aggiornatesta


    }
    }


    exit(0);
    }

  8. #8
    Spero di essere d'aiuto, prova a buttare un'occhio su questo codice:


    Codice Sbagliato

    Codice PHP:
    int inserisci (struct scheda *tint valchar *nomechar *cogn)

    struct scheda *p;
    p=(struct scheda *)malloc(sizeof(struct scheda));

    if (
    p==NULL) return (ERRORE);

    p->codice=val;
    p->nome=strdup(nome);

    if (
    p->nome==NULL) return (ERRORE);

    p->cognome=strdup(cognome);

    if (
    p->cognome==NULL) return (ERRORE);

    p->succ=t;
    t=p;
    return (
    OK);



    Codice Corretto

    Codice PHP:
    int inserisci (struct scheda **tint valchar *nomechar *cogn)

    struct scheda *p;

    p=(struct scheda *)malloc(sizeof(struct scheda));

    if (
    p==NULL) return (ERRORE);

    p->codice=val;
    p->nome=strdup(nome);

    if (
    p->nome==NULL) return (ERRORE);

    p->cognome=strdup(cognome);

    if (
    p->cognome==NULL) return (ERRORE);

    p->succ=*t;
    *
    t=p;
    return (
    OK);

    Programma Chiamante

    Codice PHP:
    ret=inserisci (&testavalnomecognome); 
    Fammi sapere!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Ho visto un pò i 2 frammenti di codice:
    p->succ=t;
    t=p;
    è sbagliato perxchè tu passi un puntatore alla testa e così salvi in p->succ l'indirizzo di t e non il valore puntato da t...

    struct scheda **t,
    io tramite un typedef creerei un puntatore a scheda:

    typedef struct scheda* punt;

    e nella funzione lo passi così:

    int inserisci (punt *t, int val, char *nome, char *cogn)

  10. #10
    Già quello è l'inserimento dopo
    Questo è l'inserimento in testa, infatti

    Codice PHP:
    struct scheda *testa=NULL;
    struct scheda *p;

    p=(struct scheda *)malloc(sizeof(struct scheda));
    if (
    p==NULLerror(); /* gestisce la situazione di errore */

    p->codice=val;
    p->nome=strdup(nome);

    if (
    p->nome==NULL)
    error(); /* gestisce la situazione di errore */

    p->cognome=strdup(cognome);
    if (
    p->cognome==NULL)
    error(); /* gestisce la situazione di errore */

    p->succ=testa;
    testa=p
    Ci provo, quindi

    Codice PHP:
    void aggiornatestarich(richiesta *testa,richiesta *q){
    q->succ=testa;
    testa=q;

    Sono curioso, se trovi la soluzione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.