2017-02-22 31 views
-1

Уступка просит нас закончить код, который добавляет матрицы, и я не слишком уверен, что я должен возвращать. Он говорит мне, что есть ошибка времени выполнения , но я не знаю, как это исправить. Это будет из-за довольно скоро, поэтому кто-то, пожалуйста, помогите мне!Добавление кода матрицы в C HELP! Я не знаю, что не так

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

int** getMatrix(int n, int m); 
int** allocateMatrix(int n, int m); 
int** addMatrices(int** A, int** B, int n, int m); 
void printMatrix(int** A, int n, int m); 
void deallocateMatrix(int** A, int n); 


// This program reads in two n by m matrices A and B and 
// prints their sum C = A + B 
// 
// This function is complete, you do not need to modify it 
// for your homework 
int main() { 
    int n = 0, m = 0; 
    printf("Enter the number of rows and columns: "); 
    scanf("%d %d", &n, &m); 
    assert(n > 0 && m > 0); 
    printf("Enter matrix A:\n"); 
    int** A = getMatrix(n, m); 
    printf("Enter matrix B:\n"); 
    int** B = getMatrix(n, m); 
    int** C = addMatrices(A, B, n, m); 
    printf("A + B = \n"); 
    printMatrix(C, n, m); 
    deallocateMatrix(A, n); 
    deallocateMatrix(B, n); 
    deallocateMatrix(C, n); 
} 

// Creates a new n by m matrix whose elements are read from stdin 
// 
// This function is complete, you do not need to modify it 
// for your homework 
int** getMatrix(int n, int m) { 
int** M = allocateMatrix(n, m); 
int i, j; 

for (i = 0; i < n; i++) { 
    printf("Input row %d elements, separated by spaces: ", i); 
    for (j = 0; j < m; j++) { 
     scanf("%d", &M[i][j]); 
    } 
} 
return M; 
} 

// Allocates space for an n by m matrix of ints 
// and returns the result 
int** allocateMatrix(int n, int m) { 
// Homework TODO: Implement this function 
int i, j; 
int** L; 

L = (int**)malloc(sizeof(int) * n); 
for(i = 0; i < n; i++) { 
    for(j = 0; j < m; j++){ 
     L[i] = (int*) malloc(sizeof(int) * m); 
    } 
} 
} 

// Adds two matrices together and returns the result 
int** addMatrices(int** A, int** B, int n, int m) { 
// Homework TODO: Implement this function 
int j, i; 
int** C; 

for(i = 0; i < n; i++) { 
    for(j = 0; j < m; j++) { 
     C[i][j] = A[i][j] + B[i][j]; 
    } 
} 

} 

// Prints out the entries of the matrix 
void printMatrix(int** A, int n, int m) { 
// Homework TODO: Implement this function 
int i, j; 
int** C; 

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

// Deallocates space used by the matrix 
void deallocateMatrix(int** A, int n) { 
int i; 

for (i = 0; i < n; i++) { 
    free(A[i]); 
} 
free(A); 
} 
+1

Не относится к вашим проблемам, но, пожалуйста, прочитайте эту дискуссию (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) о внесении результата ' malloc'. –

+0

Хорошо, я буду. Спасибо! – Sara

ответ

1

Несколько вещей:

  • В allocateMatrix вы выделить пространство для nцелых, не указатели для целых чисел.

  • Во многих функциях вы используете неинициализированный указатель C.

  • Во многих функциях, объявленных для возврата чего-либо, вы ничего не возвращаете.

Эти вещи, и, возможно, другие, приводит к непредсказуемому поведению .

+0

Я только недавно научился распределять пробелы, я действительно не понимаю, что я должен делать/использовать malloc. Также не я инициализирую их с помощью «int ** C?»? – Sara

+0

Должен ли я вернуться как: «return C **;»? и "return L **;"? – Sara

+0

@Sara Указатель должен указывать где-то, чтобы он был действительным. Вы должны инициализировать его или назначить ему. И да, вы должны это сделать, например. 'return L;' в вашей функции allocateMatrix. –

0

Расширение немного на @Someprogrammerdude's answer

  • Вы должны быть выделение места для n целочисленных указателей (int* с), а затем в каждой строке, выделить память для m целых чисел (int с). Таким образом, использование

    // Allocates space for an n by m matrix of ints 
    // and returns the result 
    int** allocateMatrix(int n, int m) { 
        int i, j; 
        int** L; 
    
        L = malloc(sizeof(int*) * n);  /* Make `n` rows */ 
        for(i = 0; i < n; i++) {   /* For each row, */ 
         L[i] = malloc(sizeof(int) * m); /* Make room for `m` ints */ 
        } 
    
        return L; /* Return the allocated variable. See 3rd point ↓ */ 
    } 
    

    Я снял слепки, потому что they aren't recommended. Я оставляю ошибку malloc до вас.

  • Вы используете C неинициализированный: int** C;. Выделяет память для него так же, как вы делали для A и B:

    int** C = allocateMatrix(n, m); 
    
  • Вы забыли вернуть переменные из функций. Добавить return L; и return C; в конце функций allocateMatrix и addMatrices соответственно.