Другие языки программирования и технологии

C++ Указатели и функции.

double dis (double *a, double *b, double *c);

void main(){
...
*m =dis(&a, &b, &c);
...
}

double dis (double *a,double *b,double *c){
return (*b)*(*b)-4*(*a)*(*c);
}
Ошибка:error C2664: dis : cannot convert parameter 1 from double ** to double *

Вроде всё сделал как надо, на msdn про ошибку читал, так там что-то про классы, а я со ссылками и функциями работаю, не шарю в системных классах этих ссылочных(
Боже, какая каша у вас в голове.
Во-первых: зачем все эти указатели? Все можно отлично реализовать и без них. Тем более, что создавая объекты в хипе через new, вы, конечно, не думаете о том, что их нужно удалять.
double dis(double a, double b, double c) { return b * b - 4 * a * c; }
int main() { double m = dis(a, b, c); }
Прошу заметить, что правильная функция main возвращает int, а не как у вас.
Потом я немножко почитал ваши комменты к предыдущему ответу, и:
Во-вторых, когда вы используете new, то не "создаете указатель", а выделяете память в хипе (куче) процесса и присваиваете указатель на эту область памяти переменной.
В-третьих: верьте не typeid, а своему коду. Тем более если вы так криво используете этот самый typeid. Правильно вот так:
cout << typeid(d).name(); - говорит о том, что переменная - указатель.
cout << typeid(&d).name(); - говорит о том, что переменная - указатель на указатель, но только потому, что командой &d создается переменная указателя на d (которая сама есть указатель) и передается в typeid.
Сергей Крылов
Сергей Крылов
4 300
Лучший ответ
Алексей Беляев зачем мне чтобы main возвращала int?
все работает, только функция возращает тип double:

А указатели верно используете, они делают код более общим. Хотя в данном примере это совсем не нужно, можно и по ссылкам, и по значению передавать.
У тебя функция dis возвращает тип double, а ты её присваиваешь к указателю. Вот так должно работать (в m будет -71):

double dis (double *a, double *b, double *c);

void main(){

double a = 5;
double b = 3;
double c = 4;

double m =dis(&a, &b, &c);

}

double dis (double *a,double *b,double *c){
return (*b)*(*b)-4*(*a)*(*c);
}
Алексей Беляев У меня такая фиовина
double *a = new double(0); //типа думал, что создал указатель на дабл число равное нулю
А на самом деле после такого присвоения у меня а - не указатель, а указатель на указатель (узнал с помощью typeid(&a).name)....Я в замешательстве, если я создал таким образом указатель на указатель, то как создать просто указатель?
Алексей Беляев всё, нашёл решение, double a = new double(0);