Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <ctype.h>
  5. #include <cilk/cilk.h>
  6.  
  7. int* filter(int* arr, int* size, int (*fcn)(int));
  8. int isOdd(int a){
  9. return a%2;
  10. }
  11. void setValues(int* arr, int size, int max){
  12. time_t t;
  13. srand ((unsigned) time(&t));
  14. for(int i = 0; i < size; i++)
  15. arr[i] = rand()%max;
  16. }
  17. void print1DimArray(int* arr, int size){
  18. if(size == 0){
  19. printf("empty\n");
  20. return;
  21. }
  22. for (int i = 0; i < size-1; i++)
  23. printf("%d, ", arr[i]);
  24. printf("%d\n", arr[size-1]);
  25. }
  26.  
  27. int main(){
  28. int size = 10;
  29. int* array = (int*) malloc(sizeof(int) * size);
  30.  
  31. setValues(array,size,10); //sets values of array to random values with max of 10
  32.  
  33. print1DimArray(array,size);
  34. int newSize = size;
  35. int* filteredArray = filter(array, &newSize, isOdd);
  36. print1DimArray(filteredArray,newSize);
  37.  
  38. free(filteredArray);
  39. free(array);
  40. return 0;
  41. }
  42.  
  43. void fill(int* dest, int* source, int offset, int size){
  44. cilk_for(int i = 0; i < size; i++){
  45. dest[offset+i] = source[i];
  46. }
  47. }
  48.  
  49. void filterHelper(int* arr, int *size, int (*fcn)(int), int* returnArray){
  50. if(*size == 1){
  51. if((*fcn)(*arr) == 1)
  52. returnArray[0] = *arr;
  53. else
  54. *size = 0;
  55. return;
  56. }
  57.  
  58. int sizeOne = *size/2;
  59. int sizeTwo = *size/2 + (*size)%2;
  60.  
  61. int* a1 = malloc(sizeof(int*)*sizeOne);
  62. int* a2 = malloc(sizeof(int*)*sizeTwo);
  63.  
  64. cilk_spawn filterHelper(arr, &sizeOne, fcn, a1);
  65. filterHelper(&arr[*size/2], &sizeTwo, fcn, a2);
  66.  
  67. *size = sizeOne + sizeTwo;
  68.  
  69. cilk_spawn fill(returnArray, a1, 0, sizeOne);
  70. fill(returnArray, a2, sizeOne, sizeTwo);
  71.  
  72. free(a1); free(a2);
  73. }
  74.  
  75.  
  76. int* filter(int* arr, int *size, int (*fcn)(int)){
  77. int* newArr = (int*) malloc((*size)*sizeof(int));
  78. filterHelper(arr, size, fcn, newArr);
  79. newArr = (int*) realloc(newArr, sizeof(int)*(*size));
  80. return newArr;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement