Поиск:

Ответ в темуСоздание новой темы Создание опроса
> об указателях в качестве параметров 
:(
    Опции темы
040375
Дата 31.7.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ниже упрощённый до минимума отрезок кода - в принципе работоспособный, за исключением одной
детали - подскажите мне, почему в данном коде не меняется адрес функтора, передаваемого в ф-ию ptrFunc?:

Код

void ptrFunc (char* (__stdcall *main_ptr)()) {
HMODUILE h_dll;
h_dll=LoadLibrary("...");
main_ptr=GetAddressProc(h_dll, "startMain");
}

void main () {
char* (__stdcall *ptr)();
ptrFunc(ptr);
ptr();
}

 
Если сделать вызов ptr() в теле ф-ии ptrFunc - то всё работает. Когда же я делаю вызов в main - ответ
исключительная ситуация. В отладчике видно - что адрес ptr в main после вызова ptrFunc не меняется.
Т.е. в ptrFunc создаётся копия указателя. Почему так? Ведь указатели содержат адресс объекта и он не константный и должен по идее меняться! Что я здесь забыл или упустил?

Второй вопрос из той же оперы:

Код


void createGrig (TStringGrid *sg) {
sg=new TStringGrid (TForm1);
.......
какие то строки инициализации грида
.......
}

int main () {
TStringGrid *sg;
createGrid(sg);
ShowMessage(sg->Name);
}

данный код тоже не работает, именно в таком виде. Как и в прошлом примере, грид создаётся,
только в ф-ии main указатель на него не ссылается, хотя казалось бы, какая ему разница - он должен в ф-ии createGrid создать объект и присвоить ссылку указателю, который передавался параметром - ан нет, 
этого не происходить. Что не так?

PM MAIL   Вверх
Kuvaldis
Дата 31.7.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



040375, 
ВСЕ параметры в С++ передаются по значению
В твоем случае ты передаешь указатель. В стеке создается КОПИЯ этого указателя, который ты и модифицируешь. Но назад он же не возвращается.
В общем, передача указателей нужна для того, чтобы можно было ИЗМЕНИТЬ то, на что он указывает (а не сам указатель)
Выход: как вариант, использовать ссылки, т.е.
Код

void createGrig (TStringGrid *& sg)

А лучше просто возвращать валидный указатель


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Lazin
Дата 31.7.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Можно использовать указатель на указатель

Код

typedef char* (__stdcall *func_t)();

void ptrFunc (func_t* main_ptr) {
 HMODUILE h_dll;
 h_dll=LoadLibrary("...");
 *main_ptr=GetAddressProc(h_dll, "startMain");
}

void main () {
 func_t ptr;
 ptrFunc(&ptr);
 ptr();
}


код не проверял

Это сообщение отредактировал(а) Lazin - 31.7.2007, 16:11
PM MAIL Skype GTalk   Вверх
040375
Дата 31.7.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Я полагал, что ф-ия GetAddressProc вернёт не сам указатель - а значение его. Т.е. адрес самого указателя не изменится, а адрес ф-ии на которую он ссылается - изменится. Видимо я заблуждался.
Про указатель на указатель всё было понятно, не понятно почему не рабтоал именно такой код.
А в данном случае значит создавалась копия указателя, но ссылающегося на тот же адрес.
PM MAIL   Вверх
dumb
Дата 31.7.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(040375 @  31.7.2007,  17:01 Найти цитируемый пост)
Т.е. адрес самого указателя не изменится, а адрес ф-ии на которую он ссылается - изменится. Видимо я заблуждался.
Про указатель на указатель всё было понятно, не понятно почему не рабтоал именно такой код.
А в данном случае значит создавалась копия указателя, но ссылающегося на тот же адрес.

констатирую: бардак в голове на тему указателей. smile  устаканится со временем... smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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