Здравствуйте, 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>
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Tosha, Вы писали:
T>>Почему так происходит???
СМ>что такое SomeDate
СМ>где третий параметр в strcpy, на него и надо смотреть.
Что за третий параметр? Я пьян?
Здравствуйте, <Аноним>, Вы писали:
А>А описание структуры зачем внутри класса, да еще и без имени поля? А>И поосторожней бы ты был с передачей структур — ты создаешь копию, передавая не по указателю/ссылке. А>В функции ты просто заполняешь созданную в ней же структуру 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;
}
Здравствуйте, Tosha, Вы писали:
T>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>Здравствуйте, Tosha, Вы писали:
T>>>Почему так происходит???
СМ>>что такое SomeDate
СМ>>где третий параметр в strcpy, на него и надо смотреть. T>Что за третий параметр? Я пьян?
sorry не дописал, воспользуйся srncpy и там третий параметр! быстрей всего идет переписьЮ тюкю там нет 0 в конце строки
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Tosha, Вы писали:
T>>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>>Здравствуйте, Tosha, Вы писали:
T>>>>Почему так происходит???
СМ>>>что такое SomeDate
СМ>>>где третий параметр в strcpy, на него и надо смотреть. T>>Что за третий параметр? Я пьян?
СМ>sorry не дописал, воспользуйся srncpy и там третий параметр! быстрей всего идет переписьЮ тюкю там нет 0 в конце строки
Здравствуйте, 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.
Здравствуйте, 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 ?
Вообще странное поведение
Здравствуйте, Tosha, Вы писали:
B>>Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память. B>>Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy. T>Интересно..... А это может быть из-за размера dt.same_text, если он больше my_datatext1 ? T>Вообще странное поведение
размер не важен
strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется.
пользуй strncpy
Здравствуйте, 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>Вообще странное поведение
Что именно странно? Все тонкости, и связанные с ними странности описаны в документации
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Tosha, Вы писали:
B>>>Скорее всего dt.same_text не содержит терминирующего нуля, и strcpy просто перетирает "не свою" память. B>>>Используй strncpy или memcpy или руками вставляй терминирующий 0 перед использованием strcpy. T>>Интересно..... А это может быть из-за размера dt.same_text, если он больше my_datatext1 ? T>>Вообще странное поведение
СМ>размер не важен СМ>strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется. СМ>пользуй strncpy
Хорошо попробую...
Здравствуйте, 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>Что именно странно? Все тонкости, и связанные с ними странности описаны в документации
Здравствуйте, Tosha, Вы писали:
СМ>>размер не важен СМ>>strcpy копирует пока не встретит 0. а его может просто не быть, т.е. рано или поздно он будет (или GPF), но за это время все перетрется. СМ>>пользуй strncpy T>Хорошо попробую...