2017-03-22 18 views
0

例えば、出力が常に0であるような短い関数コードを変更すると、プログラムはcase0を変更します。quicksortarrの値は0になります。これはokeyですが、 )start shellSortarrも変更されましたquicksortarrも変更され、(shellsortarr)と同じになるため、この配列は比較しません。 私は間違いを指摘しています。関数ポインタ使用時の戻り値

私の2番目の質問(重要度の低い)私はこのコードを発見した100%のCPUを使用するための機能をOMPしたいが、私が推測され、これがループ

#pragma omp parallel for schedule(dynamic) 

omp_get_wtime(); 

のために前だけの仕事であるあなたは

をsuggesitonていますこのような
double sort(int *(*func)(int*, int), int *a, int len,int i) { 
     time_t end, begin; 
     int *b = malloc(len * sizeof *b); 
     if (!b) { perror("sort: malloc"); return 0; } 
     memcpy(b, a, len * sizeof b[0]);  

//for example b = 10,3,15,6,123 

     int *selectionSortarr; 
     int *quicksortarr; 

     switch(k%2) { 
     case 0: 
     begin = clock(); 

//b = 10,3,15,6,123 

     quicksortarr = func(b, len); 
//for example func(quicksort) is wrong and quicksortarr become 0,0,0,0,0 
     end = clock(); 
     k++; 
     break; 
     case 1:  
     begin = clock(); 
//b is again b = 10,3,15,6,123 
     shellSortarr = func(b, len); 
// after that shellsortarr and quicksortarr become 3,6,10,15,123 
//therefore compare function is print "File's sorted arrays are equal" 
     end = clock();  
     compare(quicksortarr,shellSortarr,len,i); 
     k=0;  
     break; 
     } 
     free(b); 
     return (double)(end - begin)/CLOCKS_PER_SEC; 
    } 

.Iコール機能:このような関数をソート

while (fscanf(f, "%d", &input) == 1) a[len++] = input; 
    quick[i] = sort(quickSort,  a, len,i); 
    shell[i] = sort(shellSort,  a, len,i); 

.MY:

int *shellSort(int x3[], int n){ 

    //sorting code 
    return x3; 
} 

.MYこのような機能を比較:あなたはquicksortarrのための余分なスペースを必要とする

void compare(int *arr1,int *arr2,int len,int y) { 
    int i=0; 
    int check=0; 
     for (i=0; i<len; i++){ 
     if (arr1[i] != arr2[i])  
       check++; 
       break; 

    } 
    if (check !=0) printf("%i . File's sorted arrays are not equal difference start at %i . variable in array\n",y,i); 
    else printf("%i. File's sorted arrays are equal\n",y); 
} 

答えて

1

をしてshellSortarr

double sort(void (*func)(int*, int), int *a, int len,int i) { 
    time_t end, begin; 
    int *b = malloc(len * sizeof *b); 
    if (!b) { perror("sort: malloc"); return 0; } 
    memcpy(b, a, len * sizeof b[0]);  
    switch(k%2) { 
    case 0: 
    begin = clock();  
    func(b, len); 
    end = clock(); 
    int *quicksortarr = malloc(len * sizeof *quicksortarr); 
    if (!quicksortarr) { perror("sort: malloc"); return 0; } 
    memcpy(quicksortarr, b, len * sizeof quicksortarr[0]); 
    k++; 
    break; 
    case 1:  
    begin = clock(); 
    func(b, len); 
    int *shellSortarr = malloc(len * sizeof *shellSortarr); 
    if (!shellSortarr) { perror("sort: malloc"); return 0; } 
    memcpy(shellSortarr, b, len * sizeof shellSortarr[0]); 
    end = clock(); 
    k++; 
    break; 

    compare(quicksortarr,shellSortarr,len,i); 
    k=0;  
    break; 
    } 

    free(b); 
    return (double)(end - begin)/CLOCKS_PER_SEC; 
} 

そうもう返す必要はありません。あなたのためのあなたの並べ替えコードの使用は<omp.h>ライブラリに追加することができた場合

void shellSort(int x3[], int n){ 

    //sorting code 
     } 

#pragma omp parallel for schedule(dynamic)はforループを使用しています