Добавление нескольких очередей в программе - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь смоделировать очередь ожидания. Программа включает в себя очередь и контроллер очереди. Он отлично работает для 1 очереди за один раз, но теперь мне нужно добавить несколько очередей. Я создал новую структуру, которая включает в себя две вышеупомянутые структуры (структура очереди и структура контроллера), затем я динамически распределяю память, используя malloc. Дело в том, что новые клиенты должны входить в очередь, в которой каждый раз будет меньше клиентов. Я сделал функцию QueueCheck, но она не дает указателю, который я ей назначил, показывать в очереди с меньшим количеством клиентов.

Функции очереди являются основными функциями для обработки очереди. Пожалуйста, игнорируйте комментарии, которые не на английском языке, спасибо. Вот код:

int main(void)
{   Cont_Oura            *diaxeirish;                   /* struct array that includes a queue and it's Controller */
    float           arrival_possibility; /*pi8anothta afikshs*/
    unsigned int    simulation_time; /*synolikos xronos prosomoiwshs*/
    unsigned int    service_time;/*xronos e3yphrethshs enos pelath*/
    unsigned int minnum; /* used to randomly generate service time */
    unsigned int maxnum; /* used to randomly generate service time */
    unsigned int    time1;               /*roloi prosomoiwshs*/
    unsigned int    time_left;   /*time left for a customer to be serviced*/
    unsigned int    customer_sum;    /*customers that were serviced*/
    unsigned int    waiting_time;    /*synolikos xronos anamonhs*/
    unsigned int    left_cust; /* customers that were not serviced*/
    unsigned int max_cust; /*max number of customers entered the queue */
    TSOuras     customer;           /*The customer in the queue*/
    float           average;         /*average time of customers waiting in the queue*/
    float           randomArrival;
    int       controllerInactive=0;
    time_t          t;
    TController Controller;
    TOuras queue;
    int n, i;

    srand(time(&t));
    printf("Give number of queues that the simulation will have\n");
    scanf("%d", &n);
    diaxeirish = (Cont_Oura *)malloc(n * sizeof(Cont_Oura));
    if (diaxeirish == NULL){
      printf("Not enough space to allocate memory for diaxeirish");
      return -1;
    }

    printf("Give units of time for the simulation (0 <=), arrival possibility in unit of time (0,1), min and max number to calculate (randomly) the service time(same for every queue)\n");
    scanf("%u %f %u %u",&simulation_time,&arrival_possibility,&minnum, &maxnum);
    getchar();
    printf("The simulation will last %4u units of time.\n",simulation_time);
    printf("The arrival possibility for a customer in a unit of time is: %4.2f.\n",arrival_possibility);
    service_time = (rand() % (maxnum + 1 - minnum) + minnum);
    CustomerSetServiceTime(&customer, service_time);
    printf("The service time for every customer is %d units of time .\n",CustomerGetServiceTime(customer));
    for (i=0; i<=n-1; i++){
        QueueCreation(&(diaxeirish->queue)); /* initializes queue */
        ControllerCreation(&(diaxeirish->Controller)); /*initializes Controller */
    }
    QueueCreation(&queue);
    ControllerCreation(&Controller);
    time1 = 0;
    time_left = 0;
    waiting_time =0;
    i=0;
    while( time1 < simulation_time )
    {   /* Pelatis- Aytokinhto  */
        randomArrival = (float)rand()/(float)RAND_MAX;

        if ( randomArrival < arrival_possibility ){
            CustomerSetEntranceTime(&customer, time1);
            QueueCheck(diaxeirish, n, &queue);
            if (!QueueIns(&queue, customer)){
                  printf("Queue is small! The simulation will stop \n");
                  getchar();
                  return 0;
            };
        };

Структура Cont_Oura это

typedef struct{ /*struct for controller and queue */
    TOuras queue;
    TController Controller; 
}

А вот функция QueueCheck:

void QueueCheck(Cont_Oura *diaxeirish, int n, TOuras *queue){ /*the customers start entering from the queue number n, then n-1... */
    if (QueueGetSize((diaxeirish+n-1)->queue) == 0 || (QueueGetSize((diaxeirish+n-1)->queue) == QueueGetSize((diaxeirish)->queue))) /* if the last queue has 0 customer  or the first and last queue have the same number of customers */
        queue = &((diaxeirish+n-1)->queue); /* then add customer to the last queue */
    else if (QueueGetSize((diaxeirish+n-2)->queue) < QueueGetSize((diaxeirish+n-1)->queue))
        QueueCheck(diaxeirish, n-1, queue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...