Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции из указателя на класс. Проблемы с вызовом. 
:(
    Опции темы
myth777
  Дата 30.3.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня есть класс Class1
Есть еще один класс, хранящий массив указателей на Class1
Внем мне приспичило вызвать функцию из этих указателей.

$self->{Mas_mDsGUI}->[$i]->CallFunction();

Вобщем не работает. Как быть?
PM MAIL   Вверх
ginnie
Дата 30.3.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



myth777, я бы, на Вашем месте, написал текст сообщения об ошибке  smile тогда сразу бы посыпались предложения


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
myth777
Дата 30.3.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если вызываю метод
Код

print  $self->{Mas_mDsGUI}->[$i]->PrintOk();

то пишет
Software error:
Can't call method "PrintOk" on unblessed reference at C:/Server/wwwroot/cgi-bin/lib//group_DSGUI.pm line 149.


А вот если я печатаю     
Код

print $self->{Mas_mDsGUI}->[$i]->{Table};

То переменную Table он видит

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


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Цитата(myth777 @  30.3.2009,  17:29 Найти цитируемый пост)
Can't call method "PrintOk" on unblessed reference

означает, что ссылка не является объектом. Как Вы сохраняете объекты в массиве?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
myth777
Дата 30.3.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я понимаю что не является объектом.
Вот как заполняю.
Код

  push (@{$grDs->{Mas_mDsGUI}} ,   tbl_noid::GetInterphasemDSGUI());
  push (@{$grDs->{Mas_mDsGUI}} ,   noid_info::GetInterphasemDSGUI());



Код

sub  GetInterphasemDSGUI()
{
  my $mgui= mDSGUI->new();
  $mgui->init(\%has);
  return $mgui;
}


В таком случае все переменные класса mDSGUI, хранящиеся в его анонимном хэше видяться а функции нет. Причем если просто создаю класс 

Код

my $mg = mDSGUI->new() 


то из $mg  все нормально будет вызываться и видеться(переменные и функции)
Код

$mg->PrintOk();

будет работать

Добавлено через 3 минуты и 24 секунды
Вот как заполняю переменные mDSGUI
Код


  my $invocant = shift();
  my $class = ref($invocant) || $invocant;
  my $self = {};

  $self->{is_init}                     = undef;
  $self->{Filter}                      = undef;

  bless ($self, $class);
  return $self;

Или функции тоже нужно как то хитро заносить в self? 
Пробовал указатели сохранять в  self ничего хорошего из этого не получилось.
PM MAIL   Вверх
ginnie
Дата 30.3.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



myth777, покажите что хранится в массиве

Код

use Data::Dumper;
print Dumper($self->{Mas_mDsGUI});



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
myth777
Дата 30.3.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все выводить не стану много конфедец.
Код

bless( 
{ 'ModifedRecordStruc' => {}, 'Fields' => { 'house' => '(Integer)', 'street' => '(String)',  
'Table' => 'clients_addresses', 
 'is_init' => 1, 'ActiveTemplate' => undef }, 'mDSGUI' ), 



И таки х Bless-ов несоклько в массиве. Говорю же массив содержит указатели на классы.
Функциями в дампе и не пахнет. Мож их тоже как нибуть Bless-ить? smile))
PM MAIL   Вверх
ginnie
Дата 30.3.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



myth777, интересно Вы программу пишите с использованием объектов и так много про них не знаете.

То, что Вы привели - объект класса mDSGUI. Что такое "указатели на классы" мне не известно.
Для решения возникшей проблемы я бы добавил 

Код

warn $i;
warn ref $self->{Mas_mDsGUI}->[$i];
print  $self->{Mas_mDsGUI}->[$i]->PrintOk();



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
myth777
Дата 30.3.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Perl очень спецефический язык, на котором пишу всего  два месяца. Поэтому и не знаю многих вещей.
Ваш пример не работает.

Код

Can't call method "PrintOk" on unblessed reference at C:/Server/wwwroot/cgi-bin/lib//group_DSGUI.pm line 155.


Не видет он функцию и все тут. 
PM MAIL   Вверх
ginnie
Дата 30.3.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



myth777, код, который я привел и не должен был ничего починить. Он для отладки. Покажите последние строки до 

Код

Can't call method "PrintOk" on unblessed reference at C:/Server/wwwroot/cgi-bin/lib//group_DSGUI.pm line 155.


код должен вывести номер элемента массива и ссылкой на что этот элемент является.

Добавлено через 4 минуты и 25 секунд
Сообщение Can't call method "PrintOk" on unblessed reference означает, что элементом массива является ссылка, но структура данных (скорее всего хэш) по этой ссылке не является объектом. Нужно понять, как в массив попадает хэш, вместо объекта.

Добавлено через 6 минут и 27 секунд
Результат работы Dumper() показал, что часть элементов массива - нормальные объекты, следовательно надо узнать номер элемента массива, не являющегося объектом и узнать, как он туда попал.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
myth777
Дата 30.3.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Он только это и напечатал:

Код

Software error:
Can't call method "PrintOk" on unblessed reference at C:/Server/wwwroot/cgi-bin/lib//group_DSGUI.pm line 153.

 smile 

Код


может
sub GetInterphasemDSGUI
{
  my $mgui = mDSGUI->new();
  $mgui->init(\%has);
  return $mgui;
}

не работает? Типо как нибудь локально создает указатель на объект, а потом хрень какая нибудь в памяти получается?

PM MAIL   Вверх
NuINu
Дата 30.3.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



мне кажеться здесь простая проблема с приоритетом операций

можно попробовать так
Код

print  ${$self->{Mas_mDsGUI}->[$i]}->PrintOk();

PM MAIL   Вверх
myth777
Дата 30.3.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Шустрый - 
на
Код

   ${$self->{Mas_mDsGUI}->[$i]}->PrintOk();


выдает
Software error:
Not a SCALAR reference at C:/Server/wwwroot/cgi-bin/lib//group_DSGUI.pm line 154.

Добавлено через 11 минут и 51 секунду
Заработало. Нашел багу.
Я дурак. В конструкторе класса проинициализировал массив на указатели моего класса

Код

   @{$self->{Mas_mDsGUI}} = undef;  

Из за этого первым элементом массива была чушь. (пустой хэш)

Всем спасибо, за советы. Молодцы - отписываете! 
Форум в избранное добавил уже.
PM MAIL   Вверх
GoDleSS
Дата 31.3.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



myth777, не забываем пользоваться Data::Dumper - ом, дабы проще было анализировать подобные ситуации, ага ;)

Это сообщение отредактировал(а) GoDleSS - 3.4.2009, 11:17
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
myth777
Дата 31.3.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ага smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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