Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: разберемся с указателем?  (Прочитано 12051 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sommer
Молодой специалист

us
Offline 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.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 13-04-2004 07:35 » new

Бр.. Поправлюсь, ты имел ввиду, что может-ли параметр быт 0.
В строке - нет, иначе ошибка. default может эту ошибку отсечь.

А так может.  Например вызов:

Код:
BR br;
br.func(NULL, DM);

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

Если её определить след. образом:
Код:
void func(const TYPE_T DT, Rectangle* UpdateRectangle = NULL)

то можно вызывать просто

Код:
BR br;
br.func(DM);
« Последнее редактирование: 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
Молодой специалист

us
Offline Offline

« Ответ #2 : 13-04-2004 07:40 » 

например, если мы передадим в функцию NULL в качестве Rectangle* UpdateRectangle, то зайдем ли мы в if?..
там условие  if (UpdateRectangle == 0)
не получим ли exception?
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Джон
просто
Администратор

de
Offline 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
Молодой специалист

us
Offline Offline

« Ответ #4 : 13-04-2004 09:14 » 

Джон,
спасибо
это-то я и хотел узнать(про "0")
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Доброжелатель
Гость
« Ответ #5 : 13-04-2004 10:38 » 

Цитата: Sommer
Код:
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,
Да может
Цитата: Sommer
почему и в каких случаях?
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
Молодой специалист

us
Offline 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
Молодой специалист

us
Offline Offline

« Ответ #9 : 14-04-2004 11:48 » 

Serega,
нет
функцию пока трогать нельзя

Вы мне лишь скажите прав я или нет?
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Sommer
Молодой специалист

us
Offline Offline

« Ответ #10 : 14-04-2004 11:49 » 

Serega,
спасибо
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Джон
просто
Администратор

de
Offline 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
Молодой специалист

us
Offline Offline

« Ответ #12 : 14-04-2004 13:47 » 

Цитата: Джон
Sommerона вылетит если хотя бы один из первых двух параметров (любой) будет равен 0 (или NULL) - *dp (*sp) не прокатит


вот это я и хотел услышать
спасибо  Улыбаюсь
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines