Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [C] Gestione porto

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22

    [c] - gestione porto

    Ciao a tutti sono nuovo da queste parti. Ho un problema devo realizzare il progetto del quale vi riporto il testo qui sotto e avrei bisogno di due dritte a grandi linee per cominciare nella realizzazione di questo lavoro.
    Grazie a tutti


    <<Scopo del progetto è gestire il transito delle imbarcazioni in un porto seguendo le
    specifiche qui riportate.
    All'inizio dell'esecuzione il porto è vuoto. Vengono generate tramite un processo
    un certo numero di imbarcazioni che cercano di entrare nel porto. NB: il numero
    di moli è limitato quindi al più 10 imbarcazioni possono soggiornare
    contemporaneamente nel porto. Dopo un po' di tempo trascorso a riva (variabile
    da imbarcazione a imbarcazione), ogni imbarcazione prende il largo liberando il
    molo che occupava.
    L'accesso al porto avviene tramite un canale gestito come senso unico alternato.
    Ad intervalli regolari vengono fatte entrare alcune imbarcazioni nel porto e poi
    fatte uscire alcune imbarcazioni. La durata dei periodi di ingresso ed uscita è
    identica. Quindi quando è il turno degli ingressi, le navi ferme al largo iniziano a
    entrare, e continuano a farlo per un certo tempo prefissato (a patto che ci siano
    moli liberi). Allo scadere del tempo, l'ingresso viene bloccato e si consente alle
    navi pronte a partire di uscire, sempre per un tempo prefissato.
    Ogni imbarcazione attraccata, avvisa la capitaneria di porto inviando un
    messaggio su di una coda (unica per tutte le imbarcazioni e per la capitaneria),
    indicante il nome della nave, il carico ed eventuali altre informazioni ritenute
    utili. La capitaneria di porto registra tali messaggi in un'area di memoria
    condivisa (il registro della capitaneira).
    A campione, la capitaneria di porto effettua dei controlli su di alcune
    imbarcazioni. A tal fine il processo si forka generando un controllore. Controllore
    e nave si scambiano alcune informazioni secondo il protocollo descritto nel
    seguito. Il controllore riporta nel registro tutti i passi.

    Messaggio 1: da capitaneria a nave: CHECK_START
    Messaggio 2: da nave a capitaneira: materiale trasportato + quantità
    Messaggio 3: da capitaneira a nave: OK oppure MULTA

    La terminazione di tutti i processi figli va intercettata dal corrispodente genitore,
    che in tale occorrenza esegue la wait/waitpid.>>

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    up

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    sai creare le strutture di base ?
    conosci come funziona il fork ?
    sai creare una memoria condivisa ?
    sai scambiare i messaggi tra processi ?

    ciao
    sergio

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    sì più o meno ho un'idea di tutto quanto ho già fatto un esame di c a livello base e l'ho superato anche abbastanza bene però ora come ora sono un po' spiazzato mi sembra un lavoro più grande di me e fatico a organizzarmi e partire ad essere sincero...

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    no, non mi sembra banale.
    Inizierei a creare le strutture ed ad allocare la memoria condivisa dai vari processi.
    Una struttura può essere la imbarcazione e conterrà il suo nome, il carico ecc..
    Un'altra struttura è il registro della capitaria di porto.
    ecc.

    Poi inizializza le strutture alle condizioni iniziali e pensiamo a come dar vita alla simulazione.

    in bocca al lupo
    sergio

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    ho creato nave.c e ora gira con una sola nave... come faccio ad adattarlo x far creare a random da zero a dieci navi?

    #include "libporto.h"

    char *get_merce ()
    {
    char *prodotto;
    int valore;
    srand (getpid());
    valore = rand()%5 + 1;

    switch(valore)
    {
    case 1:
    prodotto = ("TABACCO");
    break;

    case 2:
    prodotto = ("ACCIAIO");
    break;

    case 3:
    prodotto = ("FERRO");
    break;

    case 4:
    prodotto = ("AUTOMOBILI");
    break;

    case 5:
    prodotto = ("BOMBE");
    break;

    deafult:
    printf("errore \n");
    break;
    }
    return prodotto;

    }

    int get_quantita()
    {
    int t;
    srand(getpid());
    t = rand()%120 + 1;
    return t;
    }


    main()
    {
    int pid;
    int n;
    boat nave;

    pid = fork();

    if (!pid)
    {
    printf("Sono il figlio %d\n", getpid());
    nave.identificatore = getpid();
    nave.merce = get_merce();
    nave.quantita = get_quantita();
    printf("identificatore nave ---> %d \n", 1);
    printf("merce contenuta sulla nave: %s \n", nave.merce);
    printf("quantitÃ_ di merce contenuta sulla nave: %d \n", nave.quantita);
    }

    else
    printf("padre %d\n", getppid());

    n = wait(0);

    if(n > 0)
    printf("Terminato figlio %d\n", n);
    }



    e libporto.h

    #ifndef molo
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <unistd.h>
    #define molo

    typedef struct {
    long type;
    int npid;
    char str[30];
    } msg;

    typedef struct {
    int quantita;
    char *merce;
    int identificatore;
    } boat;

    #endif

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    edit: il lavoro ora è a questo punto.. come dite di proseguire?

    #include "libporto.h"

    /* metodo che assegna in modo casuale un tipo di merce */
    char *get_merce()
    {
    char *prodotto; //stringa a cui si assegna il tipo di prodotto
    int valore; //valore a cui si assegnerà un numero casuale

    srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
    valore = rand() % 5 + 1; //assegna un valore casuale da 1 a 5 alla variabile valore

    switch(valore) //assegna il tipo di prodotto in base al numero generato
    {
    case 1:
    prodotto = ("TABACCO");
    break;

    case 2:
    prodotto = ("ACCIAIO");
    break;

    case 3:
    prodotto = ("FERRO");
    break;

    case 4:
    prodotto = ("AUTOMOBILI");
    break;

    case 5:
    prodotto = ("PNEUMATICI");
    break;

    deafult:
    printf("*****ERRORE*****\n");
    break;
    }

    return prodotto; //restituisce il prodotto

    }

    /* metodo che assegna in modo casuale una quantità ad un carico di merce */
    int get_quantita()
    {
    int t; //variabile contenente il peso della merce in tonnellate
    srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
    t = rand() % 120 + 1; //assegna un valore casuale da 1 a 120 alla variabile valore

    return t;
    }

    int get_numnavi()
    {
    int n; //variabile contenente il numero delle navi
    srand(getpid()); //senza questo il random restituisce sempre lo stesso num ???
    n = rand() % 15 + 1; //assegna un valore casuale da 1 a 120 alla variabile valore

    return n;
    }

    int main()
    {
    int pid; //variabile sulla quale eseguo fork()
    int n; //variabile sulla quale eseguo wait()
    boat nave; //struttura nave di tipo boat definita in "libporto.h"
    int i; //variabile contenente l'indice necessario per il ciclo for
    int num_navi;

    num_navi = get_numnavi();

    for (i = 1; i <= num_navi //ciclo for necessario per creare 10 processi figlio
    { //APERTURA FOR

    pid = fork(); //fork() su pid per creare il figlio

    if (!pid) //quando pid == 0 entro nel codice del processo figlio
    {
    printf("\n\nSono il figlio %d \n", getpid()); //e' stato creato il figlio del quale stampo il pid
    nave.identificatore = getpid(); //assegna all'identificatore della nave l'identificatore del processo
    nave.merce = get_merce(); //assegna un tipo random di merce con la funzione get merce
    nave.quantita = get_quantita(); //assegna una quantita random di merce con la funzione get quantita
    printf("Identificatore nave ---> %d \n", i); //stampa l'identificatore della nave
    printf("Merce contenuta sulla nave ---> %s \n", nave.merce); //stampa la merce trasportata dalla nave
    printf("Quantità di merce contenuta sulla nave ---> %d tonnellate\n", nave.quantita); //stampa la quantità della merce contenuta sulla nave

    i = num_navi + 1; //serve per farmi uscire dal ciclo, ovvero il figlio non effettua ulteriori fork()
    }

    else //invece quando pid == 1 entro nel codice del processo padre
    {
    i++; //incremento l'indice del ciclo for per evitare il loop
    printf("Sono il padre %d\n", getppid()); //stampo il pid del padre

    n = wait(0); //il processo padre aspetta la terminazione del processo figlio

    if(n > 0) //se la variabile contiene un numero maggiore di zero (pid del figlio)
    printf("Terminato il figlio %d\n", n); //allora significa che il processo figlio è terminato
    }
    } //CHIUSURA FOR

    return 0;
    }

    e questa la libporto.h

    #ifndef molo
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <unistd.h>
    #define molo

    typedef struct {
    long type;
    int npid;
    char str[30];
    } msg;

    typedef struct {
    int quantita;
    char *merce;
    int identificatore;
    } boat;

    char *get_merce();
    int get_quantita();
    int get_numnavi();

    #endif

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    per ora due considerazioni formali

    srand inizializza la sequenza dei numeri casuali con il seme per argomento, puoi usare il timstamp attuale, per esempio o come hai fatto il pid, che però non è tanto univoco. Comunque la inizializzazione la puoi fare una sola volta nel programma e la sequenza di numeri casuali è definita.

    Mi è caduto l'occhio sulla tua definizione dei prodotti, io utilizzerei un enumeratore in questo caso, che ti facilita la programmazione
    codice:
    ...
    typedef enum PRODOTTO {
    	TABACCO=1,
    	ACCIAIO,
    	FERRO,
    	AUTOMOBILI,
    	PNEUMATICI
    	} PRODOTTO ;
    
    ...
    typedef struct {
    	int quantita;
    	PRODOTTO merce;
    	int identificatore;
    } boat;
    
    ...
    /* metodo che assegna in modo casuale un tipo di merce */
    PRODOTTO get_merce()
    {
    
    	return rand() % 5 + 1; //assegna un valore casuale da 1 a 5 alla variabile valore
    }
    
    ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    grazie x le considerazioni provvedo subito a apportare le modifiche...

    come consigli di proseguire ora? passo alla creazione di un capitaneria.c che tiene conto delle entrate ed uscite del porto?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    con le modifiche segnala

    "nave.c:52: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘unsigned int’"

    su questa riga

    rintf("Merce contenuta sulla nave ---> %s \n", nave.merce); //stampa la merce trasportata dalla nave

    non riesco a far stampare la merce dopo aver usato l'enum

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.