2013-09-30 148 views
1

我想洗牌二維數組的至少一個索引,以便我可以總結一個隨機的數組部分。程序工作正常,直到我嘗試調用shuffle函數並以下面兩種方式中的一種產生結果:如果我調用函數:shuffle(a [i],N),那麼我會得到一個「浮點異常」錯誤,即使我似乎無法通過0找到任何分區,或者如果我調用該函數:shuffle(* a,N);;我將得到分段錯誤。我仍然在努力學習指針如何工作..任何人都可以幫忙嗎?謝謝!二維陣列洗牌指針幫助

隨機功能:

void shuffle(double *a, int i) 
{ 
    int temp, randomNum, N; 
    for(i=N; i>1; N--) 
    { 
     randomNum = rand() % N; 
     temp = a[randomNum]; //create temp array 
     a[randomNum] = a[i];  
     a[i] = temp; 
     } 
} 

主程序:

int main() 
{ 

    srand(time(NULL)); 

    int i,j; 
    int M = 5; 
    int N = 4; 
    double sum = 0.; 

    double **a; 
    a = malloc(M * sizeof(double *)); 

    if(a == NULL) printf("Failure to allocate memory.\n"); 

    clock_t start = clock(); 
    for(i=1; i<M; i++) 
    { 
     a[i] = malloc(M * sizeof(double)); 
     if(a[i] == NULL) 
    { 
     printf("Failed to allocated memory for a[%d].\n", i); 
     exit(0); 
    } 
    } 

    for(i=1; i<M; i++) 
    { 
     for(j=1; j<M; j++) 
    { 
     a[i][j] = 1.0/(i+j); 
     printf("a[%d][%d]=%lf\n", i, j, a[i][j]); 
     shuffle(a[i], N); 
     //sum = sum + a[i][j]; 
     //printf("shuffleda[%d][%d] and sum = %lf\n", i, j, sum); 
    } 
    } 

    clock_t end = clock(); 
    float seconds = (end - start)/(float) CLOCKS_PER_SEC; 

    printf("%lf \n", sum); 

    return(0); 
} 

回答

0

,我們在您void shuffle功能一對夫婦的錯誤。我做了一些更正功能,它(使用英特爾的C編譯器)爲我工作:

void shuffle(double a[], int N){ 
    double temp; 
    int randomNum, i; 
    for(i=N; i>1; i--){  
     randomNum = rand() % N; 
     temp = a[randomNum]; //create temp array 
     a[randomNum] = a[i];  
     a[i] = temp; 
    } 
} 

隨着在main通話shuffle(a[i], N);temp應該是雙精度,而不是int。浮點異常是因爲當N=0取模時。

希望這會有所幫助。