Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196

Почему изменяется значение переменной между функциями класса?

26.04.2015, 13:04. Показов 3998. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему-то изменяется значение переменной m(кол-во специальностей) в output_spec.
Пробовал в других средах покомпилить, но m все равно меняется...
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
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
 
 
int i;
 
struct SPEC  
 {
 char vuz1[20];
 char vuz2[20];
 char vuz3[20];
 };
 
class bd
 {
  private:
 
     SPEC spec[100];
 
  public:
 
     void input_spec();
 
     void output_spec();
 
};
 
 void bd::input_spec()
  {
    int m;
 
    cout<<"Vvedite kol-vo specialnostei"<<endl;
    cin>>m; //ЗДЕСЬ ПЕРЕМЕННАЯ ВВОДИТСЯ
    cout<<m;
 
    cout<<"VUZ #1"<<endl;
    for (i=0;i<m;i++)
    {
      cout<<"Naimenovanie spec #"<<endl;
      cin>>spec[i].vuz1;
    }
 
    cout<<"OK"<<endl;
    for (i=0;i<m;i++)
    {
      cout<<"Naimenovanie spec #"<<endl;
      cin>>spec[i].vuz2;
    }
  }
 
 
 void bd::output_spec()
  {
    int m;
          cout<<m;  //ИЗМЕНЯЕТСЯ ЗНАЧЕНИЕ!
 
 
 
    }
 
int main()
{
bd a;
 
a.input_spec();
a.output_spec();
getch();
}
Двойка превращается в 1632220
Изображения
 
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.04.2015, 13:04
Ответы с готовыми решениями:

Почему не изменяется значение члена класса
Инструкция по запуску: &lt;имя.exe&gt; &lt;inputfilename&gt; &lt;outputfilename&gt; &lt;-s|-i&gt; &lt;-a|-d&gt; В конструкторе (FileSorter.cpp, line 21) я изменяю...

Почему изменяется значение переменной?
Помогите новичку. Я пишу простейший код, но в строках 34-38 происходит что-то странное. Переменная i как-будто становится ссылкой и при...

Почему значение переменной Result не изменяется?
Подскажите почему значение переменной Result не изменяется (возвращается 0). static int Solution(int ResArray) { ...

11
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2015, 13:08
Saym, когда ты пишешь:
C++
1
int m;
Происходит всего лишь выделение памяти на стеке под целочисленную переменную. Но никакого конкретного значения этой переменной не присваивается. Т.е. в ней находится "мусор". Поэтому рекомендуется всегда инициализировать переменную при объявлении (или по крайней мере до первого использования).
C++
1
int m = 0; // или другое нужное значение
0
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196
26.04.2015, 13:14  [ТС]
А почему так?
Я же в функции input_spec переменной m присвоил значение 2(ввел в консоли);

С другими переменными, которые работали в нескольких функциях, подобного не случалось.
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
int i;
 
struct VUZ
 {
 char name[20];
 char adres[20];
 };
 
 class bd
 {
  private:
 
     VUZ vuz[3];
 
  public:
 
     void input_vuz();
      void output_vuz();
};
 
 void bd::input_vuz()
  {
    int n,k;
 
    k=1;
 
    cout<<"Vvedite kol-vo vuzov"<<endl;
    cin>>n;  //ВВОД ПЕРЕМЕННОЙ n
 
    for (i=0;i<n;i++)
    {
    cout<<"Naimenovanie VUZa #"<<k<<endl;
    cin>>vuz[i].name;
    k++;
    }
    //////////////////////////////////////
    k=1;
    /////////////////////////////////////
    for (i=0;i<n;i++)
    {
    cout<<"Adres VUZa #"<<k<<endl;
    cin>>vuz[i].adres;
    k++;
    }
  }
 
void bd::output_vuz()
  {
    int n,k;
 
    k=1;
 
    for (i=0;i<n;i++) //ЗДЕСЬ переменная n не меняет своего значение, цикл работал как надо.
    {
    cout<<"Naimenovanie VUZa #"<<k<<endl;
    cout<<vuz[i].name;
    k++;
    }
    
    k=1;
  
    for (i=0;i<n;i++)
    {
    cout<<"Adres VUZa #"<<k<<endl;
    cout<<vuz[i].adres;
    k++;
    }
  }
 
int main()
{
bd a;
 
a.input_vuz();
a.output_vuz();
getch();
Изображения
 
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
26.04.2015, 13:15
Tulosba, ТС считает, что это одна и та же переменная, как я понял
0
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196
26.04.2015, 13:17  [ТС]
m и n? Нет, не одна и та же.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
26.04.2015, 13:18
Saym, сделайте эту переменную закрытым членом класса, в конструкторе присвойте нужное значение и пользуйтесь. А так делать, как делаете Вы, и считать, что это одна и та же переменная, по меньшей мере глупо.

Добавлено через 53 секунды
Цитата Сообщение от Saym Посмотреть сообщение
m и n?
Не m и n, а m созданная в разных методах. А с n Вам, видимо повезло, что значение совпало.
1
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196
26.04.2015, 13:22  [ТС]
Да, я так считаю.
Выше пример ведь есть. Переменная n не меняется.

Вот еще:
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
int i;
 
struct VUZ
 {
 char name[20];
 char adres[20];
 };
 
 class bd
 {
  private:
 
     VUZ vuz[3];
 
  public:
 
     void input_vuz();
      void output_vuz();
};
 void bd::input_vuz()
  {
    int n,k;
 
    k=1;
 
    cout<<"Vvedite kol-vo vuzov"<<endl;
    cin>>n;  //??? ????? ???? ????????? n
 
    for (i=0;i<n;i++)
    {
    cout<<"Naimenovanie VUZa #"<<k<<endl;
    cin>>vuz[i].name;
    k++;
    }
    //////////////////////////////////////
    k=1;
    /////////////////////////////////////
    for (i=0;i<n;i++)
    {
    cout<<"Adres VUZa #"<<k<<endl;
    cin>>vuz[i].adres;
    k++;
    }
  }
 
void bd::output_vuz()
  {
    int n,k;
 
    cout<<n;
 
  }
 
int main()
{
bd a;
 
a.input_vuz();
a.output_vuz();
getch();
}
Изображения
 
0
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196
26.04.2015, 13:25  [ТС]
Ничоси, повезло.
Ну ок, подумаю, спасибо.
А вообще это все очень странно.

Добавлено через 1 минуту
Закрытым членом класса? Это методы input_spec и output_spec в private записать, так?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
26.04.2015, 13:27
Цитата Сообщение от Saym Посмотреть сообщение
Переменная n не меняется.
а сколько раз вы запускали код, чтобы убедиться, что она не меняется?
У каждого метода есть своя локальная область видимости. Если в этой локальной области создать переменную, то она не будет видна в локальной области другого метода.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2015, 13:28
Цитата Сообщение от Saym Посмотреть сообщение
это все очень странно.
Ещё и не такое увидишь, если продолжишь язык изучать.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
26.04.2015, 13:29
Лучший ответ Сообщение было отмечено Saym как решение

Решение

Saym,
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
class bd
 {
  private:
     int n; //или m, как Вам удобнее
     VUZ vuz[3];
 
  public:
 
     void input_vuz();
      void output_vuz();
};
void bd::input_vuz()
  {
    int k;
 
    k=1;
 
    cout<<"Vvedite kol-vo vuzov"<<endl;
    cin>>n;  //??? ????? ???? ????????? n
 
    for (i=0;i<n;i++)
    {
    cout<<"Naimenovanie VUZa #"<<k<<endl;
    cin>>vuz[i].name;
    k++;
    }
    //////////////////////////////////////
    k=1;
    /////////////////////////////////////
    for (i=0;i<n;i++)
    {
    cout<<"Adres VUZa #"<<k<<endl;
    cin>>vuz[i].adres;
    k++;
    }
  }
void bd::output_vuz()
  {
    int k;
 
    cout<<n;
 
  }
1
 Аватар для Saym
5 / 5 / 4
Регистрация: 02.11.2014
Сообщений: 196
26.04.2015, 13:36  [ТС]
Спасибки, все работает!
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2015, 13:36
Помогаю со студенческими работами здесь

Почему не изменяется значение переменной внутри функции?
Есть функция: void get_string(struct str* tmp, int start, double summ) { double q = summ; int index = start; int temp...

Вывод переменной, которая изменяется несколькими функциями
Доброго времени суток, помогите начинающему &quot;кодеру&quot;. Как вывести на страницу переменную, которая изменяется в нескольких функциях? ...

Почему не сохраняется значение переменной класса из метода?
Есть переменная count. Есть ситуация, в которой когда объект перетаскивается на назначенное поле на сцене и отпускается кнопка мыши,...

Как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной
Подскажите, пожалуйста, как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной ссылочного...

почему изменяется и первый экземпляр класса
Почему значение a.m становится равным b.m? Как сделать так, чтобы массив word можно было использовать несколько раз? #include...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru