2013-09-23 3 views
0

Можете ли вы мне помочь, у меня есть проблема. Это программа, которая транспонирует матрицу. Когда число строк или столбцов равно 357 или больше, программа не работает (определите MAX_n 357, определите MAX_m 357). Когда работает менее 357, программа работает нормально.C программирование транспонированной матрицы, #define

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_m 357 
#define MAX_n 357 
void main() 
{ 
    int a[MAX_m][MAX_n],b[MAX_m][MAX_n]; 
    int r=0,j,i; 
    printf("\nProgram to transpose matrix\n"); 
    for(i=0;i<MAX_m;i++) 
    { 
     for(j=0;j<MAX_n;j++) 
    { 
     r=rand(); 
     a[i][j]=r; 
    } 
} 
printf("\nMatrix A: "); 
for(i=0;i<MAX_m;i++) 
{ 
    printf("\n"); 
    for(j=0;j<MAX_n;j++) 
    { 
     printf(" "); 
     printf("%d",a[i][j]); 
    } 
} 
for(i=0;i<MAX_m;i++) 
{ 
    for(j=0;j<MAX_n;j++) 
    { 
    b[i][j]=a[j][i]; 
    } 
} 
printf("\nResultant Matrix: "); 
for(i=0;i<MAX_m;i++) 
{ 
    printf("\n"); 
    for(j=0;j<MAX_n;j++) 
    { 
     printf(" "); 
     printf("%d",b[i][j]); 
    } 
    } 
    printf("\n"); 
    return(0); 
    } 
+1

«357 или больше программа не работает» - как это происходит? - сбой, зависание, неправильный вывод, что-то еще? –

+0

'a' выделяется в стеке. Возможно ли, что вы используете слишком много стека? 357 * 357 * sizeof (int) составляет около 1/2 мега. Что происходит, когда вы динамически выделяете 'a' вместо этого? –

+0

хуже, он выделяет это количество пространства дважды, для 'a' и' b', используя почти мегабайт стека. Расскажите нам, что происходит, когда вы объявляете 'a' и' b' глобальными переменными. –

ответ

0

Как было указано в комментариях, это должно быть проблемой распределения памяти. В Unix вы можете проверить ulimit -s в оболочке Bash для вашего ограничения размера стека, или limit stack в tcsh.

Поскольку это выглядит как домашнее задание, я оставлю его вам и вашему учителю для обсуждения различных стратегий распределения памяти.

P.S., было бы полезно в будущем указать, какой тип сбоя вы испытываете, а не просто «это не сработало».

+0

Когда программа вот-вот начнется, messagge «Appliction перестала работать» ... Я думаю, что проблема в переполнении стека, я не знаю, как ее исправить. Мне нужна большая матрица 1024 * 1024. Спасибо за помощь – user2390457

0

Я сделал это на C++, я создал класс Matrix. Вы можете легко сделать это в C от этого. Я знаю, что двумерные массивы кажутся более понятными (при транспозиции), но они просто удобны для их записи (с небольшими накладными расходами) и эквивалентны. Вы также можете увидеть, насколько эффективен этот код.

#include <iostream> 
#include <time.h> 
using namespace std; 

void print_array(int * A, int rows, int cols); 

class Matrix{ 
int rows, cols; 
int *A; 

public: 
Matrix(){}; 
Matrix (int *A, int rows, int cols): rows(rows), cols(cols) { 
    this->A = A; 
    }; 

Matrix transpose(){ 
    int* T; 
    T = new int[rows*cols]; 
    int rows_T(this->cols); 
    int cols_T(this->rows); 
    for(int i=0;i<rows_T;++i){ 
     for (int j=0;j<cols_T;++j){ 
      T[i*cols_T+j] = this->A[j*cols+i]; //T[i][j]=A[j][i] 
     } 
    } 
return Matrix(T, rows_T, cols_T); 
}; 

void print(){ 
    for (int i=0;i<rows;++i){ 
     for(int j=0;j<cols;j++){ 
      cout<<A[i*cols+j]<<" "; 
     } 
     cout<<" "<<endl; 
    } 
} 
}; 

void print_array(int * A, int rows, int cols){ 

for (int i=0;i<rows;++i){ 
    for(int j=0;j<cols;j++){ 
     cout<<A[i*cols+j]<<" "; 
    } 
    cout<<" "<<endl; 
} 

} 



int main(){ 

clock_t t; 
t= clock(); 

int rows(2000), cols(1000); 
int *A = new int[rows*cols]; 
for(int i=0;i<rows*cols;++i){ 
    A[i]= rand() %10; 
} 

Matrix M1(A, rows, cols); 

Matrix B; 
B = M1.transpose(); 

t = (clock()-t); 
cout<<"took (seconds): "<<t/1000000.0 <<endl; 

return 0; 
} 
Смежные вопросы