Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
18 / 15 / 1
Регистрация: 10.01.2010
Сообщений: 252
1

Создать указатель на функцию

15.04.2011, 15:57. Просмотров 3594. Ответов 6
Метки нет (Все метки)

Вот чтот мне приспичило создать указатель на функцию чтения строки из Ini-файла. Вроде все так как нужно сделал, но билдер кидает ошибку.

Описал указатель на функцию:
C++
1
UnicodeString __fastcall (*ReadMyIniStr)(System::UnicodeString Section, System::UnicodeString Ident, System::UnicodeString Default);
Потом пытаюсь привязать мой указатель к самой функции:
C++
1
ReadMyIniStr=&iniTestNFile->ReadString;
Компилирую... А Билдер выдает такую ошибку:
[BCC32 Error] Unit3.cpp(36): E2034 Cannot convert 'UnicodeString (_fastcall * (_closure )(const UnicodeString,const UnicodeString,const UnicodeString))(const UnicodeString,const UnicodeString,const UnicodeString)' to 'UnicodeString (*)(UnicodeString,UnicodeString,UnicodeString)'
Full parser context
Unit3.cpp(35): parsing: void _fastcall TForm3::FormShow(TObject *)
В чем я ошибся?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2011, 15:57
Ответы с готовыми решениями:

Не могу создать указатель на функцию. ошибка: нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Выбивает ошибку, когда хочу присвоить переменной адрес какой то функции. Ошибка в строке 28(если...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

Не могу создать указатель на перегруженную функцию-член класса
Есть функция монстр из vulkan api. Она является членом класса. Просто написать её название не...

Как в main() создать указатель на функцию, которая находится в классе?
В этом примере как определить указатель на функцию F()? class A { public: bool F(int &a, int...

6
Evg
Эксперт CАвтор FAQ
21139 / 8155 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
15.04.2011, 16:31 2
Цитата Сообщение от PodOnoK Посмотреть сообщение
В чем я ошибся?
"&iniTestNFile->ReadString;" - это указатель на метод, а не на функцию. А потому ReadMyIniStr должна быть описана как указатель на метод

Добавлено через 2 минуты
Т.е. вместо "(*ReadMyIniStr)" должно быть "(TIniFile::*ReadMyIniStr)"
Ну и параметры должны быть описаны с квалификатором const (исходя из того, что пишет компилятор в тексте ошибки)
0
18 / 15 / 1
Регистрация: 10.01.2010
Сообщений: 252
15.04.2011, 16:45  [ТС] 3
Вот сделал так
C++
1
UnicodeString __fastcall (TIniFile::*ReadMyIniStr)(const UnicodeString, const UnicodeString, const UnicodeString);
C++
1
ReadMyIniStr=&iniTestNFile->ReadString;
Билдер пишет:
[BCC32 Error] Unit3.cpp(36): E2034 Cannot convert 'UnicodeString (_fastcall * (_closure )(const UnicodeString,const UnicodeString,const UnicodeString))(const UnicodeString,const UnicodeString,const UnicodeString)' to 'UnicodeString (_fastcall TIniFile::*)(const UnicodeString,const UnicodeString,const UnicodeString)'
Full parser context
Unit3.cpp(33): parsing: void _fastcall TForm3::FormShow(TObject *)
0
Evg
Эксперт CАвтор FAQ
21139 / 8155 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
15.04.2011, 16:49 4
iniTestNFile какой тип имеет? TIniFile или чего?
0
18 / 15 / 1
Регистрация: 10.01.2010
Сообщений: 252
15.04.2011, 16:52  [ТС] 5
Да TIniFile
0
Evg
Эксперт CАвтор FAQ
21139 / 8155 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
15.04.2011, 16:58 6
А... там не просто указатель на метод, а некая ацкая приблуда __closure:

The __closure keyword is used to declare a special kind of function pointer. A regular function pointer holds a 32-bit value. It simply points to a memory location. A closure, however, holds a 64-bit value. It contains the address of the function highest 32 bits, and the address of the class where the function resides in the lowest 32 bits. Closures are not part of standard C++. Borland added the __closure keyword to C++Builder specifically to handle the event architecture.
Видимо, надо вот так: "(__closure*ReadMyIniStr)"
Борланда нет под рукой, проверить не на чем
2
18 / 15 / 1
Регистрация: 10.01.2010
Сообщений: 252
15.04.2011, 16:59  [ТС] 7
Работает, спасибо
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2011, 16:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создать функцию, результатом которой вернуть указатель на начало списка
Никак не могу понять, как создать такой список... и как лучше перебрать данные из файла. Дан...

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса:...

Создать функцию, которая принимает указатель на массив и количество элементов
Люди! Огромная просьба помочь. Как сделать функцию, которая принимает указатель на массив и...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.