Memoria Condivisa

di il
9 risposte

Memoria Condivisa

Salve a tutti. Sto riscontrando alcuni problemi nel momento in cui definisco TEsami *esami perchè ho provato a definirla prima della creazione della memoria ma non andava ed idem anche quando la definisco nel processo figlio. Non so come fare :/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>

/*------------------------------------------
 * Struttura dati per rappresentare le
 * informazioni sugli esami
 *----------------------------------------*/
#define MAX_ESAMI 40

typedef struct {
    int numero_esami; /* Numero di esami sostenuti */
    int voto[MAX_ESAMI]; /* Voti riportati in ciascun esame sostenuto */
    int cfu[MAX_ESAMI]; /* Numero di CFU di ciascun esame sostenuto */
} TEsami;


/*--------------------------------------------
 * Calcola la media degli esami sostenuti.
 * Parametri di ingresso:
 *    esami    puntatore alla struttura contenente le informazioni
 *             sugli esami sostenuti
 * Valore di ritorno:
 *    la media dei voti degli esami, o 0 se non ci sono esami sostenuti.
 *------------------------------------------*/
double calcola_media(const TEsami *esami) {
    assert(esami!=NULL);
    int somma_pesata=0;
    int somma_cfu=0;
    int i;
    if (esami->numero_esami<=0)
        return 0.0;
    for(i=0; i<esami->numero_esami; i++) {
        somma_pesata += esami->voto[i]*esami->cfu[i];
        somma_cfu += esami->cfu[i];
    }
    return (double)somma_pesata / somma_cfu;
}


/*---------------------------
 * main
 *-------------------------*/
int main(int argc, char *argv[]) {
   /* Creazione dell'area di memoria */
  const int segment_size = MAX_ESAMI * sizeof (int);
  int segment_id = shmget (IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
 
  if(segment_id < 0) {
      printf("Errore in shmget\n");
      return -1;
  }
 
  pid_t pid = fork (); // la chiamata fork crea un processo figlio

  /* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
  if(pid < 0) {
      /* Errore verificato */
      printf("Fork non riuscita\n");
      shmctl (segment_id, IPC_RMID, NULL);   // Deallocazione della memoria
      return -1;
  } else if(pid == 0){
      /* Processo Figlio */
      TEsami *esami = (TEsami *) shmat (segment_id, NULL, 0);   //  Per usare un'area di memoria condivsa, il processo deve collegarla al suo spazio di indirizzamento
      int i;

      printf ("Inserire il numero di esami sostenuti: ");
      scanf ("%d", &esami->numero_esami);
     
      if(esami->numero_esami > MAX_ESAMI) {
          return -1;
      }
     
      for(i = 0; i < esami->numero_esami; i++) {
          printf("Inserire il numero di CFU ed il voto riportato dell'esame %d conseguito: ", esami[i].numero_esami+1);
          scanf("%d %d", esami[i].voto, &esami[i].cfu);
      }
     
      shmdt(esami); // Quando un processo ha finito di usare un'area di memoria condivisa, deve scollegarla dal suo spazio di indirizzamento
      return 0;
  } else {
       /* Processo Padre */
        wait(NULL); // Attende la terminazione del figlio prima di accedere alla memoria
       
        TEsami *esami = (TEsami *) shmat (segment_id, NULL, 0);
        int i;
        int somma = 0;

        for(i = 0; i < esami->numero_esami; i++) {
          printf("Voto %d riportato dell'esame %d conseguito: ", esami[i].voto, esami[i].numero_esami+1);
          somma+ = esami[i+1].voto;
      }
     
      printf(" La media dell'alunno è: %f", calcola_media(somma));
        shmdt(esami); // Scollegare l'area di memoria
        shmctl(segment_id, IPC_RMID, NULL); // Deallocazione dell'area
        return 0;
  }
}

9 Risposte

  • Re: Memoria Condivisa

    Perché hai postato in questa sezione?
  • Re: Memoria Condivisa

    Non sapevo dove postarlo. Devo metterlo in Ingegneria del software?
  • Re: Memoria Condivisa

    Di che linguaggio di programmazione stai parlando?
  • Re: Memoria Condivisa

    Del linguaggio C però trattandosi di memoria condivisa ho pensato che non rientrasse in quella categoria
  • Re: Memoria Condivisa

    E perche? Cosa c'entrano gli altri linguaggi?

    E come prima, che problemi hai esattamente?
  • Re: Memoria Condivisa

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <unistd.h>
    #include <sys/shm.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    
    /*------------------------------------------
     * Struttura dati per rappresentare le 
     * informazioni sugli esami
     *----------------------------------------*/
    #define MAX_ESAMI 40
    
    typedef struct {
        int numero_esami; /* Numero di esami sostenuti */
        int voto[MAX_ESAMI]; /* Voti riportati in ciascun esame sostenuto */
        int cfu[MAX_ESAMI]; /* Numero di CFU di ciascun esame sostenuto */
    } TEsami;
    
    
    /*--------------------------------------------
     * Calcola la media degli esami sostenuti.
     * Parametri di ingresso:
     *    esami    puntatore alla struttura contenente le informazioni
     *             sugli esami sostenuti
     * Valore di ritorno:
     *    la media dei voti degli esami, o 0 se non ci sono esami sostenuti.
     *------------------------------------------*/
    double calcola_media(const TEsami *esami) {
        assert(esami!=NULL);
        int somma_pesata=0;
        int somma_cfu=0;
        int i;
        if (esami->numero_esami<=0)
            return 0.0;
        for(i=0; i<esami->numero_esami; i++) {
            somma_pesata += esami->voto[i]*esami->cfu[i];
            somma_cfu += esami->cfu[i];
        }
        return (double)somma_pesata / somma_cfu;
    }
    
    
    /*---------------------------
     * main
     *-------------------------*/
    int main(int argc, char *argv[]) {
        TEsami *esami;
       /* Creazione dell'area di memoria */
      const int segment_size = MAX_ESAMI*sizeof(int);
      int segment_id = shmget (IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
      
      if(segment_id < 0) {
          printf("Errore in shmget\n");
          return -1;
      }
      
      pid_t pid = fork (); // la chiamata fork crea un processo figlio
    
      /* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
      if(pid < 0) {
          /* Errore verificato */
          printf("Fork non riuscita\n");
          shmctl (segment_id, IPC_RMID, NULL);	// Deallocazione della memoria
          return -1;
      } else if(pid == 0){
          /* Processo Figlio */
          int *p = (int *) shmat (segment_id, NULL, 0);	//  Per usare un'area di memoria condivsa, il processo deve collegarla al suo spazio di indirizzamento
          int i;
    
          printf ("Inserire il numero di esami sostenuti: ");
          scanf ("%d", &p->esami->numero_esami);
          
          if(p->esami->numero_esami > MAX_ESAMI) {
              return -1;
          }
          
          for(i = 0; i < p->esami->numero_esami; i++) {
              printf("Inserire il numero di CFU ed il voto riportato dell'esame %d conseguito: ", p[i]->esami->numero_esami+1);
              scanf("%d %d", &p[i]->esami->voto, &p[i]->esami->cfu);
          }
          
          shmdt(p); // Quando un processo ha finito di usare un'area di memoria condivisa, deve scollegarla dal suo spazio di indirizzamento
          return 0;
      } else {
           /* Processo Padre */
            wait(NULL); // Attende la terminazione del figlio prima di accedere alla memoria
            
            int *p = (int *) shmat (segment_id, NULL, 0);
            int i;
            int somma = 0;
    
            for(i = 0; i < p.numero_esami; i++) {
              printf("Voto %d riportato dell'esame %d conseguito: ", p[i]->esami->voto, p[i]->esami->numero_esami+1);
              somma+ = p[i+1]->esami->voto;
          }
          
          printf(" La media dell'alunno è: %f", calcola_media(somma));
            shmdt(p); // Scollegare l'area di memoria
            shmctl(segment_id, IPC_RMID, NULL); // Deallocazione dell'area
            return 0;
      }
    }
  • Re: Memoria Condivisa

    Ecco gli errori che mi da il compilatore
    Allegati:
    31884_6dba493ed18790559004b233a0282c2e.png
    31884_6dba493ed18790559004b233a0282c2e.png
  • Re: Memoria Condivisa

    Chiedi al moderatore di spostare tutto il thread nella sezione c/c++

    Prendi il primo errore del compilatore e leggilo bene, poi correggi la riga in cui si presenta (e in tutte quelle simili), ricompila e riprova.

    Discuti di un errore per volta
  • Re: Memoria Condivisa

    Perchè hai cambiato questo

    TEsami *esami = (TEsami *) shmat( ...

    in quest'altro

    int *p = (int *) shmat(...

    ?

    Non ha senso
Devi accedere o registrarti per scrivere nel forum
9 risposte