Я пытаюсь сделать логическую функцию, которая проверяет, является ли матрица симметричной, но я получаю эту ошибку:
| 54 | ошибка: невозможно преобразовать ‘float () [(((sizetype) (((ssizetype) n) + -1)) + 1)] to ‘float () [100] ‘для аргумента’ 3 ‘в’ void Transpose (int, float () [100], float () [100]) ‘|
#include <iostream>
using namespace std;
void Transpose(int n, float a[][MAX], float T[][MAX]) {
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
T[i][j] = a[j][i];
}
}
}
bool Symmetric(int n, float a[][MAX]) {
float t[n][n];
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
t[i][j] = 0;
}
}
Transpose(n,a,t); // <--- Error here.
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(t[i][j] != a[i][j]){
return false;
}
}
}
return true;
}
Ошибка происходит в Transpose(n,a,t);
линия
Компилятор говорит, что массив float t[n][n]
где n
переменная времени компиляции [то есть не константа] не совпадает float T[][MAX]
, когда MAX
является константой времени компиляции.
Это, вероятно, будет хорошо работать, чтобы использовать float t[n][MAX]
для вашей временной матрицы. Однако имейте в виду, что C и C ++ не очень хорошо справляются с «массивами переменного размера» (в частности, при передаче их из одной функции в другую), и в C ++, вероятно, было бы лучше использовать другой способ опишите свою матрицу. Например:
std::vector<vector<float>> t;
Затем вам нужно будет проделать дополнительную работу для определения размера вектора, например:
t.resize(n);
for(i = 0; i < n; i++){
t[i].resize(n);
Что вы можете сделать, это заменить эти массивы на std :: vector< вектор < float >>, как сказали другие ответы. Я бы использовал typedef, чтобы сделать вещи немного проще. Кроме того, как только вы начнете использовать vector, воспользуйтесь этим другими способами, такими как более простая инициализация.
#include <vector>
typedef std::vector<float> Float1D;
typedef std::vector<Float1D> Float2D;
void Transpose(int n, const Float2D& a, Float2D& T)
{
int i,j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
T[i][j] = a[j][i];
}
}
bool Symmetric(int n, Float2D& a)
{
Float2D t(n, Float1D(n,0));
Transpose(n,a,t);
// assuming that a and t are the same size matrix
return t == a;
}
Обратите внимание на инициализацию вектора t в симметричной функции. Никаких циклов не потребовалось, поскольку все, что было сделано, это объявить его с размером строки n и инициализировать каждую строку 1-мерным вектором с плавающей запятой, причем каждая запись в массиве 1-d была инициализирована значением 0.
Также обратите внимание на тест в конце. Все, что я сделал, это сравнил, если векторы имеют равные компоненты, используя operator ==.
С кодом выше, я предполагаю, что ваши матрицы имеют одинаковый размер. Если нет, вам нужно будет поставить чеки, чтобы убедиться в этом (я этого не делал).