int main() { pile p1; initialisationPile(p1); unsigned int i; for (i=0;i<5;i++) { empile(p1,i); } pile p2; initialisationPile(p2,p1); for (i=0;i<5;i++) { empile(p1,2*i); } while(!testPileVide(p1)) { std::printf("%d ",sommet(p1)); depile(p1); } std::putchar('\n'); affectationPile(p1,p2); while(!testPileVide(p2)) { std::printf("%d ",sommet(p2)); depile(p2); } std::putchar('\n'); while(!testPileVide(p1)) { std::printf("%d ",sommet(p1)); depile(p1); } std::putchar('\n'); testamentPile(p2); testamentPile(p1); return 0; }
void parcours_intExp(n_exp *n) { int iRegistre = 0; char tmp[256]; sprintf(tmp, "li $t%d, %d", iRegistre, n->u.entier); printMips(tmp); sprintf(tmp, "$t%d", iRegistre); empile(tmp); }
/* Effectue un tri rapide séquentiel */ void rapide_seq(bloc_t bloc_init) { pile p; int i, nb_blocs; bloc_t bloc; bloc_t blocs[2]; init_pile(&p); empile(&p, bloc_init); /* Principe du tri rapide séquentiel : * tant qu’il y a des blocs à trier, dépile un bloc, le découpe en * (au maximum) deux sous-blocs non-encore triés et les empile */ do { bloc = depile(&p); nb_blocs = rapide_decoupebloc(bloc, blocs); for (i = 0; i < nb_blocs; i++) empile(&p, blocs[i]); } while (!pile_vide(&p)); }
void worker(Pile* p){ TabNombres tn, gauche, droite; int pivot; depile(p, &tn); while(*(tn.tab)){ partitionner(tn, &pivot); if(pivot > 1){ gauche.tab = tn.tab; gauche.lng = pivot; empile(p, gauche); }if ( tn.lng - (pivot + 1) > 1 ){ droite.tab = tn.tab + pivot + 1; droite.lng = tn.lng - (pivot + 1); empile(p, droite); } depile(p, &tn); } //sleep(2); }
/*-------------------------------------------------------------------------*/ void parcours_lireExp(n_exp *n) { printMips("li $v0 5"); printMips("syscall"); int iRegistre = 0; char tmp[256]; sprintf(tmp, "move $t%d, $v0", iRegistre); printMips(tmp); sprintf(tmp, "$t%d", iRegistre); empile(tmp); }
void parcours_varExp(n_exp *n) { char var[256]; char tmp[256]; parcours_var(n->u.var, var); int iRegistre = 0; sprintf(tmp, "lw $t%d, %s", iRegistre, var); printMips(tmp); sprintf(tmp, "$t%d", iRegistre); empile(tmp); }
void triRapideFT(TabNombres tn){ Pile p; initPile(&p); empile(&p, tn); pthread_t thd; printf("haha\n"); int i; for(i = 0; i < NBWORKERS; i++){ pthread_create(&thd, NULL, (void* (*)(void*))worker, (void*)&p); } //sleep(2); //stop = true; pthread_join(thd, NULL); }
void * wrapper(void *arg){ arg_t * arg2 = arg; bloc_t bloc; bloc_t bret[2]; int nb_bloc; int i; while(1){ //on lock le mutex pour demarrer pthread_mutex_lock(&mutex1); // verif tri terminé, on debloque les threads bloqué + mutex if(pile_vide(&ma_pile) && arg2->compteur == 0){ pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex1); return NULL; } if(pile_vide(&ma_pile) && arg2->compteur > 0){ //deverouille le mutex et attends que cond soit signalée pthread_cond_wait(&cond,&mutex1); } //si pile pas vide if(!pile_vide(&ma_pile)){ arg2->compteur++; //on depile un bloc bloc = depile(&ma_pile); if(bloc.fin-bloc.debut > seuil_bloc_long){ //on le decoupe nb_bloc = rapide_decoupebloc(bloc,bret); //on empile les sous blocs for(i = 0; i < nb_bloc; i++) empile(&ma_pile,bret[i]); } else{ rapide_seq(bloc); } arg2->compteur--; } pthread_mutex_unlock(&mutex1); } }
/*-------------------------------------------------------------------------*/ void parcours_opExp(n_exp *n) { char tmp[256]; int iRegistre = 0; int iRegistre2 = 1; int iRegistre3 = 2; if(n->u.opExp_.op == plus) { parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == moins){ parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == fois) { parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3); printMips(tmp); sprintf(tmp,"mflo $t%d",iRegistre); printMips(tmp); } else if(n->u.opExp_.op == divise) { parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3); printMips(tmp); sprintf(tmp,"mflo $t%d",iRegistre); printMips(tmp); } else if(n->u.opExp_.op == egal){ parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp); sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp); sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp); sprintf(tmp,"%s:", etiquette); printMips(tmp); } else if(n->u.opExp_.op == diff) { parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp); sprintf(tmp,"beq $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp); sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp); sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == inf){ parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp); sprintf(tmp,"blt $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp); sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp); sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == infeg){ parcours_exp(n->u.opExp_.op1); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); char etiquette[256]; new_tag(etiquette); sprintf(tmp,"li $t%d, 1",iRegistre); printMips(tmp); sprintf(tmp,"ble $t%d, $t%d %s",iRegistre2, iRegistre3, etiquette); printMips(tmp); sprintf(tmp,"li $t%d, 0",iRegistre); printMips(tmp); sprintf(tmp,"%s:", etiquette); printMips(tmp); }else if(n->u.opExp_.op == ou){ char faux1[256]; char faux2[256]; char vrai[256]; char empile[256]; new_tag(faux1); new_tag(faux2); new_tag(vrai); new_tag(empile); parcours_exp(n->u.opExp_.op1); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2, faux1); printMips(tmp); sprintf(tmp,"j %s",vrai); printMips(tmp); sprintf(tmp,"%s :",faux1); printMips(tmp); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp,"or $t%d, $zero, $t%d",iRegistre, iRegistre3); printMips(tmp); sprintf(tmp,"j %s",empile); printMips(tmp); sprintf(tmp, "%s :", vrai); printMips(tmp); sprintf(tmp,"move $t%d $t%d",iRegistre, iRegistre2); printMips(tmp); sprintf(tmp,"%s : ", empile); printMips(tmp); } else if(n->u.opExp_.op == et) { char fin[256]; char faux[256]; new_tag(fin); new_tag(faux); parcours_exp(n->u.opExp_.op1); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2,faux); printMips(tmp); sprintf(tmp, "$t%d", iRegistre2); empile(tmp); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"beq $zero, $t%d, %s", iRegistre3, faux); printMips(tmp); sprintf(tmp,"and $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3); printMips(tmp); sprintf(tmp,"j %s", fin); printMips(tmp); sprintf(tmp," %s :",faux); printMips(tmp); sprintf(tmp,"li $t%d 0",iRegistre); printMips(tmp); sprintf(tmp ," %s :",fin); printMips(tmp); } else if(n->u.opExp_.op == non) { parcours_exp(n->u.opExp_.op1); sprintf(tmp, "$t%d", iRegistre3); depile(tmp); sprintf(tmp,"not $t%d $t%d",iRegistre,iRegistre3); printMips(tmp); } else if(n->u.opExp_.op == cond) { char tmp[256]; char faux[256]; char empile[256]; new_tag(faux); new_tag(empile); parcours_exp(n->u.opExp_.op1); sprintf(tmp, "$t%d", iRegistre2); depile(tmp); sprintf(tmp,"beq $t%d, $zero %s",iRegistre2, faux); printMips(tmp); parcours_exp(n->u.opExp_.op2); sprintf(tmp, "$t%d", iRegistre); depile(tmp); sprintf(tmp,"j %s", empile); printMips(tmp); sprintf(tmp, "%s :", faux); printMips(tmp); parcours_exp(n->u.opExp_.op3); sprintf(tmp, "$t%d", iRegistre); depile(tmp); sprintf(tmp, "%s :", empile); printMips(tmp); } sprintf(tmp, "$t%d", iRegistre); empile(tmp); }
/*****Programme principal*****/ int main() { file f; pile p; p = malloc (sizeof(struct e_pile)); //Allocation de mémoire pour la pile f = malloc (sizeof(struct e_file)); //Allocation de mémoire pour la file init_pile(&p); //Initialisation de p init_file(&f); //Initialisation de f /*Manipulation des file*/ printf("\nManipulation des files :\n\n"); /**Insertion dans la file**/ enfile(&f,5); //Insertions de la valeur 5 affiche_file (f); enfile(&f,4); //Insertions de la valeur 4 affiche_file (f); enfile(&f,3); //Insertions de la valeur 3 affiche_file (f); enfile(&f,2); //Insertions de la valeur 2 affiche_file (f); enfile(&f,1); //Insertions de la valeur 1 affiche_file (f); enfile(&f,0); //Insertions de la valeur 0 /**Partie suppression**/ defile(&f); //Suppressions dans la file affiche_file (f); defile(&f); //Suppressions dans la file affiche_file (f); defile(&f); //Suppressions dans la file affiche_file (f); defile(&f); //Suppressions dans la file affiche_file (f); /**Réinsertion dans la file**/ enfile(&f,6); //Insertions de la valeur 6 enfile(&f,7); //Insertions de la valeur 7 enfile(&f,8); //Insertions de la valeur 8 affiche_file (f); /*Manipulation des pile*/ printf("\nManipulation des piles :\n\n"); empile(&p,1); //Insertions de la valeur 0 affiche_pile(p); empile(&p,1); //Insertions de la valeur 1 affiche_pile(p); empile(&p,2); //Insertions de la valeur 2 affiche_pile(p); empile(&p,3); //Insertions de la valeur 3 affiche_pile(p); empile(&p,4); //Insertions de la valeur 4 affiche_pile(p); empile(&p,5); //Insertions de la valeur 5 affiche_pile(p); depile(&p); //Suppressions dans la pile affiche_pile (p); depile(&p); //Suppressions dans la pile affiche_pile (p); depile(&p); //Suppressions dans la pile affiche_pile (p); depile(&p); //Suppressions dans la pile affiche_pile (p); free (f); //Libération de mémoire pour la file f free (p); //Libération de mémoire pour la pile p return 0; }