online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code    Language
#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: ", i+1); scanf("%d %d", &esami->voto[i], &esami->cfu[i]); } 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: \n", esami->voto[i], i+1); somma += esami->voto[i+1]; } printf(" La media dell'alunno è: %f \n", calcola_media(esami)); shmdt(esami); // Scollegare l'area di memoria shmctl(segment_id, IPC_RMID, NULL); // Deallocazione dell'area return 0; } }

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text
×

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue