Salve a tutti ho un problema coi semafori.
Questo è il testo del programma che devo svolgere:
Un tratto autostradale delimitato da una barriera di ingresso (dotata di 3 caselli)
[Vi sono un certo numero N (maggiore di 10) di auto descritte in un file di testo che viene letto all'inizio. Per ogni auto, nel file viene indicata la sua velocita' media con un valore V compreso tra 50 e 100 (chiaramente, ogni auto ha la propria velocita').
Vi sara' un generatore delle auto che legge in anticipo tutto il file eche genera tutte le auto descritte.]
Appena generata, una auto decide in quale dei 3 caselli della barriera di ingresso accodarsi. E si mette in coda a tale casello.
(Il modo in cui l'auto sceglie il casello e' a vostra scelta).
Questo è il programma che ho fatto fino adesso:
codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct elemento {
char nome[20];
int v_media;
int ticket;
struct elemento *next;
}TipoElem; /* Meglio dare un nome diverso al tipo */
typedef TipoElem * TipoLista; /* Questo serve per definire il tipo della lista
(per non commettere errori logici ecc...) e per
rendere il codice un po' più semplice da capire */
TipoLista crea_lista (){
/* Questa funzione usa l'inserimento IN TESTA */
TipoLista listaAuto = NULL;
TipoElem *nuovo; /* Serve per creare sempre un nuovo nodo */
FILE *catalogo = fopen ("elenco_auto.txt", "r");
if (!catalogo)
printf ("Errore in apertura file!");
else {
/* Se il file non è vuoto inizio ad aggiungere le auto,
fino a quando non arrivo alla fine del file (EOF),
in pratica così il programma legge qualsiasi file
formattato in questo modo e non serve sapere il numero
di elementi contenuti... */
while (!feof(catalogo)){
nuovo = malloc (sizeof(TipoElem)); /* Alloco il nuovo elemento */
fscanf (catalogo ,"%s\n%d", nuovo->nome, &nuovo->v_media);
nuovo->ticket = rand() % 3 + 1;
nuovo->next = listaAuto; /* Assegno il nodo successivo a questo come l'inizio della "vecchia" lista */
listaAuto = nuovo; /* E poi assesto la lista sul primo vero nodo, che ora è diventato
proprio questo! Ecco l'inserimento in testa... */
}
}
return listaAuto;
}
typedef struct{
int valore;
struct TipoElem *lista;
}semaforo;
wait (semaforo *s) {
s->valore--;
if (s->valore < 0){
block();
}
}
void visualizza_lista(TipoLista p)
{
printf("lista: \n -> ");
while(p)
{
printf("%s", p->nome);
printf(": %d\n", p->v_media);
printf("Num ticket: %d\n", p->ticket);
printf(" -> ");
p = p->next;
}
printf("NULL");
return;
}
int main()
{
TipoLista lista;
semaforo s;
lista = crea_lista();
visualizza_lista(lista);
printf ("\n\nFine");
system ("PAUSE");
return 0;
}
Dal libro non riesco a capire come devo impostare e gestire il codice dei semafori. Non so se devo usarne uno unico o tre e appunto non so come impostarli.Spero che mi possiate dare una mano.
Grazie in anticipo e buona giornata