Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 10:43
Оценка:
Приветствую!

Есть класс:
class A
{
    private:
        struct data
        {
            short t[10];
            char text1[256];
            char text2[256];
            char text3[256];
        };
        HANDLE h1;
        HANDLE h2;
    public:
    bool WriteBlock(SomeData dt);
};
bool A:WriteBlock(SomeData dt)
{
    struct data my_data;
    my_data.t[0]=dt.s1;
     и т.д
    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
    strcpy(my_data.text1,dt.same_text);    
    //ВСЁ, переменные h1 и h2 невалидны!
    return true;
}


Как только сделал так, то всё заработало:

struct data
        {
            short t[10];
            char text1[256];
            char text2[256];
            char text3[256];
        };
сlass A
{
    private:
        struct data my_data;
        HANDLE h1;
        HANDLE h2;
    public:
    bool WriteBlock(SomeData dt);
};        
bool A:WriteBlock(SomeData dt)
{
    //struct data my_data;
    ....
}


Почему так происходит???
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Чем объяснить умирание переменной?
От: Сергей Мухин Россия  
Дата: 28.06.05 10:53
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Почему так происходит???


что такое SomeDate

где третий параметр в strcpy, на него и надо смотреть.
---
С уважением,
Сергей Мухин
Re: Чем объяснить умирание переменной?
От: Аноним  
Дата: 28.06.05 10:55
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Приветствую!


T>Есть класс:

T>
T>class A
T>{
T>    private:
T>        struct data
T>        {
T>            short t[10];
T>            char text1[256];
T>            char text2[256];
T>            char text3[256];
T>        };
T>        HANDLE h1;
T>        HANDLE h2;
T>    public:
T>    bool WriteBlock(SomeData dt);
T>};
T>bool A:WriteBlock(SomeData dt)
T>{
T>    struct data my_data;
T>    my_data.t[0]=dt.s1;
T>     и т.д
T>    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
T>    strcpy(my_data.text1,dt.same_text);    
T>    //ВСЁ, переменные h1 и h2 невалидны!
T>    return true;
T>}
T>


А описание структуры зачем внутри класса, да еще и без имени поля?
И поосторожней бы ты был с передачей структур — ты создаешь копию, передавая не по указателю/ссылке.
В функции ты просто заполняешь созданную в ней же структуру my_data.. каким местом тут h1 и h2 из кода не видно..

T>Как только сделал так, то всё заработало:


T>
T>struct data
T>        {
T>            short t[10];
T>            char text1[256];
T>            char text2[256];
T>            char text3[256];
T>        };
T>сlass A
T>{
T>    private:
T>        struct data my_data;
T>        HANDLE h1;
T>        HANDLE h2;
T>    public:
T>    bool WriteBlock(SomeData dt);
T>};        
T>bool A:WriteBlock(SomeData dt)
T>{
T>    //struct data my_data;
T>    ....
T>}
T>


T>Почему так происходит???
Re[2]: Чем объяснить умирание переменной?
От: Аноним  
Дата: 28.06.05 10:58
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>где третий параметр в strcpy, на него и надо смотреть.


3й? в strcpy?
Re[2]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 10:59
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Tosha, Вы писали:


T>>Почему так происходит???


СМ>что такое SomeDate


СМ>где третий параметр в strcpy, на него и надо смотреть.

Что за третий параметр? Я пьян?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[2]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А описание структуры зачем внутри класса, да еще и без имени поля?

А>И поосторожней бы ты был с передачей структур — ты создаешь копию, передавая не по указателю/ссылке.
А>В функции ты просто заполняешь созданную в ней же структуру my_data.. каким местом тут h1 и h2 из кода не видно..

h1=CreateFile(...), h2 аналогично.

Вопрос был не в этом.
Почему при описании структуры вынутри класса и после вызова strcpy(my_data.text1,dt.same_text) обнуляются переменные h1 и h2 ?
bool A:WriteBlock(SomeData dt)
{
    struct data my_data;
    my_data.t[0]=dt.s1;
     и т.д
    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
    strcpy(my_data.text1,dt.same_text);    
    //ВСЁ, переменные h1 и h2 невалидны!
    return true;
}
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[3]: Чем объяснить умирание переменной?
От: Сергей Мухин Россия  
Дата: 28.06.05 11:03
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>Здравствуйте, Tosha, Вы писали:


T>>>Почему так происходит???


СМ>>что такое SomeDate


СМ>>где третий параметр в strcpy, на него и надо смотреть.

T>Что за третий параметр? Я пьян?

sorry не дописал, воспользуйся srncpy и там третий параметр! быстрей всего идет переписьЮ тюкю там нет 0 в конце строки
---
С уважением,
Сергей Мухин
Re[4]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:05
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Tosha, Вы писали:


T>>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>>Здравствуйте, Tosha, Вы писали:


T>>>>Почему так происходит???


СМ>>>что такое SomeDate


СМ>>>где третий параметр в strcpy, на него и надо смотреть.

T>>Что за третий параметр? Я пьян?

СМ>sorry не дописал, воспользуйся srncpy и там третий параметр! быстрей всего идет переписьЮ тюкю там нет 0 в конце строки


Чего-то я такой функции в MSDN не нашёл...
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Чем объяснить умирание переменной?
От: Сергей Мухин Россия  
Дата: 28.06.05 11:06
Оценка:
Здравствуйте, Tosha, Вы писали:

СМ>>Здравствуйте, Tosha, Вы писали:



T>Чего-то я такой функции в MSDN не нашёл...


strncpy
---
С уважением,
Сергей Мухин
Re: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:22
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Приветствую!


T>Есть класс:

T>
T>class A
T>{
T>    private:
T>        struct data
T>        {
T>            short t[10];
T>            char text1[256];
T>            char text2[256];
T>            char text3[256];
T>        };
T>        HANDLE h1;
T>        HANDLE h2;
T>    public:
T>    bool WriteBlock(SomeData dt);
T>};
T>bool A:WriteBlock(SomeData dt)
T>{
T>    struct data my_data;
T>    my_data.t[0]=dt.s1;
T>     и т.д
T>    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
T>    strcpy(my_data.text1,dt.same_text);    
T>    //ВСЁ, переменные h1 и h2 невалидны!
T>    return true;
T>}
T>


T>Как только сделал так, то всё заработало:


T>
T>struct data
T>        {
T>            short t[10];
T>            char text1[256];
T>            char text2[256];
T>            char text3[256];
T>        };
T>сlass A
T>{
T>    private:
T>        struct data my_data;
T>        HANDLE h1;
T>        HANDLE h2;
T>    public:
T>    bool WriteBlock(SomeData dt);
T>};        
T>bool A:WriteBlock(SomeData dt)
T>{
T>    //struct data my_data;
T>    ....
T>}
T>


T>Почему так происходит???


A вот gcc 3.4.2 компилит и то и то
Я чего-то не догоняю....
Спасибо за внимание
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Чем объяснить умирание переменной?
От: Bell Россия  
Дата: 28.06.05 11:26
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Приветствую!


T>Есть класс:

T>
T>    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
T>    strcpy(my_data.text1,dt.same_text);    
T>    //ВСЁ, переменные h1 и h2 невалидны!
T>}
T>



T>Почему так происходит???


Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память.
Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:30
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Tosha, Вы писали:


T>>Приветствую!


T>>Есть класс:

T>>
T>>    //После этого присваивания h1!=h2!=INVALID_HANDLE_VALUE
T>>    strcpy(my_data.text1,dt.same_text);    
T>>    //ВСЁ, переменные h1 и h2 невалидны!
T>>}
T>>



T>>Почему так происходит???


B>Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память.

B>Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy.
Интересно..... А это может быть из-за размера dt.same_text, если он больше my_datatext1 ?
Вообще странное поведение
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[3]: Чем объяснить умирание переменной?
От: Сергей Мухин Россия  
Дата: 28.06.05 11:34
Оценка:
Здравствуйте, Tosha, Вы писали:

B>>Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память.

B>>Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy.
T>Интересно..... А это может быть из-за размера dt.same_text, если он больше my_datatext1 ?
T>Вообще странное поведение

размер не важен
strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется.
пользуй strncpy
---
С уважением,
Сергей Мухин
Re[3]: Чем объяснить умирание переменной?
От: Bell Россия  
Дата: 28.06.05 11:35
Оценка: +1
Здравствуйте, Tosha, Вы писали:

T>Интересно..... Еще бы


T>А это может быть из-за размера dt.same_text, если он больше my_datatext1 ?

Конечно. Вот отрывок из доки по strcpy:

Security Note
Because strcpy does not check for sufficient space in strDestination
before copying strSource, it is a potential cause of buffer overruns.
Consider using strncpy instead.


T>Вообще странное поведение

Что именно странно? Все тонкости, и связанные с ними странности описаны в документации
Любите книгу — источник знаний (с) М.Горький
Re[4]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:35
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Tosha, Вы писали:


B>>>Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память.

B>>>Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy.
T>>Интересно..... А это может быть из-за размера dt.same_text, если он больше my_datatext1 ?
T>>Вообще странное поведение

СМ>размер не важен

СМ>strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется.
СМ>пользуй strncpy
Хорошо попробую...
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[4]: Чем объяснить умирание переменной?
От: Tosha Россия  
Дата: 28.06.05 11:37
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Tosha, Вы писали:


T>>Интересно..... Еще бы


T>>А это может быть из-за размера dt.same_text, если он больше my_datatext1 ?

B>Конечно. Вот отрывок из доки по strcpy:

B>

B>Security Note
B>Because strcpy does not check for sufficient space in strDestination
B>before copying strSource, it is a potential cause of buffer overruns.
B>Consider using strncpy instead.


T>>Вообще странное поведение

B>Что именно странно? Все тонкости, и связанные с ними странности описаны в документации

Хи, хи.... Прикольно... Спасибо что ткнули носом
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Чем объяснить умирание переменной?
От: Сергей Мухин Россия  
Дата: 28.06.05 11:45
Оценка:
Здравствуйте, Tosha, Вы писали:

СМ>>размер не важен

СМ>>strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется.
СМ>>пользуй strncpy
T>Хорошо попробую...

а еще есть StringCchCopy/StringCchCopyEx
---
С уважением,
Сергей Мухин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.