Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
krotoff
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 12
1

Error C2440

29.11.2015, 16:22. Просмотров 1373. Ответов 6
Метки нет (Все метки)

Доброго времени суток!

Возникла проблема при попытке реализовать Метод Отражения Хаусхолдера в C++.

В строках 35-38 выделяются массивы с ошибкой "выражение должно быть допустимым для изменения левосторонним значением".



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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <fstream>
#include <math.h>
 
using namespace std;
 
double matrix_multiplicationA(int n, int m, double a[3][3], int p, double b[3][3]);
double matrix_multiplicationB(int n, int m, double a[3][3], int p, double b[3][1]);
double create_vector_p(int matrix_size, int iter, double a[3][3]);
double create_reflection_matrix(int matrix_size, int iter, double vec_p[3]);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream fin;
    ofstream fout;
    fin.open("text");
    fout.open("out.txt");
    if (!fin.is_open())
        cout << "Error opening file" << endl;
    double matrix_A[3][3];
    double matrix_B[3][1];
    double matrix_P[3][3];
    double vector_p[3];
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            fin >> matrix_A[i][j];
        fin >> matrix_B[i][0];
    }
    fin.close();
 
for (int k = 0; k < 2; ++k)
    {
         vector_p = create_vector_p(3, k, matrix_A);
         matrix_P = create_reflection_matrix(3, k, vector_p);
         matrix_A = matrix_multiplicationA(3, 3, matrix_P, 3, matrix_A);
         matrix_B = matrix_multiplicationB(3, 3, matrix_P, 1, matrix_B);
    }
 
for (int i = 0; i < 3; i++)
        {
            if(matrix_A[i][i] == 0)
            {
                fout << "Матрица вырожденная";
                system("pause");
                return 0;   
            }
        }
 
    double vector_x[3];
 
for (int i = 2; i >= 0; i--)
        {
            double sum = 0;
            for (int j = i + 1; j < 3; j++)
                sum += matrix_A[i][j] * vector_x[j];
            vector_x[i] = (matrix_B[i][0] - sum) / matrix_A[i][i];
 
        }
 
for (int i = 0; i < 3; i++)
            fout << "x" << i + 1 << " = " << vector_x[i] << endl;
        cout << "File 'out.txt' successfully written";
 
system("pause");
return 0;
}
 
double matrix_multiplicationA(int n, int m, double a[3][3], int p, double b[3][3])
{
    double matrix_C[3][3];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < p; j++)
            {
                for (int r = 0; r < m; r++)
                {
                    matrix_C[i][j] += a[i][r] * b[r][j];
                }
            }
    }
}
 
double matrix_multiplicationB(int n, int m, double a[3][3], int p, double b[3][1])
{
    double matrix_C[3][3];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < p; j++)
            {
                for (int r = 0; r < m; r++)
                {
                    matrix_C[i][j] += a[i][r] * b[r][j];
                }
            }
    }
}
 
double create_vector_p(int matrix_size, int iter, double a[3][3])
{
    double v[3];
 
        for (int i = 0; i < iter; i++)
                v[i] = 0;
 
        double sum = 0;
 
            for (int i = iter; i < matrix_size; i++)
                sum += a[i][iter] * a[i][iter];
 
            sum = pow(sum, 0.5f);
 
            if (a[iter][iter] > 0)
                v[iter] = a[iter][iter] + sum;
 
            else if (a[iter][iter] < 0)
 
                v[iter] = a[iter][iter] - sum;
 
            for (int i = iter + 1; i < matrix_size; i++)
                v[i] = a[i][iter];
 
}
 
double create_reflection_matrix(int matrix_size, int iter, double vec_p[3])
{
    double temp_matrix[3][3];
 
    double sum = 0;
 
    for (int i = iter; i < matrix_size; ++i)
    {
        sum += vec_p[i] * vec_p[i];
    }
 
    for (int i  = 0; i < matrix_size; i++)
    {
        for (int j = 0; j < matrix_size; j++)
        {
            if (i == j)
                temp_matrix[i][j] = 1 - (2 * vec_p[i] * vec_p[j]) / sum;
 
            else
                temp_matrix[i][j] = - (2 * vec_p[i] * vec_p[j]) / sum;
 
        }
    }
 
}
На что "формально" ругается VS:

Кликните здесь для просмотра всего текста
1>------ Построение начато: проект: Otr, Конфигурация: Debug Win32 ------
1> Исходный код.cpp
1>e:\documents\visual studio 2012\projects\otr\otr\исходный код.cpp(35): error C2440: =: невозможно преобразовать "double" в "double [3]"
1> Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы
1>e:\documents\visual studio 2012\projects\otr\otr\исходный код.cpp(36): error C2440: =: невозможно преобразовать "double" в "double [3][3]"
1> Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы
1>e:\documents\visual studio 2012\projects\otr\otr\исходный код.cpp(37): error C2440: =: невозможно преобразовать "double" в "double [3][3]"
1> Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы
1>e:\documents\visual studio 2012\projects\otr\otr\исходный код.cpp(38): error C2440: =: невозможно преобразовать "double" в "double [3][1]"
1> Не существует преобразований в типы массивов, хотя существуют преобразования в ссылки или указатели на массивы
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2015, 16:22
Ответы с готовыми решениями:

Error C2106 или error C2440
Необходимо создать односвязный список из слов строки.Ошибка в 28 и 35 строке. Код: #include...

Error C2440 std::vector<_Ty>
класс CFilename class CFilename { public: CFilename() { } CFilename(const char*...

Ошибка error C2440 с char в методе класса
Код: #include &quot;stdafx.h&quot; #include &quot;windows.h&quot; #include &quot;iostream&quot;

error C2440: 'delete' : cannot convert from 'Song' to 'void *'
Строка, где выдаётся ошибка: delete mas; Деструктор: Song::~Song () { delete song;...

Error C2440: =: невозможно преобразовать 'std::string' в 'double'
&gt;c:\users\nreshetova\documents\visual studio 2008\projects\sort3d1\sort3d1\sort3d1.cpp(73) : error...

6
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
29.11.2015, 16:38 2
Ну типы же не соответствуют. Массиву вообще нельзя присвоить, только отдельному элементу.
0
krotoff
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 12
29.11.2015, 16:44  [ТС] 3
Вопрос тогда: как сделать так, чтобы это все сработало. Знаю, что это работает с динамическими массивами, с указателями, но в них я абсолютно не шарю
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
29.11.2015, 17:44 4
Лучший ответ Сообщение было отмечено krotoff как решение

Решение

Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void create_vector_p(int matrix_size, int iter, double a[3][3], double v[3])
{
        for (int i = 0; i < iter; i++)
                v[i] = 0;
 
        double sum = 0;
 
            for (int i = iter; i < matrix_size; i++)
                sum += a[i][iter] * a[i][iter];
 
            sum = pow(sum, 0.5f);
 
            if (a[iter][iter] > 0)
                v[iter] = a[iter][iter] + sum;
 
            else if (a[iter][iter] < 0)
 
                v[iter] = a[iter][iter] - sum;
 
            for (int i = iter + 1; i < matrix_size; i++)
                v[i] = a[i][iter];
 
}
C++
1
create_vector_p(3, k, matrix_A, vector_p);
1
krotoff
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 12
29.11.2015, 18:07  [ТС] 5
То есть по такому же принципу редактировать каждую подпрограмму?
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
29.11.2015, 18:15 6
Да.
1
krotoff
0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 12
29.11.2015, 18:22  [ТС] 7
Большое спасибо
0
29.11.2015, 18:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2015, 18:22

Указатели. Error C2440: '=' : cannot convert from ClassAPtr to ClassA<Tclass>
Добрый день. Помогите, пожалуйста, разобраться. У меня есть шаблонный класс template&lt;class...

error C2440: не конвертируется 'LRESULT (__stdcall General::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
Здравствуйте! Подскажите, пожалуйста, как исправить эту ошибку в этой строчке: ...

Ошибка error C2440: инициализация: невозможно преобразовать 'int' в 'int []'
// ConsoleApplication9.cpp: определяет точку входа для консольного приложения. // #include...


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

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

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