#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main(int argc, char **argv) {
    char buffer[50];
    int n=0,i,par;
    double d,t;
    printf("Ingrese la cantidad de Nros double a ingresar:");
    fgets(buffer,10,stdin);
    par = sscanf(buffer,"%d",&n);
    if ( par == 1 ) {
        if ( n <= 0 || n > 100 ) {
            printf("%d es incorrecto!\n",n);
            exit(1);
        }
        int shmid = shmget(0xA,0,0);
        void *p = shmat(shmid,0,0);
        void *pp = p;
        // inicializo memoria
        memset(p,0,sizeof(int)+(n*sizeof(double)));
        // guardo n
        memcpy(p,&n,sizeof(int));
        p+=sizeof(int);
        // n es correcto
        for(i=0;i<n;i++) {
            do {
                par=0;d=0.0;
                printf("Ingrese Nro decimal (%d de %d):",i+1,n);
                fgets(buffer,50,stdin);
                par = sscanf(buffer,"%lf",&d);
            } while(par != 1);
            memcpy(p,&d,sizeof(double));
            p+=sizeof(double);
        }
        // recupero contenido de la memoria y la sumo
        p = pp;
        memcpy(&n,p,sizeof(int));
        printf("Se ingresaron %d numeros\n",n);
        t=0.0;
        p+=sizeof(int);
        for(i=0;i<n;i++) {
            memcpy(&d,p,sizeof(double));
            printf("Nro #%d  %lf\n",i+1,d);
            t+=d;
            p+=sizeof(double);
        }
        printf("Total   %lf\n",t);
    } else printf("ingreso incorrecto!\n");
    return 0;
}

