2015-05-04 101 views
0

我一直在嘗試使用線程乘以多維數組。雖然代碼執行得當,我不斷收到此特定錯誤分段錯誤(核心轉儲)代碼顯示此錯誤

#include<stdio.h> 
#include<stdlib.h> 
#include<pthread.h> 
#include<malloc.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<errno.h> 
#define R_FLAGS O_RDONLY 

int arraySize; 
int **oarray; 
int **resultarray; /*the two multidimensional arrays declared*/ 

void *multiply(void *arg); 
/*The function used to showcase Mutliplication*/ 

int** DynamicAllocate(int Size) { 
    int i; 
    int **array; 
    array = malloc(Size * sizeof(int *)); 
    if(array = NULL){ 
     fprintf(stderr,"No Memory\n"); 
     return; 
    } 

    for(i=0;i<Size;i++){ 
     array[i] = malloc(Size * sizeof(int)); 
     /*using the same no of rows for the columns as instructed*/ 
     if(array[i] == NULL){ 
      fprintf(stderr,"No Memory\n"); 
      return; 
     } 
    } 

    return array; 
} 

void *multiply(void *arg) { 
    int i,j,*k,v,Sum=0; 

    k=(int *)arg; 
    v=(int)k; 

    for(i=0;i<arraySize;i++){ 
     for(j=0;j<arraySize;j++){ 
      Sum= Sum + oarray[v][j]*oarray[j][i]; 
     }  

     Sum = resultarray[v][i]; 
     Sum=0; 
    } 
} 

int main(int argc, char *argv[]){ 
    int error,*join; 
    char nrows,*intarray; 
    int row,i,j,value=0; 
    pthread_t tid; 

    if((error = open("File",O_RDONLY))==-1){ 
     perror("Unable to Open File"); 
    } 

    read(error,&nrows,1); 
    row = atoi(&nrows); 
    arraySize = row; 
    oarray = DynamicAllocate(row); 
    resultarray = DynamicAllocate(row); 

    intarray = malloc(1024); /*read until given file ends*/ 
    read(error,intarray,1024); 

    printf("****Assignment # 3****\n"); 
    printf("****By:Hammad Faisal****\n"); 
    printf("****DDP-SP12-BCS-026****\n\n"); 

    /*temporary array that is being used for storage and multiplication*/ 

    for(i=0;i<row;i++){ 
     for(j=0;j<row;j++){ 
      oarray[i][j]=atoi(&intarray[value]); 
      value+=2; 
     } 
    } 

    /*using for loop to attach thread to each row allocated*/ 

    for(i=0;i<row;i++){ 
     join = (int *)i; 
     pthread_create(&tid,NULL,multiply,join); 
     pthread_join(tid,NULL); 
    } 

    /*display the resultant matrix*/ 

    for(i=0;i<row;i++){ 
     for(j=0;j<row;j++){ 
      printf("%d\t",resultarray[i][j]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

上面提到的代碼完全編譯在Ubuntu,但分段故障的問題。每次我嘗試執行代碼時,它都會一遍又一遍地提供相同的錯誤,但從我讀過的代碼中應該可以正常執行。 我是新的Linux,我非常感謝任何幫助。

+2

你用什麼來編譯代碼? – bentank

+0

我做了一個make文件,以便代碼可以正確執行。 –

+1

在我看來,這裏有一些關於類型轉換和解引用ptrs的錯誤。請仔細閱讀你的代碼,並確保所有類型轉換,賦值和解除引用/非解除引用都有意義。 – bentank

回答

0

首先,您使用=進行比較,如:

if(array = NULL){ 
    fprintf(stderr,"No Memory\n"); 
    return; 
} 

它應該是:

if(array == NULL){ 
    fprintf(stderr,"No Memory\n"); 
    return; 
} 

而且,這是錯誤的:

int i,j,*k,v,Sum=0; 

k=(int *)arg; 
v=(int)k; 

v是不是像k和許多其他錯誤的指針...