Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
#1

Visual Studio C++. Вылетает ошибка при компиляции. Задание на матрицы - C++

29.11.2013, 11:40. Просмотров 877. Ответов 10
Метки нет (Все метки)

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
// dz325.11.13.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<iostream>
using namespace std;
 
int main()
{
    cout<<"Vvedite razmer pervoi matrici:\n";
    int m, n;
    cin>>m>>n;
    cout<<"\nVvedite razmer vtoroi matrici:\n";
    int p, q;
    cin>>p>>q;
 
    if(n==p)
    {
        int **a=new int*[n];    //sozdaem 1 massiv;
        for(int i=0; i<n; i++)
            a[i]=new int[m];
 
        cout<<"\nZapolnite massiv A:\n";
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                cin>>a[i][j];
 
        int **b=new int*[q];    //sozdaem 2 massiv;
        for(int i=0; i<q; i++)
            b[i]=new int[p];
 
        cout<<"\nZapolnite massiv B:\n";
        for(int i=0; i<p; i++)
            for(int j=0; j<q; j++)
                cin>>b[i][j];
 
        int **c=new int*[n];    //sozdaem 3 massiv;
        for(int i=0; i<n; i++)
            c[i]=new int[p];
 
        for(int i=0; i<p; i++)
            for(int j=0; j<n; j++)
            {
                c[i][j]=0;
                for(int k=0; k<n; k++)
                    c[i][j]+=a[i][j]*b[j][i];
            }
            
        for(int i=0; i<p; i++)
        {
            for(int j=0; j<n; j++)
                cout<<c[i][j]<<"\t";
            cout<<'\n';
        }
        delete []a;
        delete []b;
        delete []c;
    } 
    else cout<<"\nERROR";
    cin.get();
    cin.get();
}
И вылетает такое сообщение: Unhandled exception at 0x5d542258 (msvcp100d.dll) in dz325.11.13.exe: 0xC0000005: Access violation writing location 0xfdfdfdfd.
Вылетает сразу после заполнения массива В.
И показывает такой код:
Visual Studio C++. Вылетает ошибка при компиляции. Задание на матрицы

Скажите, пожалуйста, где ошибка и как с ней бороться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 11:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Visual Studio C++. Вылетает ошибка при компиляции. Задание на матрицы (C++):

После компиляции программы. Visual studio сразу закрывается. Вылетает ошибка. - C++
http://s54.***********/i145/1104/ad/e59a041279ff.jpg Что делать? Когда жму ctrl+f5 Visual studio сразу же закрывается! ошибка как...

visual studio 2010 ultimate. ошибка при компиляции!!! - C++
всем привет! решил изучать язык программирование C++ скачал штук 50 книг, открываю книгу, читаю:read: и тут:( написано что нужен...

Visual Studio 2012 Ошибка при компиляции программы - C++
Здравствуйте. Возникла проблема при компиляции данной программы: #include &quot;stdafx.h&quot; #include &quot;string&quot; #include &quot;iostream&quot; ...

Работа с сокетами, ошибка при компиляции в Visual Studio 2013 - C++
Помогите пожалуйста в чем ошибка? // Server_new_chat.cpp : Defines the entry point for the console application. // #pragma...

Зависание или ошибка при компиляции microsoft Visual Studio 2008 - C++
microsoft Visual Studio 2008 писал на C++ Все раньше было хорошо. Возникла такая проблема. При компиляции программы не создается *.exe...

Visual Studio Community 2017 ошибка компиляции - C++
Добрый вечер! Ребята, столкнулся с новой для меня ошибкой) Пол интернета перелазил так и не нашел ответа на свой вопрос. Список ошибок я...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 11:56 #2
По-моему, у вас строки со столбцами перепутаны.
Вот здесь, что с чем сравнивается?
C++
1
if(n==p)
Добавлено через 5 минут
Тут n - строки:
C++
1
2
3
int **a=new int*[n];    //sozdaem 1 massiv;
        for(int i=0; i<n; i++)
            a[i]=new int[m];
Тут n - уже столбцы:
C++
1
2
3
4
cout<<"\nZapolnite massiv A:\n";
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                cin>>a[i][j];
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
29.11.2013, 11:58  [ТС] #3
n - это количество столбцов в матрице А, p - количество строк в матрице В. Ведь по правилу умножения матриц количество столбцов первой матрицы должно совпадать с количеством строк второй. Или нет?

Добавлено через 44 секунды
Ох, да, спасибо! Вы правы.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
29.11.2013, 12:04 #4
Если
Цитата Сообщение от undergraduate Посмотреть сообщение
int **a=new int*[n]; //sozdaem 1 massiv; for(int i=0; i<n; i++) a[i]=new int[m];
то n - количество строк у матрицы a, а не столбцов.
Аналогичная ошибка для матрицы b.
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
29.11.2013, 12:06  [ТС] #5
Подождите, не понимаю.
Вот здесь:
C++
1
2
3
int **a=new int*[n];    //sozdaem 1 massiv;
        for(int i=0; i<n; i++)
            a[i]=new int[m];
мы в первой строчке создаем одномерный массив a[n], массив располагается в одну строку. А через цикл под каждым элементом этого массива мы создаем столбцы. Верно?
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
29.11.2013, 12:08 #6
Неверно.
Сначала мы создаем массив указателей на строки.
Его размер соответственно равен количеству строк.
А потом для каждой строки выделяем память равную длине строки (т.е. количеству столбцов).
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
29.11.2013, 12:29  [ТС] #7
Переписано:
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
// dz325.11.13.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<iostream>
using namespace std;
 
int main()
{
    cout<<"Vvedite razmer pervoi matrici:\n";
    int m, n;
    cin>>m>>n;
    cout<<"\nVvedite razmer vtoroi matrici:\n";
    int p, q;
    cin>>p>>q;
 
    if(n==p)
    {
        int **a=new int*[m];    //sozdaem 1 massiv;
        for(int i=0; i<n; i++)
            a[i]=new int[n];
 
        cout<<"\nZapolnite massiv A:\n";
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                cin>>a[i][j];
 
        int **b=new int*[p];    //sozdaem 2 massiv;
        for(int i=0; i<q; i++)
            b[i]=new int[q];
 
        cout<<"\nZapolnite massiv B:\n";
        for(int i=0; i<p; i++)
            for(int j=0; j<q; j++)
                cin>>b[i][j];
 
        int **c=new int*[p];    //sozdaem 3 massiv;
        for(int i=0; i<n; i++)
            c[i]=new int[n];
 
        for(int i=0; i<p; i++)
            for(int j=0; j<n; j++)
            {
                c[i][j]=0;
                for(int k=0; k<n; k++)
                    c[i][j]+=a[i][j]*b[j][i];
            }
            
        for(int i=0; i<p; i++)
        {
            for(int j=0; j<n; j++)
                cout<<c[i][j]<<"\t";
            cout<<'\n';
        }
        delete []a;
        delete []b;
        delete []c;
    } 
    else cout<<"\nERROR";
    cin.get();
    cin.get();
}
Ошибка:
Unhandled exception at 0x558e2258 (msvcp100d.dll) in dz325.11.13.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
29.11.2013, 12:45 #8
Массив С должен быть p*n
а у Вас p*q
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
29.11.2013, 12:50  [ТС] #9
Цитата Сообщение от zss Посмотреть сообщение
а у Вас p*q
В каких строках?
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
29.11.2013, 12:54 #10
Там, где его создаете, надо
C++
1
2
3
  int **c=new int*[p];    //sozdaem 3 massiv;
        for(int i=0; i<p; i++)
            c[i]=new int[n];
Кстати, в остальных массивах та же ошибка
C++
1
2
3
 int **a=new int*[m];    //sozdaem 1 massiv;
        for(int i=0; i<m; i++)
            a[i]=new int[n];
Для второго сами исправьте
undergraduate
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 36
29.11.2013, 13:25  [ТС] #11
Вот, пошло дело.
Возник еще один вопрос. Ввожу размер первой матрицы 4х3, второй - 3х2. Заполняю массивы цифрами от 0 до 9, в последней строке появляются числа -707406399 и -303174171 (остальные элементы равны 3, 6, 0, 84,75). Но перед вычислением каждого элемента с[i][j] он обнулялся, то есть, никаких огромных и тем более отрицательных чисел быть не должно. В чем может быть проблема?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2013, 13:25
Привет! Вот еще темы с ответами:

Visual Studio. Запрет компиляции при наличии варнингов - C++
Для пущей безопасности хотелось бы, чтобы компилер отказывался компилить код, если есть варнинги. Есть такое где-нибудь в опциях? ...

Visual Studio 2010 + Windows 7 x64. Ошибки при компиляции - C++
Здравствуйте. Использую Visual Studio 2010 и Windows 7 x64 Компилю код. Получаю экзешник. На компьютере запускается нормально. Пробую...

MS Visual Studio 2013 Express при компиляции программа открывается и сразу закрывается - C++
Вот код: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Hello&quot; &lt;&lt; ; system(&quot;pause&quot;); return 0; ...

Как правильно использовать заголовочные файлы при раздельной компиляции в MS Visual Studio? - C++
Если я использую функцию cout и cin в каждом модуле, мне нужно в каждом модуле прописывать : #include &lt;iostream&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.11.2013, 13:25
Ответ Создать тему
Опции темы

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