Форум программистов, компьютерный форум CyberForum.ru

Почему не работает счетчик в функции? - C++

Восстановить пароль Регистрация
 
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
02.06.2013, 18:32     Почему не работает счетчик в функции? #1
я написал вот такую не хитрую функцию , в ней все работает как надо,кроме переменной "V" - в чем проблема?(rm и lm это сокращенный код (GetAsyncKeyState(VK_(L\R)BUTTON)&1)
Кликните здесь для просмотра всего текста
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
void RetCoord (int X , int Y , int X1 , int Y1 , int V , char pString[],D3DCOLOR col , D3DCOLOR col2)
{
                 GetCursorPos(&cPos);
 
                 if(V==0)
                 {
                 if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1)//если правая кнопка мыши нажата 1 раз и курсор //стоит в нужном диапазоне то
                 {
                 V++;// переменная V + 1, то есть = 1
                 }
                 }
                 //
                 if (V==1)
                 {
                 if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1)
                 {
                     V--;
                 }
                 }
                 //
                 if(cPos.y>Y&cPos.y<Y1&cPos.x>X&cPos.x<X1&V==0)
                 {
                 PrintText (pString ,X  , Y , col , dMenu.pFont);
                 }
                 else if (V==0)
                 {
                 PrintText (pString ,X  , Y , RED , dMenu.pFont);
                 }
                 //
                 if (V==1)
                 {
                 PrintText (pString ,X  , Y , col2 , dMenu.pFont);
                 }
                 
                 
}

вызываю функцию
C++
1
RetCoord (100 , 100 , 150 , 150 , Z ,"блаблабла" , YELLOW , GREEN );
в потоке если что.
Происходит вот что , если я нажимаю на правую кнопку мыши(1 раз) в заданном диапазоне , то переменная V должна равняться 1. Она приравнивается к 1 и в эту же миллисекунду приравнивается к 0, почему так происходит?
Если использовать код без функции - то работает отлично , вот код без функции:
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
GetCursorPos(&cPos); 
                ///
                 if(Z==0)
                 {
                 if (GetAsyncKeyState(VK_RBUTTON)&1)
                 {
                 if(cPos.x>MRegX&cPos.x<MRegX1)
                 {
                 if(cPos.y>MRegY&cPos.y<MRegY1)
                 {
                     Z++;
                 }
                 }
                 }
                 }
                
                 if (Z==1)
                 {
                 if (cPos.x>MRegX&cPos.x<MRegX1)
                 {
                 if (cPos.y>MRegY&cPos.y<MRegY1)
                 {
                 if (GetAsyncKeyState(VK_RBUTTON)&1)
                 {
                     Z--;
                 }
                 }
                 }
                 }
                 if(cPos.y>MRegY&cPos.y<MRegY1&cPos.x>MRegX&cPos.x<MRegX1&Z==0)
                 {
                 PrintText ("Отдача" ,MRegX  , MRegY , YELLOW , dMenu.pFont);
                 }
                 else if (Z==0)
                 {
                 PrintText ("Отдача" ,MRegX  , MRegY , RED, dMenu.pFont);
                 }
        
 
                 
                 if (Z==1)
                 {
                 PrintText ("Отдача" ,MRegX  , MRegY , GREEN , dMenu.pFont);
                 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
02.06.2013, 18:39     Почему не работает счетчик в функции? #2
А теперь рассмотрим поближе:
C++
1
2
3
4
5
6
7
8
9
10
if(V==0){//V==0, условие выпонено
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Здесь true
        V++;//V==1
    }
}
if (V==1){//Теперь V уже равно 1, поэтому true
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Условие аналогично, поэтому true
        V--;//V==0
    }
}
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
02.06.2013, 23:32  [ТС]     Почему не работает счетчик в функции? #3
Цитата Сообщение от Croessmah Посмотреть сообщение
А теперь рассмотрим поближе:
C++
1
2
3
4
5
6
7
8
9
10
if(V==0){//V==0, условие выпонено
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Здесь true
        V++;//V==1
    }
}
if (V==1){//Теперь V уже равно 1, поэтому true
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Условие аналогично, поэтому true
        V--;//V==0
    }
}
попробовал и убрал вообще условие
C++
1
2
3
4
5
if (V==1){//Теперь V уже равно 1, поэтому true
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Условие аналогично, поэтому true
        V--;//V==0
    }
}
все равно значение приравнивается к 0
Попробовал вообще в функции оставить только это
C++
1
2
3
4
void RetCoord((int X , int Y , int X1 , int Y1 , int V , char pString[],D3DCOLOR col , D3DCOLOR col2)
{
V++;
}
мне было смешно потому что значение было равно 1 , потому что прибавляет +1 и в эту же миллисекунду -1
я провел еще экспиремент и сделал вот такой код
C++
1
2
3
4
5
int A;
void RetCoord((int X , int Y , int X1 , int Y1 , int V , char pString[],D3DCOLOR col , D3DCOLOR col2)
{
A++;
}
ну тут конечно все заработало как нужно почему-то, к переменной A прибавлялось +1 в секунду(или пол секунды,не важно - значение увеличивалось короче)

В чем дело не могу разобраться....
void RetCoord - это поток если что и вызываю функцию я тоже в потоке , может из-за этого?

Добавлено через 4 часа 40 минут
Цитата Сообщение от ВДВ777 Посмотреть сообщение
попробовал и убрал вообще условие
C++
1
2
3
4
5
if (V==1){//Теперь V уже равно 1, поэтому true
    if (rm&1&cPos.x>X &cPos.x<X1&cPos.y>Y &cPos.y<Y1){//Условие аналогично, поэтому true
        V--;//V==0
    }
}
все равно значение приравнивается к 0
Попробовал вообще в функции оставить только это
C++
1
2
3
4
void RetCoord((int X , int Y , int X1 , int Y1 , int V , char pString[],D3DCOLOR col , D3DCOLOR col2)
{
V++;
}
мне было смешно потому что значение было равно 1 , потому что прибавляет +1 и в эту же миллисекунду -1
я провел еще экспиремент и сделал вот такой код
C++
1
2
3
4
5
int A;
void RetCoord((int X , int Y , int X1 , int Y1 , int V , char pString[],D3DCOLOR col , D3DCOLOR col2)
{
A++;
}
ну тут конечно все заработало как нужно почему-то, к переменной A прибавлялось +1 в секунду(или пол секунды,не важно - значение увеличивалось короче)

В чем дело не могу разобраться....
void RetCoord - это поток если что и вызываю функцию я тоже в потоке , может из-за этого?
все спс разобрался - нужно было после int и перед переменной поставить "&".
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
02.06.2013, 23:52     Почему не работает счетчик в функции? #4
Цитата Сообщение от ВДВ777 Посмотреть сообщение
C++
1
RetCoord (100 , 100 , 150 , 150 , Z ,"блаблабла" , YELLOW , GREEN );
Вы планируете, что переменная Z станет равна 1 после выполнения функции?
Цитата Сообщение от ВДВ777 Посмотреть сообщение
нужно было после int и перед переменной поставить "&".
тогда и нужно было писать, что изменяться должна переменная Z, а не V
Цитата Сообщение от ВДВ777 Посмотреть сообщение
в ней все работает как надо,кроме переменной "V"
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
25.03.2015, 17:00     Почему не работает счетчик в функции? #5
Подскажите пожалуйста.Было задание - "Компьютеры играют все возрастающую роль в
образовании. Напишите программу, которая поможет ученикам младших классов
выучить таблицу умножения. Используйте rand для выработки двух
положительных одноразрядных целых чисел. Программа должна печатать вопросы типа Сколько будет 6*7?
Затем учащийся печатает ответ. Ваша программа проверяет этот ответ. Если он
правильный, напечатайте «Очень хорошо!» и затем задайте следующий вопрос
на умножение. Если ответ неправильный, напечатайте «Нет. Повторите,
пожалуйста, снова» и затем задавайте тот же самый вопрос повторно до получения
правильного ответа."

Потом нужно было модифицировать код,что выдавались разные ответы при помощи оператора switch,сделал. Потом было задание что программа подсчитывала количество правильных ответов и не правильных,и если соотношение ответов было менее 0.75 - выдавала сообщение что нужно "подучиться". Никак не могу реализовать. Не пойму почему,но счетчик нифига не считает.Что не так я делаю?Вот код,счетчик не изменяется ,т.е. у него всегда значения i и j которые заданы по умолчанию
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <string>
#include <math>
#include <iomanip>
 
using namespace std;
 
int func(void);
 
int main()
{
        func();
        system("pause");
        return 0;
}
int func(void)
{
  srand(time(0));
  int x,y,z=0;
  double i=0,j=1;
  int c,d;
  string a="da";
  x=1+rand()%20;
  y=1+rand()%20;
  cout << "Skolko bydet - " << x << " * " << y << " ? "<< endl;
  cin >>z;
  if(x*y==z)
  {
  c=rand()%4+1;
  switch(c)
  {
    case 1:
    cout << "Ochen horosho!"<<endl;
    i++;
    break;
    case 2:
    cout << "Pravilno!"<<endl;
    i++;
    break;
    case 3:
    cout << "Da!"<<endl;
    i++;
    break;
    case 4:
    i++;
    cout << "Master!"<<endl;
    break;
  }
    cout << "Probyem eshe? ";
    cin >>a;
  if(a=="da")
  return func();
  else
  {
  cout << "Vi pravilno otvetili: " << i <<endl;
  cout << "Vi ne pravilno otvetili: " << j <<endl;
  if(i/j<=0.75)
  cout << "Idite ychites!"<<endl;
  else
  cout << "Neploho!"<<endl;
  return 0;
  }
}
  else
  {
  while(x*y!=z)
  {
  d=rand()%4+1;
  switch(d)
  {
    case 1:
    cout << "Schitai lychshe!"<<endl;
    j++;
    break;
    case 2:
    cout << "Pereschitivai!"<<endl;
    j++;
    break;
    case 3:
    cout << "Ne pravilno!"<<endl;
    j++;
    break;
    case 4:
    cout << "Opyat ne verno!"<<endl;
    j++;
    break;
  }
  cin >> z;
  }
  cout << "Ny nakotecto!"<<endl;
  cout << "Probyem eshe?";
  cin >>a;
  if(a=="da")
  return func();
  else
  {
  cout << "Vi pravilno otvetili: " << i <<endl;
  cout << "Vi ne pravilno otvetili: " << j <<endl;
  if(i/j<=0.75)
  cout << "Idite ychites!"<<endl;
  else
  cout << "Neploho!"<<endl;
  return 0;
  }
  }
}
Пытался i и j в разные места ставить - результат не меняется

Добавлено через 7 минут
изменил функцию воид на дабл,т.е. вот так
C++
1
2
3
4
5
6
7
double func(double i=0,double j=1);
int main()
{
}
double func(double i,double j)
{
}
Стал j - считает правильно вроде бы,а i=1 становится и все , ну что за фигня
Yandex
Объявления
25.03.2015, 17:00     Почему не работает счетчик в функции?
Ответ Создать тему
Опции темы

Текущее время: 23:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru