реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Генерация ошибки, Обработка ошибок на этапе компиляции/линковки
aspID
сообщение Sep 10 2007, 09:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 10 2007, 09:36
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 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(), пожалуйста, сколько угодно.
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 10 2007, 09:45
Сообщение #3


Местный
***

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



Цитата
в Method1(), пожалуйста, сколько угодно

Простую проверку внутри программы сделать проблем нет. Вопрос именно в возможности сгенерировать ошибку ДО получения файла прошивки. Что-то типа throw, что ли...
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 10 2007, 09:58
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(aspID @ Sep 10 2007, 13:45) *
Простую проверку внутри программы сделать проблем нет. Вопрос именно в возможности сгенерировать ошибку ДО получения файла прошивки. Что-то типа throw, что ли...

Вы переоцениваете компиляторы. Он не знает Ваших намерений.
Насчет throw, насколько я знаю, это тоже ловится во время выполнения.
Тестируйте, по возможности, в ОЗУ. Берите Dev.Board c максимальной RAM, тестируйте кусками - на вскидку больше ничего предложить не могу.
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 10 2007, 10:07
Сообщение #5


Местный
***

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



На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно smile.gif
Почему же переоцениваю? Ведь на уровне "variable x was defined but not used" справляется - здесь вроде не сложнее задача.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 10 2007, 10:30
Сообщение #6


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(aspID @ Sep 10 2007, 14:07) *
На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно smile.gif
Почему же переоцениваю? Ведь на уровне "variable x was defined but not used" справляется - здесь вроде не сложнее задача.

С переменными проще, чем с указателями.
Указатели всегда останутся за программистами или роботы нас со временем начнут эксплуатировать. Шутка.
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 10 2007, 10:47
Сообщение #7


Местный
***

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



Цитата
С переменными проще, чем с указателями.

Субъективное мнение или имеет под собой какую-то базу?
Я по принципу, что проще и экономичнее ссылаться куда-либо, чем хранить копию... В данном классе хранить непосредственно данные необходимости не возникает. Хотя, в конкретно данном опять же, случае что ссылка, что сам тип данных будут занимать один и тот же объем.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 10 2007, 10:51
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(aspID @ Sep 10 2007, 14:07) *
На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно smile.gif
Почему же переоцениваю? Ведь на уровне "variable x was defined but not used" справляется - здесь вроде не сложнее задача.


Если объект глобальный - ваши указатели проинициализированы нулями, даже если вы не сделали этого в конструкторе.
Чтобы выдать подобное предупреждение, компилятор должен проанализировать каждый вызов ф-ции Method1() и убедиться, что перед для этого объекта вызван метод Init(). В случае прерываний\многопоточности это наверное вообще невозможно... Да и как вы это объясните компилятору?
throw, безусловно, ловится только на этапе выполнения.
Кст, насколько я знаю, IAR исключения не поддерживает.
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 10 2007, 10:53
Сообщение #9


Местный
***

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



Цитата
насколько я знаю, IAR исключения не поддерживает

Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 10 2007, 11:27
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(aspID @ Sep 10 2007, 14:53) *
Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел

Версия для AVR не поддерживает точно - EWAVR_CompilerReference, стр. 189-190.
Насчет ARM не знаю.
Go to the top of the page
 
+Quote Post
tag
сообщение Sep 10 2007, 11:47
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(aspID @ Sep 10 2007, 14:07) *
На данном этапе проще (и правильнее, ИМХО) сделать конструктор с параметрами. На будущее интересно smile.gif
Почему же переоцениваю? Ведь на уровне "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) *
Думаю, Вы правы, поскольку в ЮзерГиде ничего по этому поводу не нашел





...а чем Вам не нравится вариант инициализации в кострукторе, ведь это хороший тон программирования?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 10 2007, 13:03
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Непомнящий Евгений @ Sep 10 2007, 14:27) *
Версия для AVR не поддерживает точно - EWAVR_CompilerReference, стр. 189-190.Насчет ARM не знаю.
Тоже нет. Во всяком случае в 4.хх


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 10 2007, 13:50
Сообщение #13


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, локально в функции или динамически в куче.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
aspID
сообщение Sep 10 2007, 15:22
Сообщение #14


Местный
***

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



Тогда здесь же вопрос к людям, имеющим в приложении к МК опыт бОльший, нежели я smile.gif
Куда лучше складировать данные классов - во флеш или в кучу? Понимаю, что зависит от ситуации, но может, направите на литературу, где можно про это найти.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 11 2007, 04:29
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(aspID @ Sep 10 2007, 19:22) *
Тогда здесь же вопрос к людям, имеющим в приложении к МК опыт бОльший, нежели я smile.gif
Куда лучше складировать данные классов - во флеш или в кучу? Понимаю, что зависит от ситуации, но может, направите на литературу, где можно про это найти.

Во флеш вы можете хранить только неизменяемые части данных, причем в классе придется предусмотреть указатель на эту неизменяемую часть. Это имеет смысл для классов с большим количеством "настроечной" информации, заранее известной на этапе компиляции - например, элементы пользовательского интерфейса.

Что касается кучи, ИМХО, лучше вобще не использовать, по крайней мере стандартную:
1. Сам не вникал, но много слышал, что стандартный менеджер памяти далек от идеала и при некоторых обстоятельствах может приводить к сильной дефрагментации кучи и как следствие - не будет свободного места.
2. Придется вручную оценить требуемый размер - т.е. проанализировать, сколько одновременно объектов может быть создано. При этом любое изменение программы потребует перерасчета.
3. Надо быть очень аккуратным с new и delete - иначе начнутся утечки памяти.
Поэтому лично я использую динамическое выделение памяти только для целей пользовательского интерфейса, причем свой собственный менеджер памяти, организованный на основе стека и заведомо не приводящий к проблемам дефрагментации.
Все остальные объекты я делаю глобальными \ статическими \ членами классов, экземпляры которых глобальны либо создаю в стеке. Это полностью убирает вышеуказанные проблемы.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016