Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Левиафам
36 / 31 / 12
Регистрация: 31.05.2012
Сообщений: 575
1

Исправить ошибку из-за которой приложение падает при умножении матриц

16.10.2016, 20:11. Просмотров 844. Ответов 5
Метки нет (Все метки)

Привет прогеры! Объясните обезьяне почему у меня кидает exeption программа при перемножении матриц.
Размеры матриц всего 1000 на 1000 и при этом пишет переполнение стека: Stack overflow (параметры: 0x00000000, 0x00862000).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <conio.h>
#include <time.h>
 
using namespace std;
 
const int N = 1000;
 
void filling(int matr[N][N]);
void zeroFill(int matr[N][N]);
void printMatr(int matr[N][N]);
void multiplicationMatr(int matrA[N][N],int matrB[N][N],int matrC[N][N]);
 
 
int main()
{
 
 
    int matrA [N][N];
    int matrB [N][N];
    int matrC [N][N];
 
 
    filling(matrA);
    filling(matrB);
    zeroFill(matrC);
 
    unsigned int start_time =  clock();
    multiplicationMatr(matrA,matrB,matrC);
    unsigned int end_time = clock();
    unsigned int search_time = end_time - start_time;
 
    cout<<search_time/CLOCKS_PER_SEC;
 
 
    getch();
    return 0;
}
 
void filling(int matr[N][N])
{
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
         matr[i][j] = 1;
        }
    }
}
 
void zeroFill(int matr[N][N])
{
 
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
         matr[i][j] = 0;
        }
    }
 
}
 
void printMatr(int matr[N][N])
{
 
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
         cout<<matr[i][j]<<" ";
        }
        cout<<endl;
    }
 
}
 
void multiplicationMatr(int matrA[N][N],int matrB[N][N],int matrC[N][N])
{
 
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            for(int z=0; z<N; z++){
            matrC[i][j] += matrA[i][z] * matrB[z][j];
            }
        }
    }
 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 20:11
Ответы с готовыми решениями:

Не могу найти ошибку при умножении 2х матриц
Доброго времени суток! Помогите найти ошибку в матрице, который час сижу и не...

Проверить ассоциативность при умножении матриц
Делаю лабораторную с дискретной математики. Нужно проверить ассоциативность при...

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

При умножении матриц результат равен нулю
При умножении матриц мне вместо нормального ответа выводит нули, почему?...

Исправить ошибку, при которой не работает cin после vector'a (лишний символ '\n' в потоке ввода)
Столкнулся с этой проблемой в другой программе,но решил написать более...

5
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
16.10.2016, 21:57 2
Лучший ответ Сообщение было отмечено Левиафам как решение

Решение

Потому что стек не для здоровенных массивов. Если объявить их вне main или воспользоваться динамической памятью, эта ошибка исчезнет.
2
Левиафам
36 / 31 / 12
Регистрация: 31.05.2012
Сообщений: 575
16.10.2016, 23:50  [ТС] 3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Если объявить их вне main
а тут уже интересно. Почему так? Почему main руки связывает?
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
17.10.2016, 22:00 4
Цитата Сообщение от Левиафам Посмотреть сообщение
Почему так?
Переменные, объявленные в функции, существуют только во время выполнения этой функции. Поэтому место для них выделяется на стеке, а он не такой уж и большой (насколько помню, Windows по умолчанию выделяет один мегабайт, и этого с лихвой хватает.
Глобальные переменные, объявленные вне функций, размещаются в составе самой программы и существуют всегда. Они заполняются (если необходимо) до того, как управление передаётся в main, и чистятся (опять же, если необходимо) после того, как main завершается.
Более правильным выходом было бы воспользоваться динамической памятью, но сделать массивы глобальными проще и в данном случае это не должно создавать обычных неудобств.
0
Левиафам
36 / 31 / 12
Регистрация: 31.05.2012
Сообщений: 575
20.10.2016, 10:43  [ТС] 5
Цитата Сообщение от Nick Alte Посмотреть сообщение
динамической памятью
Я именно так и сделал.Но у меня другой вопрос возник: почему когда я перемножаю матрицы, которые заполнены единицами, дают такое же время выполнения, если бы я перемножал матрицы значения которых были заполнены разными числами, даже более большими чем единицы. Ведь перемножить 1 на 1 куда проще с точки зрения процессора, чем 256 на 256.
0
Catstail
Модератор
23606 / 11707 / 2046
Регистрация: 12.02.2012
Сообщений: 19,097
20.10.2016, 14:16 6
Цитата Сообщение от Левиафам Посмотреть сообщение
Ведь перемножить 1 на 1 куда проще с точки зрения процессора, чем 256 на 256.
- потому, что и то, и другое выполняется теми же командами (которые требуют одинаковое к-во тактов процессора). Странный вопрос. Перемножить 1 и 1 для процессора - то же самое, что перемножить 3463 и 4213 (по "трудозатратам")
0
20.10.2016, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2016, 14:16

Найти все двузначные числа, которые при умножении на 2 заканчиваются на 8, а при умножении на 3 - на 4.
Привет мозги, нужно решить задачу по Си++. Найти все двузначные числа, которые...

Умножение матриц. Исправить ошибку
Доброго времени суток. В университете получил задание реализовать программу...

Исправить ошибку (умножение двух матриц)
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; void main() {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru