Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) CSafeModulePtr : попытка обращения к указателю NUL (число прочтений - 16359 )
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #15 - 29. Октября 2007 :: 09:43
Печать  
Arta писал(а) 29. Октября 2007 :: 09:34:
Проще тогда сделать свойство класса и после создания класса присваивать контекст ему.

Так и приходится делать...
К сожалению, у меня в конструкторе читаются настройки, "имя" которых составляется из параметров контекста...
т.о. для инициализации класса приходится выполнять код, который удобно (и логично) было бы расположить в конструкторе, но нельзя, так как в конструктор не передаются параметры Печаль
Кроме того, приходится вносить понятие "Созданый класс, который пока нельзя использовать, так как он не иницализирован" Печаль и пинать Except-ами всех, кто пытается его использовать, а это лишние проверки в коде...
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #16 - 29. Октября 2007 :: 09:59
Печать  
Добавил предложение в ветку Артура Улыбка
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #17 - 29. Октября 2007 :: 10:29
Печать  
А почему бы не сделать такую функцию?

Код
Выбрать все
Функция СоздатьОбъектКласса(ИмяКласса, Параметр)
	ЭкземплярКласса = СоздатьОбъект(ИмяКласса);
	ЭкземплярКласса.Инит(Параметр);
	Возврат ЭкземплярКласса;
КонецФункции 



При желании можно сделать даже переменное число параметров.
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #18 - 29. Октября 2007 :: 10:38
Печать  
sedmin писал(а) 29. Октября 2007 :: 10:29:
А почему бы не сделать функцию?

Можно, но это всё равно внешнее решение и оно не снимает вышеописаных недостатков.
Правда в коде лучше выглядит Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #19 - 29. Октября 2007 :: 10:49
Печать  
slider26 писал(а) 29. Октября 2007 :: 10:38:
sedmin писал(а) 29. Октября 2007 :: 10:29:
А почему бы не сделать функцию?

Можно, но это всё равно внешнее решение и оно не снимает вышеописаных недостатков.
Правда в коде лучше выглядит Улыбка

Нормально, кстати; это называется виртуальный конструктор. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #20 - 29. Октября 2007 :: 12:30
Печать  
slider26 писал(а) 29. Октября 2007 :: 09:21:
Если бы можно было передавать параметры конструктору Печаль
Было бы классно, если бы можно было перехватить СоздатьОбъект например так:
Код
Выбрать все
ЭкземплярКласса = СоздатьОбъект("МойКласс",Контекст,Форма);
 


Да и перегрузка конструкторов с разным количеством параметров - это была бы вещь!!!
Реально ли сделать что-то подобное?

Подобное уже давно сделано - т.е. давно реализована подобная схема для создания классов со специализированными конструкторами, которых может быть любое количество Улыбка
Тебе же дали ссылку на ФабрикуОбъектов, неужели не почитал? Печаль
Еще раз - http://www.1cpp.ru/docum/html/extobjs.html#id8
Код
Выбрать все
ОбъектКОП = глФабрика. Новый ("КлассСКонструкторами", "КонструкторБезПараметров");
ОбъектКОП = глФабрика. Новый ("КлассСКонструкторами", "КонструкторCКоличествомПараметров2", 1, 2); 


где глФабрика - это твой собственный глобальный объект типа ФабрикаОбъектов.

А если хочешь запретить создание класса без соответствующей инициализации, юзай след.код
Код класса
Код
Выбрать все
Процедура Конструктор()
  Сам()._ВыброситьИскл("Объект нельзя создавать с помощью СоздатьОбъект");
КонецПроцедуры
Процедура НужныйКонструктор(Парам1, Парам2, ..., ПарамН)
// необходимый код
КонецПроцедуры
 


В этом случае объект класса нельзя будет создать через СоздатьОбъект("ИмяКласса"), а можно будет только через глФабрика.Новый(...)
ЗЫ А изменить синтаксис СоздатьОбъект пока нельзя, потому что будет синтакс-ошибка на это зарезервированное слово Печаль

ЗЗЫ только в 2.5 Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #21 - 29. Октября 2007 :: 12:31
Печать  
lustin писал(а) 28. Октября 2007 :: 06:54:
Цитата:
RuntimeError CSafeModulePtr : попытка обращения к указателю NULL


Подобная ошибка наблюдается у меня при включении опции Отладчика в 1С++.
Конфигурации СКАТ (www.33lab.ru)

Это мой код.
Подробнее можешь про момент возникновения ошибки рассказать.
Или тест выложи Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #22 - 29. Октября 2007 :: 12:41
Печать  
slider26 писал(а) 29. Октября 2007 :: 05:21:
Arta писал(а) 28. Октября 2007 :: 18:03:
ПолучитьКонтекстОкружения - вроде как поддерживаться не будет и не рекомендован к использованию.

И как без него ???:
Код
Выбрать все
КонтОбъекта = GetThis(Контекст).ПолучитьКонтекстОкружения();
Форма = КонтОбъекта.Форма;
 


Да, метод КОП::ПолучитьКонтекстОкружения() имеет кучу ограничений Печаль и не рекомендуется к использованию.
1) Название метода несколько неудачно, т.к. на самом деле возвращается контекст, в котором объект был создан, а не контекст, из которого вызвали текущий метод объекта.
2) И хотя в 2.5 я исправил большинство падений 1С, связанных с этим методом, как видите, кое-что осталось Улыбка
В режиме отладки я метод не тестил, соответственно поведение не гарантировано Печаль
В более ранних релизах этот метод вообще практически не работоспособен, и почти всегда приводил к падению 1С.

3) Использование данного метода приводит к неявному поведению класса, соответственно, класс становится сильно зависимым от контекста, в котором он создается/запускается Печаль

Поэтому самый простой и надежный путь - использовать явную передачу контекста, в котором должен выполняться класс. Например, с помощью постконструкторов или спец.конструкторов через метод ФабрикаОбъектов::Новый()
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #23 - 31. Октября 2007 :: 04:02
Печать  
artbear писал(а) 29. Октября 2007 :: 12:31:
lustin писал(а) 28. Октября 2007 :: 06:54:
Цитата:
RuntimeError CSafeModulePtr : попытка обращения к указателю NULL


Подобная ошибка наблюдается у меня при включении опции Отладчика в 1С++.
Конфигурации СКАТ (www.33lab.ru)

Это мой код.
Подробнее можешь про момент возникновения ошибки рассказать.
Или тест выложи Улыбка



Артур, доброе утро. Ошибка возникает при простейших действиях:
1. Загружаем СКАТ
2. Включаем ОТладчик 1С++
3. Открываем Форму списка Номенклатура.
4. Открываем Форму любого элемента.

Ошибка возникает при вызове методов класса Модуль.Характеристики.
Отладчик VS показывает - Анализ модуля на препроцессор прошло успешно, как и его компиляция.

А вот при вызове метода ПолучитьКонтекстОкружения() возникает ошибка. После этого где-то дальше идет вызов метода класса который приводит к ошибке озвученной в теме.
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #24 - 31. Октября 2007 :: 14:35
Печать  
Тут скорее всего, идет баг с отложенным показом исключений в режиме отладки Печаль
Т.е. на самом деле текст исключения не соответствует ошибке Печаль
Что делать, пока не знаю.
Повторить на чистом тесте также не получается Улыбка
Буду думать.

Пока могу сказать - используйте не ПолучитьКонтекстОкружения, а прямую передачу контекста в класс.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: CSafeModulePtr : попытка обращения к указателю
Ответ #25 - 21. Октября 2009 :: 11:04
Печать  
artbear писал(а) 29. Октября 2007 :: 12:30:
Код
Выбрать все
ОбъектКОП = глФабрика. Новый ("КлассСКонструкторами", "КонструкторБезПараметров");
ОбъектКОП = глФабрика. Новый ("КлассСКонструкторами", "КонструкторCКоличествомПараметров2", 1, 2); 



А это не работает при наследовании или я неправильно что-то делаю?
Т.е., если
DefCls.ert
Код
Выбрать все
Класс MyBaseCls = MyBaseCls@MD {};
Класс MyInhCls  = MyInhCls@MD : MyBaseCls{};
 



MyBaseCls.ert
Код
Выбрать все
//==============================================
Процедура Конструктор()
	//#curmeth

КонецПроцедуры	// Конструктор
//==============================================
Процедура _Конструктор(пар1,пар2)
	//#curmeth

КонецПроцедуры	// _Конструктор
//==============================================
 



MyInhCls.ert
Код
Выбрать все
//==============================================
Процедура Конструктор()
	//#curmeth
	//вирт()._ВыброситьИскл("Исключение из конструтора без параметров");
КонецПроцедуры	// Конструктор
 



Создание
Код
Выбрать все
	ФабрикаОбъектов = СоздатьОбъект("ФабрикаОбъектов");
	MyObj = ФабрикаОбъектов.Новый("MyInhCls","_Конструктор",1,2);
 



получаю
i >>> MyBaseCls::Конструктор()
err >>> MyObj = ФабрикаОбъектов.Новый("MyInhCls","_Конструктор",1,2);
{}: В модуле класса <MyInhCls> не удалось найти процедуру-конструктор <_Конструктор>

Ну т.е., получается в классе-потомке метода _Конструктор() нет, но он есть в базовом классе. Но не вызывается.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: CSafeModulePtr : попытка обращения к указателю NUL
Ответ #26 - 21. Октября 2009 :: 20:43
Печать  
Все нормально.
Для базового вызывается конструктор по умолчанию.
Для наследника вызвать инит-функцию "_Конструктор" не может, тк она не объявлена Экспорт.

Ну а так - хотите классов с честными конструкторами?
Их есть у меня.
И они даже могут работать параллельно с 1С++
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: CSafeModulePtr : попытка обращения к указателю NUL
Ответ #27 - 22. Октября 2009 :: 09:27
Печать  
мда, действительно, все правильно работает. На C++ при аналогичной структуре классов работает аналогично, проверил на всякий. Чет я непонятно чего хотел, прошу прощенияУлыбка
orefkov писал(а) 21. Октября 2009 :: 20:43:
Ну а так - хотите классов с честными конструкторами?
Их есть у меня.
И они даже могут работать параллельно с 1С++

Хотим, конечно! Очень интересноУлыбка
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: CSafeModulePtr : попытка обращения к указателю NUL
Ответ #28 - 23. Октября 2009 :: 11:56
Печать  
Ну вот попробуйте, побалуйтесь.
Не знаю даже, запустится ли это Улыбка
Примеров классов пока нет.
В режиме Конфигуратора не доделан путный синтакс-контроль.

Компонента позволяет создавать свои классы, реализованные на языке 1С.
Возможности:

- Наследование, как от классов, так и от объектов 1С.
  Поддерживается множественное и виртуальное наследование.
- Инкапсуляция - позволяет управлять доступом к методам и свойствам классов
  по схеме public protected private.
- Полиморфизм - позволяет переопределять методы базовых классов в наследниках,
  с возможностью обратиться к переопределенному методу как "снаружи" (при работе
  с объектом класса-наследника), так и "изнутри" (из базового класса вызвать
  переопределенный метод наследника, но только public методы)
- Прямое обращение к методам и свойстам базовых классов из наследников, без
  получения объекта базового класса.
- Конструкторы и деструкторы. Конструкторов может быть много, с параметрами и тп.
- Методы - обработчики при чтении/записи полей класса.
- Работа с динамическими полями класса.
- Статические модули/классы
- Ряд встроенных объектов и методов.
- Препроцессорная обработка модулей 1С и классов, включая ГМ.
  

OpenV7_and_1Class_.zip ( 296 KB | Загрузки )
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: CSafeModulePtr : попытка обращения к указателю NUL
Ответ #29 - 25. Октября 2009 :: 20:05
Печать  
я в шоке!

скока же у тебя часов в сутках?

еще не трогал- тока прочел 1Class.txt
(надо еще не раз наверное почитать)
но что-то радужное впереди так озарилось   Подмигивание
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать