Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Нелепая ошибка в локальной переменной

18.07.2013, 15:25. Показов 2667. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И так: Пишу на Visual C++ под Winapi.

Создал диалог, в него поместил локальную переменную:
C++
1
bool VCam=0;
Создал кнопку. Привязал код к кнопке:
C++
1
2
3
4
5
6
7
8
9
if(VCam==1)
{
MessageBox(hDvc, "1", "Успех!", MB_OK);
}
if(VCam==0)
{
VCam=1;
MessageBox(hDvc, "0", "Успех!", MB_OK);
}
Задача - при повторном нажатии кнопки - чтоб выводилось "1".
А не выводится нифига! Всегда "0". Не понимаю в чём дело, хоть головой об стену бейся.

Собственно в чём может быть ошибка то ?

П.с.
если меняю код местами:
C++
1
2
3
4
5
6
7
8
9
if(VCam==0)
{
VCam=1;
MessageBox(hDvc, "0", "Успех!", MB_OK);
}
if(VCam==1)
{
MessageBox(hDvc, "1", "Успех!", MB_OK);
}
То в результате - сначало пишется "0", а потом "1", т.е. в нутри работает, но как только нажимаю на кнопку повторно - опять такое же. Т.е. результат в переменную не сохраняется... ~ ~
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2013, 15:25
Ответы с готовыми решениями:

Применение std::move к локальной переменной при возврате из функции
Response HostHandler::notFound() const { Response resp; resp.status = 404; return std::move(resp); } Имеет ли это...

[Mono] Ошибка при использовании локальной переменной
Проблема заключается в следующем. Есть класс DataBase: using System; using MySql.Data.MySqlClient; namespace MagChatServer { ...

Ошибка работы с массивом: использование локальной переменной которой не присвоено значение
private void button2_Click(object sender, EventArgs e) { DialogResult result = openFileDialog1.ShowDialog(); ...

29
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 15:26
Цитата Сообщение от Izual Посмотреть сообщение
Не понимаю в чём дело, хоть головой об стену бейся.
Может в том, что
Цитата Сообщение от Izual Посмотреть сообщение
в него поместил локальную переменную
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 15:48  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Может в том, что
Так оно и должно быть локальной - т.е. только для данного диалога. Мне эта переменная в других диалогах, как и в основном окне - на фиг не нужна. Я её и поместил при инициализации диалога.

Я понимаю, что при перезапуске диалога - переменная должна обнулятся, т.к. инициализация переменной осуществляется заново. Но ведь я диалог не закрываю, а просто повторно кликаю на кнопку.

Добавлено через 18 минут
Вот полный код диалогового окна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
INT_PTR CALLBACK VCheck(HWND hDvc, UINT message, WPARAM wParam, LPARAM lParam)
{
    bool VCam=0;
    HWND hVCuBut;
    WNDCLASS wr;
    wr.hInstance = hInst;
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        {
            hVCuBut = CreateWindow(TEXT ("button"), TEXT("Обновить"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 5, 80, 23, hDvc,(HMENU) ID_VCUB, hInst, NULL);
            ShowWindow(hVCuBut,SW_NORMAL);
        }
        return (INT_PTR)TRUE;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
            case ID_VCUB:
            {
                if(VCam==1)
                {
                    MessageBox(hDvc, "1", "Успех!", MB_OK);
                }
                if(VCam==0)
                {
                    VCam = 1;
                    MessageBox(hDvc, "0", "Успех!", MB_OK);
                }
            }
            break;
            case IDCANCEL:
                EndDialog(hDvc, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 15:56
C++
1
static bool VCam=0;
???
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 15:59  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
static bool VCam=0;
???
О великий йода! А не могли бы вы, пожалуйста, пояснить?... В моей голове не укладывается почему так?...
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 16:01
Цитата Сообщение от Izual Посмотреть сообщение
почему так?
потому что
Цитата Сообщение от Izual Посмотреть сообщение
поместил локальную переменную
новый заход в функцию - новая переменная!
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 16:08  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
потому что

новый заход в функцию - новая переменная!
Гугл сказал:
(Обычные локальные переменные)
С локальными переменными могут работать только операторы, находящиеся в блоке, где данные переменные объявлены. Вне этого блока локальные переменные неизвестны. Следует помнить, что блок кода начинается открытием фигурной скобки и заканчивается закрытием фигурной скобки.
У меня инициализировалась локальная переменная в блоке данного диалога и закрывается скобка только при закрытии диалога. Так что же за фигня то?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 16:09
Цитата Сообщение от Izual Посмотреть сообщение
закрывается скобка только при закрытии диалога.
При поступлении соответствующего сообщения, то бишь при вызове функции VCheck с необходимыми параметрами. Это же функция!!!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.07.2013, 16:10
Цитата Сообщение от Croessmah Посмотреть сообщение
static bool VCam=0;
статические переменные в функциях - зло. Правда если код написан в Си стиле - выбора не остается.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 16:11

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
статические переменные в функциях - зло.
без зла не было бы и добра :)


Можете предложить тут свой вариант исправления кода ТС
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 16:16  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
При поступлении соответствующего сообщения, то бишь при вызове функции VCheck с необходимыми параметрами. Это же функция!!!
Так она же не закрывается! Я работаю в ней и не выхожу из неё.

Сказал, что:
Наиболее важно понять то, что локальные переменные существуют только в блоке кода, в котором они объявлены. Таким образом, локальные переменные создаются при входе в блок и уничтожаются при выходе из него.
Ну так блок то не закрывается. Переменная остаётся. Но, тогда поясните, что происходит или по какой причине переменная переопределяется(что ли)?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 16:20
Цитата Сообщение от Izual Посмотреть сообщение
Так она же не закрывается!
С чего вдруг?

Цитата Сообщение от Izual Посмотреть сообщение
Ну так блок то не закрывается.
Тогда была бы ошибка компиляции
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
18.07.2013, 16:28
Цитата Сообщение от Izual Посмотреть сообщение
if(VCam==1)
{
MessageBox(hDvc, "1", "Успех!", MB_OK);
}
if(VCam==0)
{
VCam = 1;
MessageBox(hDvc, "0", "Успех!", MB_OK);
}
а что когда VCam==1 значение не меняется?
и вообще присваивать bool 1 и 0глупость у него есть значения true и false
вот как должен выглядеть код
C++
1
2
3
4
5
6
7
8
9
10
if(VCam)
{
   MessageBox(hDvc, "1", "Успех!", MB_OK);
  VCam=false;
 }
 if(!VCam)
 {
  VCam = true;
  MessageBox(hDvc, "0", "Успех!", MB_OK);
 }
учитывая что VCam принимает только два значения то еще проще

C++
1
2
3
4
5
6
7
8
9
10
if(VCam)
{
   MessageBox(hDvc, "1", "Успех!", MB_OK);
  VCam=false;
 }
 else
 {
  VCam = true;
  MessageBox(hDvc, "0", "Успех!", MB_OK);
 }
а если учесть что переменная каждый раз инвертируется то еще проще

C++
1
2
3
4
5
if(VCam)
   MessageBox(hDvc, "1", "Успех!", MB_OK);
 else
  MessageBox(hDvc, "0", "Успех!", MB_OK);
  VCam=!VCam;
Добавлено через 1 минуту
ну а насчет статика тебе уже сказали
можешь объявить глобальную, хотя это глупо
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 16:30  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
С чего вдруг?


Тогда была бы ошибка компиляции
Потому что:
С локальными переменными могут работать только операторы, находящиеся в блоке, где данные переменные объявлены. Вне этого блока локальные переменные неизвестны. Следует помнить, что блок кода начинается открытием фигурной скобки и заканчивается закрытием фигурной скобки.
Открытие блока: было при открытии скобки диалога.
Закрытие блока: при закрытии диалога(чего я не делаю).

Переменная действительно определяется только внутри этого диалога(на то она и локальная).
Но вопрос то тогда - почему значение переменной (обычной локальной) - не изменилось после выхода из функции обработки кнопки?...
Есть конечно такое ещё на том же сайте:
Поскольку локальные переменные уничтожаются при выходе из функции, в которой они объявлялись, то эти переменные не могут хранить значение между вызовами функций.
Однако это достаточно размыто, т.к. границы функций не указанны, однако опять же:
Если не определено место для хранения локальных переменных, то они будут храниться в стеке. Тот факт, что стек является динамически изменяющейся областью памяти, объясняет, почему локальные переменные в общем не могут содержать значения между вызовами функций.
Непонятно, иду гуглить дальше)) (хотя направление гугл запрещено правилами форума, думаю что для себя лично это разрешено?^ ^)

П.С.
а что когда VCam==1 значение не меняется?
Нет, по моему условию - т.е. тот алгоритм который я составляю, нужно лишь понять первый ли раз нажалась кнопка или повторно(2 и более).
присваивать bool 1 и 0глупость у него есть значения true и false
Так 0 == FALSE, а 1 == TRUE. (иль может если вы не на Visual C++, то у вас подругому?... я тока на мелокософтовсокм умею)
if(VCam)
а вот это мне кажется значит - "существует ли эта перменная?"...
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
18.07.2013, 16:39
Цитата Сообщение от Izual Посмотреть сообщение
Открытие блока: было при открытии скобки диалога.
Закрытие блока: при закрытии диалога(чего я не делаю).
функция
Цитата Сообщение от Izual Посмотреть сообщение
INT_PTR CALLBACK VCheck(HWND hDvc, UINT message, WPARAM wParam, LPARAM lParam)
отрабатывает каждый раз когда виндос шлет диалогу сообщение
отработает и выходит(иначе бы диалог "завис")
а при каждом новом сообщении опять входит в функцию и тут у тебя появляется новая VCam
чтобы она была не новая а старая и используется статик

Добавлено через 42 секунды
Цитата Сообщение от Izual Посмотреть сообщение
Однако это достаточно размыто, т.к. границы функций не указанны, однако опять же:
указаны открывающей и закрывающей скобками

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
Открытие блока: было при открытии скобки диалога.
Закрытие блока: при закрытии диалога(чего я не делаю).
посмотри внимательно при создании диалога отрабатывает ветка
Цитата Сообщение от Izual Посмотреть сообщение
case WM_INITDIALOG:
и после того как она отработала выходим из функции
Цитата Сообщение от Izual Посмотреть сообщение
return (INT_PTR)TRUE;
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 16:43  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
функция
отрабатывает каждый раз когда виндос шлет диалогу сообщение
отработает и выходит(иначе бы диалог "завис")
а при каждом новом сообщении опять входит в функцию и тут у тебя появляется новая VCam
чтобы она была не новая а старая и используется статик

Добавлено через 42 секунды

указаны открывающей и закрывающей скобками

Добавлено через 2 минуты

посмотри внимательно при создании диалога отрабатывает ветка
и после того как она отработала выходим из функции
Так теперь я понял, при обработки событии: естественно событие сначало находится(основной ф-ей программы) а значит уже выходит за пределы диалога.
Теперь вопрос: это косяк мелокософта... а значит на будущее все "локальные" нужно превращять в "статические локальные" - дабы избежать потом таких косяков?.. А на других платформах такое же?... ~ ~

П.С.
case WM_INITDIALOG:
оно не в нём определяется, но в нём изменяется.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
18.07.2013, 16:50
Цитата Сообщение от Izual Посмотреть сообщение
Теперь вопрос: это косяк мелокософта...
Это не косяк это идеология
в отличии от Дос не программа управляет системой а система программой
сделал ты что нибудь (нажал кнопку, сдвинул мышку) система это определила и дала знать программе
а программа должна отработать это событие и вернуть управление опять системе
Цитата Сообщение от Izual Посмотреть сообщение
оно не в нём определяется, но в нём изменяется.
Оно это кто?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.07.2013, 16:56  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
Оно это кто?
Имеется в виду переменная.
Однако это точно косяк. Т.к. тогда получается что смысл обычной локальной переменной теряется, т.к. вдруг система получит какой то вызов, и по принципу "параллельности" (т.е. оно же будет выполнять действие не буквально параллельно, а одно за другим) система сотрёт значение, даже работая в пределах одного блока, и не до делая обработку одного блока - перейдёт к другому вызову.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
18.07.2013, 17:00
Цитата Сообщение от Izual Посмотреть сообщение
Однако это точно косяк.
с чего это косяк?
потому что ты не понимаешь
а если тебе каждый раз нужна новая переменная, например счетчик цикла
то под неё память резервировать и хранить?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
18.07.2013, 17:02
Цитата Сообщение от Izual Посмотреть сообщение
Потому что:
Возьмите книжку и почитайте первые главы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2013, 17:02
Помогаю со студенческими работами здесь

Ошибка «использование локальной переменной которой не присвоено значениe» внутри switch
Помогите, пожалуйста, не могу разобраться с оператором switch. При таком коде выдает ошибки: "Использование локальной переменной...

Ошибка: Использование локальной переменной "R", которой не присвоено значение
Ошибка 1 Использование локальной переменной "R", которой не присвоено значение Ошибка 1 Использование локальной переменной...

Ошибка "Использование локальной переменной которой не присвоено значение"
программа ввода одномерного массива с клавиатуры и поиск элемента равного нулю. выдает ошибку - "Ошибка 1 Использование локальной...

Ошибка 1 Использование локальной переменной "stat", которой не присвоено значение
Объявляю массив string stat; Потом требуется проверка. Пишу if (stat==null) и он мне жалуется на это условие. Пишет...

Ошибка "Использование локальной переменной "d", которой не присвоено значение"
Добрый день. Помогите пожалуйста... Я в целом понимаю, что вопрос мой ну очень нубский, но ответа на него не нашел самостоятельно, так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru