Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <ctype.h>
- #include <cilk/cilk.h>
- int* filter(int* arr, int* size, int (*fcn)(int));
- int isOdd(int a){
- return a%2;
- }
- void setValues(int* arr, int size, int max){
- time_t t;
- srand ((unsigned) time(&t));
- for(int i = 0; i < size; i++)
- arr[i] = rand()%max;
- }
- void print1DimArray(int* arr, int size){
- if(size == 0){
- printf("empty\n");
- return;
- }
- for (int i = 0; i < size-1; i++)
- printf("%d, ", arr[i]);
- printf("%d\n", arr[size-1]);
- }
- int main(){
- int size = 10;
- int* array = (int*) malloc(sizeof(int) * size);
- setValues(array,size,10); //sets values of array to random values with max of 10
- print1DimArray(array,size);
- int newSize = size;
- int* filteredArray = filter(array, &newSize, isOdd);
- print1DimArray(filteredArray,newSize);
- free(filteredArray);
- free(array);
- return 0;
- }
- void fill(int* dest, int* source, int offset, int size){
- cilk_for(int i = 0; i < size; i++){
- dest[offset+i] = source[i];
- }
- }
- void filterHelper(int* arr, int *size, int (*fcn)(int), int* returnArray){
- if(*size == 1){
- if((*fcn)(*arr) == 1)
- returnArray[0] = *arr;
- else
- *size = 0;
- return;
- }
- int sizeOne = *size/2;
- int sizeTwo = *size/2 + (*size)%2;
- int* a1 = malloc(sizeof(int*)*sizeOne);
- int* a2 = malloc(sizeof(int*)*sizeTwo);
- cilk_spawn filterHelper(arr, &sizeOne, fcn, a1);
- filterHelper(&arr[*size/2], &sizeTwo, fcn, a2);
- *size = sizeOne + sizeTwo;
- cilk_spawn fill(returnArray, a1, 0, sizeOne);
- fill(returnArray, a2, sizeOne, sizeTwo);
- free(a1); free(a2);
- }
- int* filter(int* arr, int *size, int (*fcn)(int)){
- int* newArr = (int*) malloc((*size)*sizeof(int));
- filterHelper(arr, size, fcn, newArr);
- newArr = (int*) realloc(newArr, sizeof(int)*(*size));
- return newArr;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement