Error cannot convert double to double

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] = …;

  }

  }

}

Но остерегайтесь раздувания кода, если вы вызываете это со многими массивами разного размера.

Наталья Петрова
Оцените автора
Новости города Салавата
Добавить комментарий

Adblock
detector