Advertisement
Guest User

Untitled

a guest
May 6th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>
  7. #include <sys/ipc.h>
  8. #include <sys/shm.h>
  9.  
  10.  
  11. /*
  12. * Funzione "merge" che ha in ingresso gli indici di un array con le rispettive lunghezze
  13. * così da fingere due array differenti.
  14. * Esegue un riordinamento tra le celle
  15. */
  16. void merge(float *left, int llength, float *right, int rlength){
  17.  
  18. //memoria temporanea allocata per gli array
  19. float *ltmp = (float *) malloc(llength * sizeof(float));
  20. float *rtmp = (float *) malloc(rlength * sizeof(float));
  21.  
  22. //puntatori in memoria temporanea ad elementi che verranno ordinati
  23. float *ll = ltmp;
  24. float *rr = rtmp;
  25.  
  26. float *result = left;
  27.  
  28. //Copia dei riferimenti degli array nella locazione temporanea
  29. memcpy(ltmp, left, llength * sizeof(float));
  30. memcpy(rtmp, right, rlength * sizeof(float));
  31.  
  32.  
  33. while (llength > 0 && rlength > 0){
  34.  
  35. //merge del primo elemento di sinistra nel array principale
  36. //se è inferiore o uguale dell'elemento a destra
  37. if (*ll <= *rr) {
  38.  
  39. *result = *ll;
  40. ++ll;
  41. --llength;
  42. }
  43.  
  44. //altrimenti merge del primo elemento da destra nel array principale
  45. //se è più piccolo dell'elemento a sinistra
  46. else {
  47.  
  48. *result = *rr;
  49. ++rr;
  50. --rlength;
  51. }
  52.  
  53. ++result;//incremento indice
  54. }
  55.  
  56. //tutti gli elementi sia di sinistra che di destra del array temporaneo
  57. //sono stati inseriti ordinati nel array principale
  58.  
  59. //vengono ora re-immesso nel array principale il resto del array temporaneo sinistro e destro
  60. if (llength > 0)
  61. while (llength > 0) {
  62. *result = *ll;
  63. ++result;
  64. ++ll;
  65. --llength;
  66. }
  67. else
  68. while (rlength > 0) {
  69. *result = *rr;
  70. ++result;
  71. ++rr;
  72. --rlength;
  73. }
  74.  
  75. //rilascio memoria usata per array temporanei
  76. free(ltmp);
  77. free(rtmp);
  78. }
  79.  
  80.  
  81. /*
  82. * Funzione "mergeSort" che ha in ingresso un array con la rispettiva lunghezza
  83. * Genera due processi, ognuno dei quali invoca questa stessa funzione "mergeSort"
  84. * sulla metà del array a lui assegnata.
  85. * Infine invoca la funzione "merge".
  86. */
  87. void mergeSort(float *arr, int l){
  88.  
  89. //check lunghezza array per uscita ricorsione
  90. if(l < 2) return;
  91.  
  92. int middle = l/2; //indice metà array
  93. int llength = l-middle; //lunghezza totale array a cui sottraggo l'indice mediano
  94. int status; //per gestire le waitpid()
  95.  
  96. //pipe
  97. int pipeSx[2]; //pipe nella quale il figlio sinistro legge e scrive, assieme al padre
  98. pipe(pipeSx);
  99. int pipeDx[2]; //pipe nella quale il figlio destro legge e scrive, assieme al padre
  100. pipe(pipeDx);
  101.  
  102. int lchild; //intero contenente il file descriptor del figlio sinistro
  103. int rchild; //intero contenente il file descriptor del figlio destro
  104.  
  105.  
  106. /*
  107. * inizio figlio SINISTRO
  108. */
  109.  
  110. lchild = fork(); //creazione figlio
  111.  
  112. //check corretta creazione figlio
  113. if (lchild < 0) {
  114. perror("fork");
  115. exit(1);
  116. }
  117. if(lchild == 0){
  118.  
  119. float n; //intero di supporto per lettura e scrittura da pipe
  120. float *sx; //riferimento per array
  121.  
  122. //allocazione memoria per contenere l'array usato dal figlio
  123. sx= malloc(llength * sizeof(float));
  124.  
  125. //ciclo di lettura pipe, precedentemente scritta dal padre, con salvataggio in array
  126. for(int i = 0; i<llength; i++){
  127. read(pipeSx[0], &n, sizeof(float));
  128. sx[i] = n;
  129. }
  130.  
  131. //esecuzione mergeSort
  132. mergeSort(sx, llength);
  133.  
  134. //ciclo di scrittura pipe, che verrà letta dal padre
  135. for(int i = 0; i<llength; i++){
  136. n = sx[i];
  137. write(pipeSx[1], &n, sizeof(int));
  138. }
  139.  
  140. free(sx); //libero memoria allocata
  141.  
  142. exit(0);
  143. }
  144. /*
  145. * fine figlio SINISTRO
  146. */
  147.  
  148. /*
  149. * codice del padre dopo aver creato il figlio sinistro
  150. */
  151. else{
  152.  
  153. /*
  154. * inizio figlio DESTRO
  155. */
  156. rchild = fork(); //creazione figlio
  157.  
  158. //check corretta creazione figlio
  159. if (lchild < 0) {
  160. perror("fork");
  161. exit(1);
  162. }
  163.  
  164. if(rchild == 0){
  165.  
  166. float n; //intero di supporto per lettura e scrittura da pipe
  167. float *dx; //riferimento per array
  168.  
  169. //allocazione memoria per contenere l'array usato dal figlio
  170. dx= malloc(middle * sizeof(float));
  171.  
  172. //ciclo di lettura pipe, precedentemente scritta dal padre, con salvataggio in array
  173. for(int i = 0; i<middle; i++){
  174. read(pipeDx[0], &n, sizeof(float));
  175. dx[i] = n;
  176. }
  177.  
  178. //esecuzione mergeSort
  179. mergeSort(dx, middle);
  180.  
  181. //ciclo di scrittura pipe, che verrà letta dal padre
  182. for(int i = 0; i<middle; i++){
  183. n = dx[i];
  184. write(pipeDx[1], &n, sizeof(float));
  185. }
  186.  
  187. free(dx); //libero memoria allocata
  188. exit(0);
  189. }
  190. /*
  191. * fine figlio DESTRO
  192. */
  193.  
  194. /*
  195. * continuazione del padre
  196. */
  197. //riferimenti array per contenere dati letti/scritti pipe
  198. float *rL, *rR;
  199. rL= arr;
  200. rR= arr+llength;
  201.  
  202. float n,t; //interi di supporto per lettura e scrittura da pipe
  203.  
  204. //cicli per scrivere l'array sulle pipe dei figli
  205. for(int i = 0; i<llength; i++){
  206. n = rL[i];
  207. write(pipeSx[1], &n, sizeof(float));
  208. }
  209. for(int i = 0; i<middle; i++){
  210. t = rR[i];
  211. write(pipeDx[1], &t, sizeof(float));
  212. }
  213.  
  214. //attesa della terminazione dei figli
  215. waitpid(lchild,&status,0);
  216. waitpid(rchild,&status,0);
  217.  
  218. //cicli per leggere le pipe dai figli
  219. for(int i = 0; i<llength; i++){
  220. read(pipeSx[0], &n, sizeof(float));
  221. rL[i] = n;
  222. }
  223. for(int i = 0; i<middle; i++){
  224. read(pipeDx[0], &t, sizeof(float));
  225. rR[i] = t;
  226. }
  227.  
  228. //richiamo funzione per riordinare l'array
  229. //con i rispettivi indici passati per argomento
  230. merge(rL, llength, rR, middle);
  231. }
  232. }
  233.  
  234.  
  235. int main (int argc, char *argv[]) {
  236.  
  237. //check argomenti da prompt
  238. if (argc != 5) {
  239. printf("usage: %s <filename>\n", argv[0]);
  240. return 1;
  241. }
  242.  
  243. //riferimenti per file.txt di input e output
  244. FILE *file_in, *file_out;
  245.  
  246.  
  247. //apertura stream input con check a seguire
  248. if(atoi(argv[2]) ==1 && atoi(argv[4]) == 2){
  249. file_in = fopen(argv[1], "r");
  250. if(file_in == NULL){
  251. printf("Errore apertura file\n");
  252. return 0;
  253. }
  254. }
  255. else if(atoi(argv[2]) == 2 && atoi(argv[4]) == 1){
  256. file_in = fopen(argv[3], "r");
  257. if(file_in == NULL){
  258. printf("Errore apertura file\n");
  259. return 0;
  260. }
  261. }
  262.  
  263. float *array = NULL; //array su cui inserire i dati input
  264. int length = 0; //lungheza array
  265. char data_in[1000]; //intero di supporto per inserimento da file.txt ad array
  266.  
  267. //importazione dati da input
  268. while (fscanf(file_in, "%s", &data_in) != EOF) {
  269. float supporto = atof(data_in);
  270. if(supporto==0){ }
  271. else{
  272. ++length;
  273. array = (float *) realloc(array, length * sizeof(float));
  274. array[length - 1] = supporto;
  275. }
  276.  
  277. }
  278.  
  279. fclose(file_in); //chiusura file input
  280.  
  281. printf("Elementi letti dall'input: %d\n", length);
  282.  
  283.  
  284. mergeSort(array, length);
  285.  
  286. printf("Fine mergeSort\n");
  287.  
  288. //scrivo l'array post mergesort su file
  289. if(atoi(argv[2]) ==2 && atoi(argv[4]) == 1){
  290. file_out = fopen(argv[1], "w");
  291. if(file_out == NULL){
  292. printf("Errore apertura file\n");
  293. return 0;
  294. }
  295. }
  296. else if(atoi(argv[2]) == 1 && atoi(argv[4]) == 2){
  297. file_out = fopen(argv[3], "w");
  298. if(file_out == NULL){
  299. printf("Errore apertura file\n");
  300. return 0;
  301. }
  302. }
  303.  
  304. for(int i=0; i< length; i++){
  305. int verifica = array[i];
  306. if(verifica == array[i]){
  307. fprintf(file_out, "%i\n", (int)array[i]);
  308. }
  309. else{
  310. fprintf(file_out, "%1.3f\n", array[i]);
  311. }
  312. }
  313.  
  314. printf("\n");
  315. fclose(file_out);
  316. free(array); //liberazione array
  317.  
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement