Candidate function not viable: no known conversion from 'double' to 'double **' for 7th argument

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
StringGrid1->Cells[0][0]=" N";
StringGrid1->Cells[0][1]=" A";

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
double F(double);
void Trap(double, double, double,  int);
void Tab(double,double,double, int, int, double, double**, double**,double*,double*);//Tabulirovanie
void RezOut(double, double, int, double*, double*, double**, double**, int, int);



void __fastcall TForm1::Button1Click(TObject *Sender)
{
 double
  Xn = StrToFloat(Edit1->Text),
  Xk = StrToFloat(Edit2->Text),
  Dx = StrToFloat(Edit3->Text),
  C = StrToFloat(Edit5->Text),
  D = StrToFloat(Edit6->Text),
  Eps = StrToFloat(Edit8->Text), // погрешность
  Del,In,
  b;// Значение интеграла

 int
  N = StrToInt(Edit4->Text), // количество значений параметра А - количество столбцов
  Km = StrToFloat(Edit7->Text), LT,
  K;// количество значений аргумента Х - количество строк

  K =(int) fabs((Xn-Xk)/Dx) + 1;

 double *Mx = new double [K]; // Mx- указатель на выделенный участок памяти под массив вещественных чисел типа double
 double *Ma = new double [N]; // Ma- указатель на выделенный участок памяти под массив вещественных чисел типа double

 double **My = new double*[K];

  for(int i = 0; i<K; i++){
   My[i] = new double[N];
  }

 double **Er = new double*[K];

  for(int i = 0; i<K; i++){
   Er[i] = new double[N];
  }
//Проверка на наличие ошибок
if (Eps>=1 || Eps<=0) {ShowMessage("Погрешность должна быть больше 0 и меньше 1!");}
  else{
   if(b!=0){
      Trap(C, D, Eps, Km); //Подсчёт Параметра B
      Tab(Xn, Xk, Dx, N, K, b, **My, **Er, *Mx, *Ma);
      RezOut(b, Del, LT, *Mx, *Ma, **My, **Er, K, N);
      ShowMessage("Dibil"+FloatToStr(b)+"? ");
   } else ShowMessage("Решение не найдено за "+ IntToStr(Km)+" итераций");
  }
// Освобождение памяти
delete [] Mx;
delete [] Ma;

  for(int i = 0; i< K; i++){
   delete[]My[i];
  }

 delete [] My;

  for(int i = 0; i< K; i++){
   delete[]Er[i];
  }
 delete [] Er;
}

//Нелинейное уравнение
double F(double X){
return X/(cos(2*X)*cos(2*X)*cos(2*X)*cos(2*X));
}

void Trap(double C, double D, double Eps, int Km){
 int i = 1, LT;
 double Yl, Yn, H, b, X, Del, In;
 int I, J, M, Er = 1;
 Yl = F(C);
 Yn = F(D);
 b = 0;
 M = 2;
 LT = 0;

 J = 1;

 while(J <= Km){
   H = (D - C)/M;
   X = C + H;
   In = 0;
    for(I = 1; I < M; I++){
      In = In + F(X);
      X = X + H;
    }
  In = H*(Yl/2+Yn/2 + In);
  Del = fabs(b - In);

  if(Del< Eps){
   LT = J;
   J = Km;
  Er = 0;
  }

  else {
   b = In;
   M = M*2;
  }
 J = J + 1;
 }
 Form1->Edit9->Text = FloatToStr(b);
}
 //Табулирование Функции
void Tab(double Xn, double Xk, double Dx, int N, int K, double b, double**My, double**Er, double *Mx, double *Ma){

  for(int i = 0; i < N; i++){
   Form1->StringGrid1->Cells[0][i] = "A" + FloatToStr(i);
   Ma[i] = StrToFloat( Form1->StringGrid1->Cells[1][i]);
  }

  for (int i = 0; i < K; i++) {
    Mx[i] = Xn;
    Xn = Xn + Dx;
  }
     ShowMessage("Dibil");
  for (int i = 0; i < K; i++) {
     for (int j = 0; j < N; j++) {
       if(Mx[i]>-1.15){
        My[i][j] = sqrt(b)*log((pow(Mx[i],2*b)+ pow(Ma[j], 2*Mx[i]))/(18+sqrt(3+pow(2*Mx[i],3))));
        Er[i][j] = 0;
       }
      else Er[i][j] = 1;
     }
  }

}


//Вывод результатов

void RezOut(double b, double Del, int LT, double *Mx, double *Ma, double **My, double **Er, int K, int N){

Form1->StringGrid2->ColCount = N + 1;
Form1->StringGrid2->RowCount = K + 2;
for (int i = 1; i<= N; i++)
{
Form1->StringGrid2->Cells[i][0] = Ma[i];
}
for (int j = 1; j<= K+1; j++)
{
Form1->StringGrid2->Cells[0][j] = Mx[j];
}
for (int i = 1; i <= N; i++)
{
    for (int j = 1; j <= K+1; j++)
    {
     Form1->StringGrid2->Cells[i][j] = FloatToStr(My[i][j]);
    }
}
/*Form1->Edit9->Text = FloatToStrF(b, ffGeneral, 10, 6);
Form1->Edit10->Text = FloatToStrF(Del, ffGeneral, 10, 6);
Form1->StringGrid2->RowCount = K + 1;
Form1->StringGrid2->ColCount = N + 1;
Form1->StringGrid1->Cells[0][0] = "X/A";
   ShowMessage("You are a DOWN!!!");
 for (int i = 0; i < N; i++) {
    Form1->StringGrid2->Cells[i+1][0] = "A[" + IntToStr(i)+"]=" + FloatToStr(Ma[i]);

    for (int j = 0; j < K; j++) {
        Form1->StringGrid2->Cells[0][j+1] = "X[" + IntToStr(j)+"]=" + FloatToStr(Mx[j]);
        if(Er[i][j] == 1){
           Form1->StringGrid2->Cells[i+1][j+1] = "Err";

        }
        else
         Form1->StringGrid2->Cells[i+1][j+1] = FloatToStrF(My[i][j], ffGeneral, 6, 5);

    }
 } */
}


//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4MouseLeave(TObject *Sender)
{
int Q = StrToInt(Edit4->Text); // noun of parametres A
Form1->StringGrid1->ColCount = Q + 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Clear();
Edit2->Clear();
Edit3->Clear();
Edit4->Clear();
Edit5->Clear();
Edit6->Clear();
Edit7->Clear();
Edit8->Clear();
Edit9->Clear();
Edit10->Clear();
Edit11->Clear();
}
//---------------------------------------------------------------------------

Выдает ошибку Unit1.cpp(27): candidate function not viable: no known conversion from 'double' to 'double **' for 7th argument для подпрограммы Tab. Хотя прототипы созданы и, вроде как, ошибок в объявлении динамических массивов компилер не нашел. Помогите пжалста! Спасибо


Ответы (1 шт):

Автор решения: Zugr

Возьмём к примеру Вашу такую строку:

 RezOut(b, Del, LT, *Mx, *Ma, **My, **Er, K, N);

Зачем Вы написали ** My? Ведь у My тип double**, а у ** My просто double. Но функция RezOut() в этом параметре ожидает получить именно double**! По идее правильно будет написать

RezOut(b, Del, LT, Mx, Ma, My, Er, K, N);

Ну и в других местах также.

→ Ссылка