2017-05-23 5 views
0

Ich muss eine Funktion in C schreiben, die eine Matrix (src) und 2 ganzzahlige Werte (x, y) aufnimmt und dann eine Matrix ausgibt, die src x mal y enthält. Zum BeispielMatrixkopieren verursacht Segmentierungsfehler

3 5 
2 1 

mit (2,3) wird

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

ich die Struktur gegeben bin sein

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

und schrieb diese Funktion:

#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; 
} 

Dann habe ich einige gegeben Testprogramme: Die eine Hälfte funktioniert gut, die andere hart. Ich weiß sicher, dass die Tests korrekt sind, daher muss ein Problem in meinem Programm bestehen. Kannst du mir helfen, es zu finden?

+1

"Können Sie mir helfen, es zu finden?". Ja - indem Sie darauf hingewiesen werden, einen Debugger zu verwenden. Das ist der beste Weg, um solche Probleme zu beheben. – kaylum

+0

Dies ist unser zweiter Kurs, und wir haben bisher keine Debugger verwendet. Ich versuchte Valgrind, aber es war nicht sehr hilfreich – user2704673

+0

Debugger ist in der Regel nicht etwas, was sie lehren. Es ist ein Werkzeug, das Sie lernen, sich selbst zu benutzen. Und je früher du es lernst, desto leichter wird dein Leben in der Zukunft sein –

Antwort

4

die Bedingung in der Schleife ist

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

falsch. Es muss

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

Hinweis sein: Ich denke, meinen Sie

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