Пример #1
0
int criarRaiz (Arvore **A1) {
	Arvore *novo;
	novo = criarNo ();
	novo->no = criarRegistro ();
	inserirDados (novo);
	*A1 = novo;
	printf("RETORNO1\n");
	return 1;
}
Пример #2
0
int main(void)
{
    rede = malloc(sizeof(petri_t));
    contador = malloc(sizeof(conta_trans));
    unsigned t = time(NULL);                    /* Temporizador da simulacao */
    unsigned qt,                                /* Quantidade de transicoes */
             ql;                                /* Quantidade de lugares */
    unsigned i,                                 /* Variavel geral de laco */
             j,                                 /* Variavel geral de laco */
             k,                                 /* Variavel geral de laco */
             lctk,                              /* Variavel temporaria de insercao */
             alt,                               /* Total de arcos lugar -> transicao */
             atl;                               /* Total de arcos transicao -> lugar */
    dados *d = malloc(sizeof(dados)),           /* Lista de transicoes */
          *pd = d;                              /* Ponteiro auxiliar da lista de transicoes */
    l_thread *lthr = NULL;                      /* Lista de threads */
    pthread_t temp_thr;                         /* Variavel auxiliar da lista de threads */

    rede -> l = NULL;
    rede -> tl = NULL;
    rede -> lt = NULL;
    srand(time(NULL));

    /* Escaneando a quantidade de lugares */
    scanf("%u",&ql);
    rede->total_l = ql;
    /* Escaneando a quantidade de transicoes */
    scanf("%u",&qt); 
    rede->total_t = qt;
    /*********** EasterEgg v1.0 BirthDay version **************/ 
    /*********** Only programmers will now, it needs recompilate with the MACRO ***************/
#ifdef EASTEREGGV1
    printf("14/12/2015 The first day of the Petri Simulator, tagged v1.0 one day ago at 22:00 PM\n");
    printf("It is also the day of the birthday of the co-developer Otacilio Neto\n");
    printf("So congratulations to both!!!\n");
    printf("\"Twenty years from now you will be more disappointed by the things that you didnt do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails\"\n");
    printf("Explore! Dream! Discover!\n");
#endif
    /********** End EasterEgg v1.0 ******************/ 

    if(DEBUG == A || DEBUG == D) printf("Quantidade de lugares: %u\n",ql);
    /*if(ql>VMAX)
      {
      printf("Erro linha 1: quantidade de lugares acima do maximo. \n");
      return -1;
      }*/
    if(DEBUG == A || DEBUG == D) printf("Quantidade de transicoes: %u\n",qt);
    /*if(qt>VMAX)
      {
      printf("Erro linha 2: quantidade de transicoes acima do maximo. \n");
      return -1;
      }*/
    /* Escaneando total de lugares com pelo menos um token */
    scanf("%u",&lctk);
    /* Escaneando total de arcos lugar -> transicao */
    scanf("%u",&alt);
    /* Escaneando total de arcos transicao -> lugar */
    scanf("%u",&atl);

    for(k=0;k<lctk;k++)
    {
        scanf("%u %u", &i, &j);
        if(i>=ql)
        {
            printf("Erro linha %u: lugar maior que o definido. \n", 6+k);
            return -1;
        }
        inserirLugar(&(rede->l), i, j, LIVRE);
    }
    for(k=0;k<rede->total_l;k++)
    {
        if(buscarLugarPos((rede->l), k) == NULL)
            inserirLugar(&(rede->l), k, 0, LIVRE);
    }
    if(rede->l == NULL)
    {
        printf("Erro: lugar nao pode ser lido no documento de texto.\n");
        return -1;
    }
    for(k=0;k<alt;k++)
    {
        scanf("%u %u %u", &i, &lctk, &j);
        if(i>=ql||j>=qt)
        {
            printf("Erro linha %u: lugar ou transicao acima do definido. \n", 6+lctk+k);
            return -1;
        }
        inserirFlecha(&(rede->lt), i, j, lctk);
    }
    if(rede->lt == NULL)
    {
        printf("Erro: flecha lugar->transicao nao pode ser lido no documento de texto.\n");
        return -1;
    }
    for(k=0;k<atl;k++)
    {
        scanf("%u %u %u", &i, &lctk, &j);
        if(i>=qt||j>=ql)
        {
            printf("Erro linha %u: lugar ou transicao acima do definido. \n", 6+lctk+k+alt);
            return -1;
        }
        inserirFlecha(&(rede->tl), i, j, lctk);
    }
    if(rede->tl == NULL)
    {
        printf("Erro: flecha transicao->lugar nao pode ser lido no documento de texto.\n");
        return -1;
    }
    if(DEBUG == A || DEBUG == D) imprimirLugar(rede->l);
    if(DEBUG == A || DEBUG == D) imprimirFlechaTL(rede->tl);
    if(DEBUG == A || DEBUG == D) imprimirFlechaLT(rede->lt);
    desenha_rede(rede, "inicio.bmp");
    printf("======= INICIO DA SIMULACAO =======\n");
    printf("(execucao pode demorar dependendo do tamanho da rede...)\n");
    k = 0;
    do
    {
        k++;
        it_escape = 0;
        /* d->net = rede; */
        M_LIN;
        trigger = 1;
        for(i=0;i<qt;i++)
        {
            inserirDados(&d, i);
            if(pd->prox != NULL)
                pd = pd->prox;
            if(pthread_create(&temp_thr, NULL, transicao, (void *)pd))
            {
                printf("Erro criando thread %u!\n",i);
                exit(1);
            }
            inserirThread(&lthr, temp_thr);
        }
        trigger = 0;
        while(lthr != NULL)
        {
            temp_thr = lthr->thr;
            if(pthread_join(temp_thr, NULL))
            {
                printf("Erro juntando thread!\n");
                exit(1);
            }
            lthr = lthr->prox;
        }
        if(DEBUG == A || DEBUG == D) imprimirLugar(rede->l);
        M_LIN;
        if(k>ITER)
        {
            printf("Atencao! Apos %u iteracoes, a rede de petri nao estabilizou! Finalizando a simulacao. \nPara aumentar a quantidade maxima de iteracoes, verifique o manual de utilizacao do programa.\n",ITER);
            break;
        }
    }while(it_escape);
    printf("======= FIM DA SIMULACAO ==========\n");
    desenha_rede(rede, "fim.bmp");
    t = time(NULL) - t;
    printf("Tempo de reprodução do programa: %u segundo(s).\n",t);
    if(k==0)
        printf("Aviso: nenhuma transicao foi disparada! \n");
    if(k<ITER)
        printf("Numero de iteracoes necessarias pra convergir: %u.\n",k);
    printf("Lugares com token: \n");
    imprimirLugar(rede->l);

    printf("Transicoes disparadas: \n");
    conta_trans *ct = contador;
    while(ct != NULL)
    {
        printf("T%u: %u vez(es)\n", ct->pos, ct->x);
        ct = ct->prox;
    }

    return EXIT_SUCCESS;
}