|
Генерация ошибки, Обработка ошибок на этапе компиляции/линковки |
|
|
|
Sep 10 2007, 09:18
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Есть класс: Код class My_Class { private: unsigned char * cPort; unsigned char * cMask; public: My_Class() {}; ~My_Class() {}; Init(char * cPort, char * cMask); int Method1(); }; Интересует, скажем, при вызове Method1() проверять, а проинициализированы ли указатели или они NULL и выдавать ошибку. Насколько это возможно именно на этапе компиляции/линковки? Обходной путь на данный момент не интересует, хотя он довольно прост: создать сразу конструктор с параметрами и "не париться". Стормозил на уровне браузера, просьба администриторов удалить одну тему.
Сообщение отредактировал aspID - Sep 10 2007, 09:19
|
|
|
|
|
Sep 10 2007, 09:36
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(aspID @ Sep 10 2007, 13:18)  Есть класс: Код class My_Class { private: unsigned char * cPort; unsigned char * cMask; public: My_Class() {}; ~My_Class() {}; Init(char * cPort, char * cMask); int Method1(); }; Интересует, скажем, при вызове Method1() проверять, а проинициализированы ли указатели или они NULL и выдавать ошибку. Насколько это возможно именно на этапе компиляции/линковки? На этапе компиляции нельзя, будет ли создан класс, будут ли проинициализированы указатели - это выясняется во время выполнения. А проверять в Method1(), пожалуйста, сколько угодно.
|
|
|
|
|
Sep 10 2007, 09:45
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата в Method1(), пожалуйста, сколько угодно Простую проверку внутри программы сделать проблем нет. Вопрос именно в возможности сгенерировать ошибку ДО получения файла прошивки. Что-то типа throw, что ли...
|
|
|
|
|
Sep 10 2007, 09:58
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(aspID @ Sep 10 2007, 13:45)  Простую проверку внутри программы сделать проблем нет. Вопрос именно в возможности сгенерировать ошибку ДО получения файла прошивки. Что-то типа throw, что ли... Вы переоцениваете компиляторы. Он не знает Ваших намерений. Насчет throw, насколько я знаю, это тоже ловится во время выполнения. Тестируйте, по возможности, в ОЗУ. Берите Dev.Board c максимальной RAM, тестируйте кусками - на вскидку больше ничего предложить не могу.
|
|
|
|
|
Sep 10 2007, 10:47
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата С переменными проще, чем с указателями. Субъективное мнение или имеет под собой какую-то базу? Я по принципу, что проще и экономичнее ссылаться куда-либо, чем хранить копию... В данном классе хранить непосредственно данные необходимости не возникает. Хотя, в конкретно данном опять же, случае что ссылка, что сам тип данных будут занимать один и тот же объем.
|
|
|
|
|
Sep 10 2007, 10:51
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(aspID @ Sep 10 2007, 14:07)  На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно Почему же переоцениваю? Ведь на уровне "variable x was defined but not used" справляется - здесь вроде не сложнее задача. Если объект глобальный - ваши указатели проинициализированы нулями, даже если вы не сделали этого в конструкторе. Чтобы выдать подобное предупреждение, компилятор должен проанализировать каждый вызов ф-ции Method1() и убедиться, что перед для этого объекта вызван метод Init(). В случае прерываний\многопоточности это наверное вообще невозможно... Да и как вы это объясните компилятору? throw, безусловно, ловится только на этапе выполнения. Кст, насколько я знаю, IAR исключения не поддерживает.
|
|
|
|
|
Sep 10 2007, 10:53
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Цитата насколько я знаю, IAR исключения не поддерживает Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел
|
|
|
|
|
Sep 10 2007, 11:27
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(aspID @ Sep 10 2007, 14:53)  Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел Версия для AVR не поддерживает точно - EWAVR_CompilerReference, стр. 189-190. Насчет ARM не знаю.
|
|
|
|
|
Sep 10 2007, 11:47
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(aspID @ Sep 10 2007, 14:07)  На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно Почему же переоцениваю? Ведь на уровне "variable x was defined but not used" справляется - здесь вроде не сложнее задача. ...намного сложнее. Когда используется уровень "variable x was defined but not used" компилятор просто просматривает текст чтобы определить используется где-либо объявленное имя или нет. В вашем случае ему бы пришлось еще анализировать и алгоритм реализованный в программе (задача не тривиальная)...например на предмет неявных присваиваний: class anyclass { unsigned char* pointer; ... }; anyclass a, b; a = b; Цитата(aspID @ Sep 10 2007, 14:53)  Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел ...а чем Вам не нравится вариант инициализации в кострукторе, ведь это хороший тон программирования?
|
|
|
|
|
Sep 10 2007, 13:50
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(aspID @ Sep 10 2007, 16:18)  Интересует, скажем, при вызове Method1() проверять, а проинициализированы ли указатели или они NULL и выдавать ошибку. Кто такое NULL? Цитата(aspID @ Sep 10 2007, 16:18)  Обходной путь на данный момент не интересует, хотя он довольно прост: создать сразу конструктор с параметрами и "не париться". Через конструктор - это как раз прямой путь. А вот все остальные - обходные. Цитата(Непомнящий Евгений @ Sep 10 2007, 17:51)  Если объект глобальный - ваши указатели проинициализированы нулями, даже если вы не сделали этого в конструкторе. По факту это так, но лучше все же инициализацию объектов класс-типов делать через конструктор, чтобы их инициализация не зависела от того, где этот объект создан - в глобальной scope, локально в функции или динамически в куче.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 11 2007, 04:29
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(aspID @ Sep 10 2007, 19:22)  Тогда здесь же вопрос к людям, имеющим в приложении к МК опыт бОльший, нежели я  Куда лучше складировать данные классов - во флеш или в кучу? Понимаю, что зависит от ситуации, но может, направите на литературу, где можно про это найти. Во флеш вы можете хранить только неизменяемые части данных, причем в классе придется предусмотреть указатель на эту неизменяемую часть. Это имеет смысл для классов с большим количеством "настроечной" информации, заранее известной на этапе компиляции - например, элементы пользовательского интерфейса. Что касается кучи, ИМХО, лучше вобще не использовать, по крайней мере стандартную: 1. Сам не вникал, но много слышал, что стандартный менеджер памяти далек от идеала и при некоторых обстоятельствах может приводить к сильной дефрагментации кучи и как следствие - не будет свободного места. 2. Придется вручную оценить требуемый размер - т.е. проанализировать, сколько одновременно объектов может быть создано. При этом любое изменение программы потребует перерасчета. 3. Надо быть очень аккуратным с new и delete - иначе начнутся утечки памяти. Поэтому лично я использую динамическое выделение памяти только для целей пользовательского интерфейса, причем свой собственный менеджер памяти, организованный на основе стека и заведомо не приводящий к проблемам дефрагментации. Все остальные объекты я делаю глобальными \ статическими \ членами классов, экземпляры которых глобальны либо создаю в стеке. Это полностью убирает вышеуказанные проблемы.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|