2015-11-21 4 views
4

Мне нужно реализовать процедуру транспонирования матрицы в C++. Проблема заключается в подписи, то функция должна быть вызвана следующим образом:Хранение памяти для переноса стека матрицы, C++

transpose(in_mat[0][0], n, m, out_mat[0][0]) 

, где п и т являются размеры. Все значения - это удвоения, как матрицы, так и размеры.

Поскольку код сгенерирован автоматически, я не могу это исправить.

Мой обходной путь выглядит следующим образом:

void transpose(double& in_mat, const double _n, const double _m, double& out_mat) 
{ 
    int n = _n, m = _m; 
    double* in_pointer= &in_mat; 
    double* out_pointer= &out_mat; 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j)); 
     } 
    } 
} 

Он отлично работает. Я построил тестовый корпус с двумя матрицами различной ширины и высоты. Один заполнен случайными числами, другой заполнен нулями. Затем вызывается процедура транспонирования и сравниваются две матрицы. Функциональность правильная.

Но он развращает стек. При запуске в Visual Studio 2015 появляется предупреждение

Ошибка проверки времени выполнения # 2 - Урон вокруг переменной 'in_mat' был поврежден.

Что я сделал не так? Почему стек поврежден? Код после вызова транспонирования работает правильно.

EDIT:

Вот полная установка:

#include <random> 
#include <iostream> 

void transpose(double& in_mat, const double _n, const double _m, double& out_mat) 
{ 
    int n = _n, m = _m; 
    double* in_pointer = &in_mat; 
    double* out_pointer = &out_mat; 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j)); 
     } 
    } 
} 


int main() 
{ 

    double in_mat[5][4]; 
    double out_mat[4][5];// assign matrix 

    for (int i = 0; i < 4; i++) { 
     for (int j = 0; j < 5; j++) { 
      in_mat[i][j] = std::rand(); 
      out_mat[j][i] = 0; 
     } 
    } 

    double n = 5; 
    double m = 4; 

    transpose(in_mat[0][0], n, m, out_mat[0][0]); 

    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      if (in_mat[i][j] - out_mat[j][i]>0.0001) { 
       std::cout << "code is broken" << std::endl; //never reached 
      } 
     } 
    } 
    std::cout << "finished" << std::endl; 
} 
+3

C не имеют ссылки. Если вы программируете на C++, укажите C++, а не C. – fuz

+0

Вы правы. Я починил это. – lhk

+0

Насколько велики эти матрицы? Рассматривали ли вы их распределение на куче? – simpel01

ответ

7

Ваши индексы (или пределы контура) были обращены назад, где инициализируется матрицы.

Вы

double in_mat[5][4]; 
double out_mat[4][5];// assign matrix 

for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 5; j++) { 
     in_mat[i][j] = std::rand(); 
     out_mat[j][i] = 0; 
    } 
} 

Когда j==4 вы пишете после окончания out_mat

+1

Хороший улов, JSF! – godel9

+0

это было. благодаря – lhk