2015-05-04 2 views
0

Я пытаюсь умножить многомерные массивы с помощью Threads. В то время как код выполняется должным образом, я получаю эту ошибку частностиКод ошибки сегментации (Core Dumped) показывает эту ошибку

#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 и многие другие ошибки ...