ошибка: невозможно преобразовать ‘float (*) [(((sizetype) (((ssizetype) n) + -1)) + 1)]’ в ‘float (*) [100]’ для аргумента ‘3’

Я пытаюсь сделать логическую функцию, которая проверяет, является ли матрица симметричной, но я получаю эту ошибку:

| 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); линия

0

Решение

Компилятор говорит, что массив 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);
2

Другие решения

Что вы можете сделать, это заменить эти массивы на 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 ==.

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

0

По вопросам рекламы [email protected]