Разбираю указатели на функции,и решил реализовать. Функция, сама по себе простенькая, подсчет количества слов в строке.
Но не работает именно указатель на ф-цию, судя из цитаты у меня все правильно,как мне кажеться.
Проблема конкретно в строке char(*kilsliv)(int);
Выдает error: invalid conversion from 'char*' to 'int' [-fpermissive]
Как исправить, и в чем проблема?Спасибо!
> double (*pfunc)( double );
В момент этого объявления указатель pfunc
представляет собой ничего более, как некоторый адрес во внутреннем представлении компьютера (4 байта в 32-бит операционной системе, 8 байт в 64-бит операционной системе). Это в точности тот же внутренний вид, который имеет, скажем, указатель на целочисленную переменную int*. Но этот указатель имеет свой строго определённый тип: указатель на функцию, принимающую один параметр типа double, и возвращающую значение типа double. Но вот на какую конкретно функцию указывает указатель, в точке его определения — не важно: значение указателя не определено. взято отсюда.
#include <iostream>
using namespace std;
int kilsliv(char*strq)
{
int q=0;
for(int i=0;i<20;i++)
{
if(strq[i]==' ')
q+=1;
}
return q+1;
}
int main()
{
setlocale(LC_ALL, "rus");
char str[20]="";
cin.getline(str,20);
char(*kilsliv)(int);
cout << str << endl;
cout<<"kilkist sliv ="<<kilsliv(str)<<endl;
return 0;
}
Вот тут:
char(*kilsliv)(int);
вы объявляете локальный указатель kilsliv на функцию, которая принимает int и возвращает char. Более того это объявление перекрывает функцию из глобальной области видимости. Вот тут:
cout<<"kilkist sliv ="<<kilsliv(str)<<endl;
вы пытаетесь вызвать функцию по указателю м параметром char*, хотя она принимает int. Более того этот указатель ничем не был инициализирован. И если у вас даже получится вызвать функцию по этому указателю (например с флагом -fpermissive скомпилировав), то скорее всего вы получите Segmentation fault, так как указатель ведёт куда-то не туда.
Но можно создать указатель на функцию такую же, как kilsliv и инициализировать его:
int(*f)(char*) = kilsliv;
Теперь при фызове f() будет вызывать функция определенная как kilsliv, так как это указатели и указывают они теперь на одну область памяти.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости