2013-01-02 2 views
-1

2 개의 파일 (mat1.txt 및 mat2.txt)을 가진 행렬 곱셈 프로그램을 구현하려고합니다. 결과를 파일에로드하기로 결정했지만 프로그램을 실행할 때 ./m mat1.txt mat2.txt 20 20 20 20 (파일 이름과 행 수 및 모든 행렬 수), 오류가 발생합니다. 세그먼트 오류 (핵심 덤프). 파일 결과 작성 또는 쓰기에 문제가 있습니다. 도와 주시겠습니까? 코드는 아래에 제시되어메모리에서 결과를 파일에 저장하는 방법 * .txt

/* Memory management */ 
mem_mat1 = (int *) malloc(M1 * N1 * sizeof(int)); 
if (mem_mat1 == NULL) { 
    fprintf(stderr,"Error: malloc mem_mat1\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

mat1 = (int **) malloc(M1 *sizeof(int *)); 
if (mat1 == NULL) { 
    fprintf(stderr,"Error: malloc mat1\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

for (i=0; i<M1; i++) { 
    mat1[i] = mem_mat1+(i*N1); 
} 

mem_mat2 = (int *) malloc(M2 * N2 * sizeof(int)); 
if (mem_mat2 == NULL) { 
    fprintf(stderr,"Error: mem_mat2\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

mat2 = (int **) malloc(M2 *sizeof(int *)); 
if (mat2 == NULL) { 
    fprintf(stderr,"Error: malloc mat2\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

for (i=0; i<M2; i++) { 
    mat2[i] = mem_mat2+(i*N2); 
} 

mem_matR = (int *) malloc(M1 * N2 * sizeof(int)); 
if (mem_matR == NULL) { 
    fprintf(stderr,"Error: malloc mem_matR\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

matR = (int **) malloc(M1 *sizeof(int *)); 
if (matR == NULL) { 
    fprintf(stderr,"Error: malloc matR\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

for (i=0; i<M1; i++) { 
    matR[i] = mem_matR+(i*N2); 
} 

/* SEQUENTIAL PRODUCT MATRIX */ 

/*Open and Read file 1: mat1.txt*/ 
fmat1 = fopen(argv[1],"rb"); 
fread(mat1, M1 *sizeof(int *), N1 *sizeof(int *), fmat1); 

/*Open and Read file 2: mat2.txt*/ 
fmat2 = fopen(argv[2],"rb"); 
fread(mat2, M2 *sizeof(int *), N2 *sizeof(int *), fmat2); 

/*Create a file to write the result fmatR.txt*/ 
fdR = creat("matR.txt", "w"); 
if (fdR < 0) { 
    fprintf(stderr, "Error create result file\n"); 
    return(2); 
} 

for (i=0;i<M1;i++) { 
    for (j=0;j<N2;j++) { 
     sum=0; 
     for (k=0;k<N1;k++) { 
      sum+=mat1[i][k]*mat2[k][j]; 
      matR[i][j]=sum; 
     } 
    } 
} 
write(fdR, &matR, M1*N2 *sizeof(int)); 
+0

? 어떤 단계를 좁히거나 격리 시키려고 했습니까? – abelenky

+0

먼저 'malloc()'에서 캐스트를 제거하십시오 .. – Jack

+2

SO에 오신 것을 환영합니다. [FAQ (http://stackoverflow.com/faq)를 읽어보십시오. 이것은 디버깅 서비스가 아닙니다. 디버깅하려면 디버거를 사용하십시오. – netcoder

답변

1

난 당신이 MATR 또한 마지막 줄이 잘못 ... 임의 메모리를 쓰는 일부 혼란을하고있는 것 같아요.

수정 :

1) 거리 mem_matR하고

2)에 관련된 모든 코드 MATR 행렬의 첫 번째 요소에 대한 포인터 (퍼) 할 수 있도록하고하게 걸릴 이는 물품이 방법

MATR 끝에 for 루프에서 M1xN2 요소

matR = (int *) malloc(M1 * N2 * sizeof(int)); 

3)의 간단한 한 차원 배열 될

matR[j+i*N2]=sum; 

4) 마지막으로 데이터를 이런 식으로 저장

write(fdR, (void *) matR, M1*N2 *sizeof(int)); 

-

또한 나는이)

fread(mat1, M1 *sizeof(int *), N1 *sizeof(int *), fmat1); 
을 문제가 발생하지 않습니다 경우에도 FREAD 호출 (잘못된 생각

정수형 M1 x N1 요소의 마티 have이 있다고 안다면. 그래서 ... 같은

fread(mat1, sizeof(int *), M1 * N1, fmat1); 

가 SECON 호출에 적용되는 SEG-오류가

+0

삽을 가져 오는 중 +1 ... – Potatoswatter

관련 문제