Error cannot convert double to double
Рассмотрим этот код:
double dist(double x[3], double y[3])
{
double Sum;
double distance;
for(int i=0; i<3; i++)
{
cout << “Enter value of first coordinate”;
cin >> x[i];
cout << “Enter value of second coordinate”;
cin >> x[i];
Sum = Sum + pow((x[i] – x[i]), 2.0);
distance = (int)sqrt(Sum);
}
cout << “DISTANCE: ” << distance;
return distance;
}
int main()
{
int i, n;
double x[3]; double y[3];
cout << “enter number of test case” << endl;
cin >> n;
for(i=0; i<n; i++)
{
dist(x[i], y[i]);
}
return 0;
}
В строке dist(x[i], y[i])он продолжает выдавать ошибку
cannot convert ‘double’ to ‘double*’ for argument ‘1’ to ‘double dist(double*, double*)’
Ответ
Это не то, как вы передаете массив в функцию:
for (i = 0; i < n; i++) {
dist(x[i], y[i]);
}
Вы, вероятно, думали, что вызываете функцию distодин раз с массивом, содержащим все значения из x[0..n-1](и аналогично для y). Это не так. Поскольку вы находитесь в цикле, вы вызываете функцию столько раз, сколько выполняется цикл, что в данном случае равно nраз.
Кроме того, значения, которые вы передаете в качестве параметров функции, являются элементами типа double. Это не тот массив, который, как вы думали, вы предоставляли.
И я знаю, что сообщение об ошибке кажется странным. “Откуда double*исходит?” возможно, вы спрашивали себя. Ну, ответ прост:
Массивы не могут быть переданы функции.
Из-за чего-то, называемого “распад типа”, массивы преобразуются в указатели на их первый элемент (базовый адрес), когда они используются в выражениях. Типы параметров для dist(dist(double x[3], double y[3]) в точности эквивалентны dist(double* x, double* y). Это означает, что, когда вы неправильно пытались передать double’s в функцию, компилятор сообщил, что вы не смогли преобразовать их в указатели.
Передача имени массива передаст указатель на первый элемент. Это решит вашу основную проблему:
dist(x, y);
Cannot convert double [] [] to double **
У меня есть функция, которая принимает 3 параметра, первый из которых ** double .
normalizeDataZeroMeanUnitSD(double ** trainingActions, int numberOfTrainingActions, int descriptorDimension)
Когда я вызываю его из main, я пытаюсь использовать normalizeDataZeroMeanUnitSD(data, 681, 24); однако я получаю
cannot convert parameter 1 from ‘double [681][24]’ to ‘double **’
Вот как я создаю массив данных:
fstream infile;
infile.open(“gabor\\Data.txt”);
double data[681][24];
while (!infile.eof())
{
for(int j=0;j<681;j++)
{
for(int k=0; k<24;k++)
{
infile >> data[j][k];
}
}
}
infile.close();
Есть ли способ сделать то же самое, используя **данные?
Ответ
Ошибка довольно ясна: тип double [681][24]данных не совпадает с double **. Хотя это правда, что double[681]может распадаться на указатель на его первый элемент (таким образом, double*), это не означает, что double[681][24]может распадаться на double**.
Подумайте об этом так: double**подразумевает указатель на множество указателей. Но double[][]в нем нет НИКАКИХ указателей. В лучшем случае массив ЛЮБЫХ измерений по-прежнему имеет, самое большее, один указатель: на начало его непрерывного хранилища.
Вы могли бы использовать шаблон:
template<std::size_t M, std::size_t N>
void normalizeDataZeroMeanUnitSD(double (&trainingActions)[M][N], int descriptorDimension)
{
for( std::size_t m = 0; m < M; ++m )
{
for( std::size_t n = 0; n < N; ++n )
{
trainingActions[m][n] = …;
}
}
}
Но остерегайтесь раздувания кода, если вы вызываете это со многими массивами разного размера.