2017-05-23 3 views
0

행렬 (src)과 2 개의 정수 값 (x, y)을 취하고 src x를 y 번 포함하는 행렬을 제공하는 C 함수를 작성해야한다. 예 행렬 복사로 세분화 오류가 발생한다.

(2,3) I의 구조를

struct Mat { 
    int cols; // number of columns 
    int rows; // number of rows 
    int** row_ptrs; // pointer to rows (the actual matrix) 
} Mat; 

를 부여하고,이 함수 작성하고

3 5 3 5  
2 1 2 1  
3 5 3 5  
2 1 2 1  
3 5 3 5  
2 1 2 1 

될 예정으로

3 5 
2 1 

:

#include "exercise_1.h" 
#include <stdlib.h> 

Mat* matrixRepeat(Mat* src, int num_row_blocks, int num_col_blocks) 
{ 
    Mat *newMat = malloc(sizeof(Mat)); 
    newMat->rows = src->rows * num_row_blocks; 
    newMat->cols = src->cols * num_col_blocks; 

    newMat->row_ptrs = calloc(newMat->rows, sizeof(int*)); 

    for(int i = 0; i < newMat->cols; i++) 
    newMat->row_ptrs[i] = calloc(newMat->cols, sizeof(int)); 


    for(int i = 0; i < newMat->rows; i++) 
    for(int j = 0; j< newMat->cols; j++) 
     newMat->row_ptrs[i][j] = src->row_ptrs[i%src->rows][j%src->cols]; 

    return newMat; 
} 

그러면 나는 어떤 사람들을 받았다. 테스트 프로그램 : 그들 중 절반은 잘 작동하고, 다른 것은 나에게 segfault를줍니다. 테스트가 정확하다는 것을 알고 있으므로 내 프로그램에 문제가 있어야합니다. 찾는데 도와 줄 수 있니?

+1

"당신이 나를 찾을 도와 드릴까요?"이

for(int i = 0; i < newMat->rows; i++) ^^^^^^^^^^^ newMat->row_ptrs[i] = calloc(newMat->cols, sizeof(int)); 

주의해야합니다. 예 - 디버거를 사용하도록 조언합니다. 그러한 문제를 디버깅하는 가장 좋은 방법입니다. – kaylum

+0

이것은 두 번째 코스이며 지금까지는 디버거를 사용하지 않았습니다. 나는 valgrind를 시도했지만 매우 도움이되지 못했습니다. – user2704673

+0

디버거는 대개 그들이 가르치는 것이 아닙니다. 그것은 당신이 스스로를 배우는 도구입니다. 그리고 당신의 인생이 더 쉬워 질수록 더 빨리 배울 것입니다. –

답변

4

루프

for(int i = 0; i < newMat->cols; i++) 
        ^^^^^^^^^^^ 
    newMat->row_ptrs[i] = calloc(newMat->cols, sizeof(int)); 

의 조건은 잘못된 것입니다. 난 당신 말은 생각

typedef struct Mat { 
^^^^^^^ 
    int cols; // number of columns 
    int rows; // number of rows 
    int** row_ptrs; // pointer to rows (the actual matrix) 
} Mat;