|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.09.2012, 02:38 | #1 |
Пользователь
Регистрация: 06.07.2012
Сообщений: 13
|
Глобальная переменная сама обнуляется
Ув. форумчане, хочу вас спросить, т.к. опыта у самого мало (да вообще, самоучка). Только недавно узнал, что использование глобальных переменных это плохо и нужно по возможности описывать их локально, или, если надо, в каждой процедуре описывать.
У меня программа, несколько форм, на Form1, в разделе var "igraet: Byte;". Дальше в этой форме я активно работаю с этой переменной (значение она принимает от 0 до 4). И потом, ну, скажем, по таймеру на Form6 срабатывает другая процедура, которой нужно знать значение этой переменной... и вот тут проблема, как оказалась, примерно 1 раз из 20-30 переменная передается уже "0". Т.е. на форме1, после всех манипуляций я пишу: Код:
Код:
|
14.09.2012, 04:06 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
В этом и трабл глоб. переменных. Их нельзя контролировать.
Работают по принципу "Кто успел, тот и съел". |
14.09.2012, 08:10 | #3 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
И вообще зачем ты обращаешся к ней из другой формы.
I'm learning to live...
|
||
14.09.2012, 08:21 | #4 |
Homo Interneticus
Форумчанин
Регистрация: 04.03.2011
Сообщений: 611
|
DIMMUA прочтите статью GunSmoker-а Что плохого в глобальных переменных?
|
14.09.2012, 10:33 | #5 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Ну собственно говоря не такая уже она и глобальная. Это переменная формы, а форм у него несколько.
Цитата:
ТС, попробуй проставить бреакпоинты на те места, где твоя переменная приравнивается к нулю и прогони несколько раз свою прогу до наступления твоего случая.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
14.09.2012, 11:37 | #6 |
Homo Interneticus
Форумчанин
Регистрация: 04.03.2011
Сообщений: 611
|
Utkin, не судите о содержании по названию. В статье Александр предлагает несколько вариантов решения и избегания потенциальных проблем с глобальными переменными. Возможно ТС выберет какой-то вариант. Как уже писал Stilet, не стоит портить программиста с профессионального "младенчества".
|
14.09.2012, 14:44 | #7 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
14.09.2012, 14:56 | #8 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
DIMMUA, покажи немного кода. Не очень понятно, переменная у тебя или поле объекта.
Если это глобальная переменная, то быстро отследить проблему можно так: 1. Переименуй её (чтобы компилятор поймал все обращения к ней). 2. Введи функцию GetIsPlaying и процедуру SetIsPlaying. Понятно, что они должны делать? 3. Все обращения к переменной, которые тебе укажет компилятор (из-за п.1), замени или на GetIsPlaying или на SetIsPlaying. 4. Установи точку останова внутри SetIsPlaying. 5. Запусти программу и следи, кто вызывает SetIsPlaying. Это как быстрый фикс. Ну а вообще можно подумать насчёт улучшения кода.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
15.09.2012, 00:49 | #9 |
Пользователь
Регистрация: 06.07.2012
Сообщений: 13
|
Спасибо всем за советы!
Буду сейчас следовать всеми приведенными советами. Я понял, что глобальные переменные "Кто успел, тот и съел". Я вот что хочу узнать - "Может ли Windows испортить мою переменную от того что она глобальная, а не локальная?" и, кстати, после прочтения статьи GunSmoker-а "Что плохого в глобальных переменных?" я решил создать тему, т.к. моих знаний хватило, чтобы поверхностно понять о чем речь. Вот немножко кода, не знаю, поможет ли он вам: Переменная играет, прнимает разные значение в зависимости от: 0 - ничего не играет 1 – играет музыкальный фон 2 – играет заказанная музыка 4 – играет заказанная клип Код:
|
15.09.2012, 06:09 | #10 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Глобальная переменная | winhttp | C# (си шарп) | 15 | 20.07.2016 16:03 |
Обнуляется переменная | Leonid183 | Visual C++ | 0 | 27.10.2011 16:06 |
Глобальная переменная | mutabor | JavaScript, Ajax | 2 | 31.12.2010 12:23 |
Обнуляется переменная | Hippie | Помощь студентам | 1 | 09.01.2010 20:22 |
C++ [Глобальная переменная] | Lemo | Помощь студентам | 2 | 26.10.2009 17:49 |