Sommer
Молодой специалист
Offline
|
|
« : 13-04-2004 06:12 » |
|
void BR::func(Rectangle* UpdateRectangle, const TYPE_T DT) { if (UpdateRectangle == 0) { switch (DT) { case DM: UpdateRectangle = &m_R; break; case DC: UpdateRectangle = &m_SecondaryR; break; default: break; } /* end of switch */ }
UpdateRectangle->Invalidate();
всем привет как по Вашему в строке UpdateRectangle->Invalidate(); может ли UpdateRectangle быть NULL, почему и в каких случаях?
|
|
« Последнее редактирование: 25-11-2007 17:04 от Алексей1153++ »
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 13-04-2004 07:35 » |
|
Бр.. Поправлюсь, ты имел ввиду, что может-ли параметр быт 0. В строке - нет, иначе ошибка. default может эту ошибку отсечь. А так может. Например вызов: Эту функцию можно вызывать или для Invalidate какого-то определённого прямоугольника. Или же объект решает сам, что он должен апдейтнуть. Если её определить след. образом: void func(const TYPE_T DT, Rectangle* UpdateRectangle = NULL)
то можно вызывать просто
|
|
« Последнее редактирование: 25-11-2007 17:04 от Алексей1153++ »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #2 : 13-04-2004 07:40 » |
|
например, если мы передадим в функцию NULL в качестве Rectangle* UpdateRectangle, то зайдем ли мы в if?.. там условие if (UpdateRectangle == 0) не получим ли exception?
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 13-04-2004 08:57 » |
|
С нулём проходят такие преобразования типов, "которые не снились нашим мудрецам". Мне например VisualAssist показывает кучу разных файлов где определён NULL, но все они сводятся к двум:
#define NULL 0
#define NULL ((void *)0)
так что прокатит в обоих случаях. Во всяком случае на VS прокатывает. А побольшому зависит от системы.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #4 : 13-04-2004 09:14 » |
|
Джон, спасибо это-то я и хотел узнать(про "0")
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Доброжелатель
Гость
|
|
« Ответ #5 : 13-04-2004 10:38 » |
|
void BR::func(Rectangle* UpdateRectangle, const TYPE_T DT) { if (UpdateRectangle == 0) { switch (DT) { case DM: UpdateRectangle = &m_R; break; case DC: UpdateRectangle = &m_SecondaryR; break; default: break; } /* end of switch */ }
UpdateRectangle->Invalidate();
всем привет как по Вашему в строке UpdateRectangle->Invalidate(); может ли UpdateRectangle быть NULL, Да может почему и в каких случаях? UpdateRectangle = NULL и DT != DM или DC. В результате, имеем разименовывание нулевого указателя => undefined behavior.
|
|
« Последнее редактирование: 25-11-2007 17:05 от Алексей1153++ »
|
Записан
|
|
|
|
grozny
Гость
|
|
« Ответ #6 : 14-04-2004 07:31 » |
|
по дефолту - надо б чё-то присвоить, ага. А то проверили, что нуль, и при этом если ни DM и ни DC, то нуль так и останется. Ну и "настоящие программисты" указатели всё-таки оператором ! сравнивают с нулём. И ваще, если m_R - основной случай, а m_SecondaryR - запасной, я бы написал так: (UpdateRectangle?((DT==DC)?&m_secondaryR:&m_R) ->Invalidate(); немного непонятно и не всякий компилятор съест (если нет, заменить -> на :UpdateRectangle)->, зато смотрится красиво :twisted: А если надо читать потом, то просто развернуть ?: в if-ы
|
|
|
Записан
|
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #7 : 14-04-2004 10:07 » |
|
поправьте пожалуйста меня, если я не прав я думаю что если в следующем коде в качестве второго параметра передать NULL то будут проблемы(например, NULL pointer exception) void * cpy (void *dest_ptr, const void *source_ptr, size_t count) { int i; const unsigned char *sp; unsigned char *dp;
if (count < 0x10000) { sp = ( const unsigned char * )source_ptr; dp = ( unsigned char * )dest_ptr; for (i=0; i<count; i++) { *dp++ = *sp++; } } return (dest_ptr); }
|
|
« Последнее редактирование: 25-11-2007 17:06 от Алексей1153++ »
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Serega
Гость
|
|
« Ответ #8 : 14-04-2004 11:24 » |
|
Вот так проблем не будет void* cpy(void* dest_ptr, void* source_ptr, size_t count) { unsigned char* dst = (unsigned char*)dest_ptr; unsigned char* src = (unsigned char*)source_ptr; if( count < 0x10000 ) while( dst && src && count ) { *dst++ = *src++; --count; } return dest_ptr; }
|
|
« Последнее редактирование: 25-11-2007 17:07 от Алексей1153++ »
|
Записан
|
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #9 : 14-04-2004 11:48 » |
|
Serega, нет функцию пока трогать нельзя
Вы мне лишь скажите прав я или нет?
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #10 : 14-04-2004 11:49 » |
|
Serega, спасибо
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #11 : 14-04-2004 12:39 » |
|
Sommer, Упрости вопрос, а то ты приводишь, скажем так, не лучший кусок кода, который содержит другие ошибки. Те если вопрос звучит, есть ли потенциальные ошибки в коде, то ответ - ДА. например она вылетит если размер буфера dest_ptr или source_ptr будет меньше чем count. она вылетит если хотя бы один из первых двух параметров (любой) будет равен 0 (или NULL) - *dp (*sp) не прокатит. Исключение составляет ситуация, если вызвать функцию копирования след. образом: cpy(0,0,0); - тут всё будет работать без ошибок
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Sommer
Молодой специалист
Offline
|
|
« Ответ #12 : 14-04-2004 13:47 » |
|
Sommerона вылетит если хотя бы один из первых двух параметров (любой) будет равен 0 (или NULL) - *dp (*sp) не прокатит вот это я и хотел услышать спасибо
|
|
|
Записан
|
когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины. но тогда меня уже не будет в этом городе forever yours.
|
|
|
|