Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оболочка на С для С++ класса 
V
    Опции темы
flagist0
Дата 11.6.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Люди, пожалуйста, подскажите где копать насчет сабжа.
Не могу понять сам процесс вызова некого метода на С++ из С. Ведь методы принимают скрытый this! 
PM MAIL GTalk   Вверх
Alek86
Дата 11.6.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(flagist0 @  11.6.2008,  16:34 Найти цитируемый пост)
 Ведь методы принимают скрытый this! 

а ты передавай в открытую
и вообще, можно поподробнее вопрос осветить?


--------------------
user posted image    user posted image
PM MAIL   Вверх
flagist0
Дата 11.6.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Вопрос общий, но поднят реальной ситуацией. 
Операционка принимает (для реализации функций файловой системы) адрес функции на С, за которой должна быть здоровая инфраструктура. Этот код потом надо будет перенести в другой проект. Так что решено сделать функцию на С, которая собсно вызывает методы плюсового объекта.

PS: простите если невнятно, я в С++ - 0.

PM MAIL GTalk   Вверх
Alek86
Дата 11.6.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



то есть из dll, будут торчать функции плюсового класса?


--------------------
user posted image    user posted image
PM MAIL   Вверх
flagist0
Дата 11.6.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Что-то в этом роде. Только в операционке нет разделения kernel/user, нет отдельных процессов, и динамической линковки собсно тоже нет. 

Т.е., идея в том, чтобы сохранить this'ы объектов (разные разделы в моем случае), а потом вызывать методы, напрямую передавая им нужный this?
Есть подозрение, что компилятору это не понравится :(

Это сообщение отредактировал(а) flagist0 - 11.6.2008, 17:51
PM MAIL GTalk   Вверх
Alek86
Дата 11.6.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



если ты будешь вызывать функции из dll, то компилер не при делах
если же у тебя в 1 проекте и С и C++, причем сишный код вызывает плюсовой...
это разве возможно вообще?


--------------------
user posted image    user posted image
PM MAIL   Вверх
flagist0
Дата 11.6.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Цитата

если же у тебя в 1 проекте и С и C++, причем сишный код вызывает плюсовой...
это разве возможно вообще?


Наверное возможно. extern "C++" { #include "lala.h" } 
Да и вызов плюсового метода (ИМХО) отличается от обычной сишной функции указателем this в списке параметров, который компилятор подставляет автоматически. А со стороны С, где компилятор понятия не имеет об OO-штучках, мы сами передадим заранее сохраненный this.
PM MAIL GTalk   Вверх
dumb
Дата 11.6.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



я так и не понял, кто кого вызывает, и кто какие параметры передает. smile
вообще в таких случаях рулит static метод класса.
PM MAIL   Вверх
flagist0
Дата 11.6.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Полная ситуация такова:
Есть класс одноуровневой файловой системы MyFS, экземпляров которой может быть несколько.  При инициализации экземпляра, вызывающая сторона передает содержимое суперблока этой файловой системы, по которой объект строит список файлов. 
Но ОС ставит требование - для реализации всех функций  (mount, unmount, open etc) ей надо передать адреса функций с определенными параметрами.  Так вот, задача состоит в том, чтобы подсунуть ОС сишные функции, которые будут работать с С++овым классом MyFS.
Пока формулировал, начал понимать smile 
PM MAIL GTalk   Вверх
EnergoHokum
Дата 11.6.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



А какое, в общем случае, компилятору дело, что за указатель, this, или ещё на что? Ты просто сохраняешь этот this, и делаешь потом из С-шного кода

Код

this->MethodOfMyClass(void* pParameter);


Я так потоки с экземплярами классов связываю.
PM MAIL ICQ   Вверх
flagist0
Дата 11.6.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Цитата

this->MethodOfMyClass(void* pParameter);


Спасибо! Как-то не подумал, на что он собственно указывает :( Это ж структура, с адресами функций!!

Цитата

Я так потоки с экземплярами классов связываю.


Второй раз спасибо! Как-то была жуткая проблема - как при инициализации треда передать ему адрес метода. 


PM MAIL GTalk   Вверх
EnergoHokum
Дата 11.6.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Ну, если уж мне совсем к себе придраться, то делать нужно так:

Код

/* Тут будет храниться указатель на экземпляр класса */
void* ptrthis;

void MyClass::getThis(void** ptr)
{/* Где-то в классе*/
    *ptr=(void*)this;
}

int MyClass::retOne(void)
{
    return 1;
}

/* Выцепляем указатель на экземпляр класса */
MyClass mc.getThis(&ptrthis);

/* Применяем выцепленный указатель */
((MyClass*)ptrthis)->retOne();


Как-то так...

Это сообщение отредактировал(а) EnergoHokum - 11.6.2008, 19:21
PM MAIL ICQ   Вверх
Alek86
Дата 12.6.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



это точно будет работать?
что-то неуверен, что указатели на функции-члены в плюсах хранятся как поля (хоть и статические) этого класса...


--------------------
user posted image    user posted image
PM MAIL   Вверх
EnergoHokum
Дата 13.6.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Цитата
это точно будет работать?


Где-то на просторах интернетов мне недавно попадалась статья, где (на примерах распотрошённого кода) показывалось, что дела обстоят именно так. Ну, в качестве эксперимента, попробуй из экземпляра класса создать поток, отдав ему this, и поменять на ходу из потока какую-нить переменную этого экземпляра.
PM MAIL ICQ   Вверх
JackYF
Дата 13.6.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(EnergoHokum @  13.6.2008,  07:55 Найти цитируемый пост)
(на примерах распотрошённого кода) показывалось, что дела обстоят именно так

Что-то меня эти выводы смущают. Товарищи проверили это на всех доступных компиляторах, чтобы это утверждать? Гарантируют, что в будущем это не изменится?
Нельзя полагаться на нестандартные вещи, если только речь не идёт об очень узкой и конкретной области.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.