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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ВДВ777
-4 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 110
#1

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

02.06.2013, 18:32. Просмотров 462. Ответов 4
Метки нет (Все метки)

я написал вот такую не хитрую функцию , в ней все работает как надо,кроме переменной "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);
                 }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 18:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не работает счетчик в функции? (C++):

табуляция функции. почему не работает код? - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;stdlib.h&gt; #include &lt;cstdio&gt; using namespace std; float arctg(float x) ...

почему в функции add не работает gets_s? - C++
/* Записи в линейном списке содержат ключевое поле типа *char(строка символов). Сформировать двунаправленный список. Удалить К...

Почему не работает cout в перегруженной функции? - C++
Всем привет. Есть простое заданеие из первых уроков учебника Шитдта о перегрузке функции. Все компелится и работает если бы не одно НО....

Почему не работает ТАКАЯ конструкция функции time - C++
вот фрагмент кода. int main(){ time_t testsec; //определил переменную типа ТАймТ time(&amp;testsec); // Извлекаю в переменную...

Почему RTTI работает только с иерархией классов, содержащие виртуальные функции? - C++
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)? - C++
Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 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
    }
}
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 и перед переменной поставить "&".
0
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 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"
0
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 становится и все , ну что за фигня
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2015, 17:00
Привет! Вот еще темы с ответами:

Почему счетчик в цикле for начинается с нуля, а не с единицы? - C++
привет. почему когда надо сделать какое-то действие, например 4 раза, то пишут: for (int i=0, i&lt;4, i++) { //... } а не так: ...

Почему при выходе из цикла while переменная счетчик увеличивается на единицу? - C++
Есть такой код: #include &lt;iostream&gt; using namespace std; int main() { int x = 30; cout&lt;&lt;&quot;Внешнее значение: &quot;&lt;&lt;x&lt;&lt;endl;...

Не работает счетчик операций - C++
Всем доброго вечера,может кто помочь? Изначально было задание переписать программу из паскалая в с++ включая процедуру findsum строки...

не работает правильно счетчик - C++
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void MatrixInp(int** x,int n); void...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.03.2015, 17:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru