Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81

Описание глобальных переменных

31.10.2014, 16:06. Показов 2321. Ответов 22
Метки нет (Все метки)

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

файл с main

C++
1
2
3
4
5
6
#include <iostream>
#include <stdlib.h>
#include "function.h"
 
 
using namespace std;
файл function.h

прототипы функций

C++
1
2
3
4
char cells[9]={'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char PlayerName1[40];
char PlayerName2[40];
char win='-';
файл function.сpp

C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
#include <iostream>
#pragma once
#include "function.h"
 
using namespace std;
 
char cells[9]={'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char PlayerName1[40];
char PlayerName2[40];
char win='-';
функции
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2014, 16:06
Ответы с готовыми решениями:

Объявление глобальных переменных
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main (int x, int y) { printf (&quot;x=&quot;); scanf_s (&quot;x=&amp;d&quot;,...

Определение глобальных переменных
Доброго времени суток! Интересует следующий вопрос - Возможно ли определение глобальных переменных в теле подпрограмм или классов? ...

Инициализация глобальных переменных
Требуется инициализировать 2 массива и 2 переменные, которые используются в 2-х функциях, с клавиатуры, но без передачи их в качестве...

22
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:12
Не совсем понятен вопрос. А не лучше написать класс с public переменными и в конструкторе определить их значение допустим?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
31.10.2014, 16:15
Чтобы код "нормально читался" человеком, глобальные переменные лучше вообще не использовать.
Ну и в посте написано про какие-то прототипы функций и функции, по факту в коде нет ни того, ни другого.
В чем вопрос-то?
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:22  [ТС]
при компиляции выдает переопределение глобальных переменных
0
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:24
Видимо от того, что они объявлены в каждом файле.
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:35  [ТС]
если я переменные остаются только в файле .h , то в файл с функциями их не видит.

Добавлено через 7 минут
кто-нибудь знает что делать в данном случае? чтоб было всем понятно: нужно, чтоб глобальные переменные были видны и в мэйне и в сппшнише с функциями. где объявлять эти переменные?
0
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:35
Попробуй объявить их в файле .h а определить (т.е. задать значения) в файле .cpp
Но я все-таки настаиваю на написании отдельного класса. Либо использовать локальные переменные вместо глобальных.
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:37  [ТС]
я классы еще не учила
0
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:41
Цитата Сообщение от Rico Garcia Посмотреть сообщение
Попробуй объявить их в файле .h а определить (т.е. задать значения) в файле .cpp
Цитата Сообщение от 0x10 Посмотреть сообщение
глобальные переменные лучше вообще не использовать.
Если конечно задание именно с глобальными, то попробуй мой вариант.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
31.10.2014, 16:50
Lena86, в одном из CPP-файлов надо писать
C++
1
char cells[9]={'-', '-', '-', '-', '-', '-', '-', '-', '-'};
до всех функций. А в других (там где они требуются)
C++
1
extern char cells[9];
Добавлено через 6 минут
Если хочется описать их в одном месте (а в этом есть резон), то я делаю так
.h
C++
1
2
3
4
5
6
#if  defined E
#define ex 
#else
#define ex extern
#endif
ex char cells[9];
Тогда в одном cpp-файле в самом начале пишем #define E, а в других - не пишем.
Заполнение cells значениями надо делать в одном месте, в самом начале, например, в функции main
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 17:12  [ТС]
Байт, первый вариант не совсем понятен
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
31.10.2014, 17:13
Цитата Сообщение от Lena86 Посмотреть сообщение
в каком из файлов нужно обозначить глобальные переменные, чтоб код нормально читался.
Только в одном либо в "*.h" либо "*.cpp". Но в принципе можно обойтись и без "*.h", они не всегда нужны. Нужно понимать что директива #include просто напросто вставляет "*.h" в "*.cpp" т.е. в итоге у вас получается как бы один файл.
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 17:42  [ТС]
maxillion, у меня задача сделать проект с таким файлами. я понимаю, что можно и без них. вы, наверное, не совсем меня поняли - если я объявляю эти переменные в ашнике, файл с функциями их не видит, а их должны видеть оба сппшника, понимаете? потому что эти переменные нужны почти в каждой из функций, плюс в мэйне их тоже пишу.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
31.10.2014, 17:47
Цитата Сообщение от Lena86 Посмотреть сообщение
а их должны видеть оба сппшника
В примере у вас только один.
Значит объявляйте только в function.h, и перенесите #pragma once в function.h тогда всё должно заработать.
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:01  [ТС]
maxillion, в смысле в самом ашнике написать #pragma once? и все глобальные переменные? или что?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
31.10.2014, 18:07
что такое "ашнике " есть файл с расширением "*.h" сокращение от header - заголовок. Именно заголовочные файлы могут использоваться множество раз, поэтому что бы не возникало множество определений существует директива "#pragma once" .
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:21  [ТС]
maxillion, вот что пишет в данном случае компилятор

>PROJECT.obj : error LNK2005: "char win" (?win@@3DA) уже определен в function.obj
1>PROJECT.obj : error LNK2005: "char * PlayerName1" (?PlayerName1@@3PADA) уже определен в function.obj
1>PROJECT.obj : error LNK2005: "char * PlayerName2" (?PlayerName2@@3PADA) уже определен в function.obj
1>C:\Users\Elena\Documents\Visual Studio 2012\Projects\PROJECT\Debug\PROJECT.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
31.10.2014, 18:24
Выложите весь проект я попробую скоректировать.
0
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:29  [ТС]
maxillion,

это основной

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
#include <iostream>
#include <stdlib.h>
#include "function.h"
 
 
using namespace std;
 
 
void main()
{
 
    
    cout<<"Enter the name of the 1st player: ";
    cin>>PlayerName1;
    cout<<"Enter the name of the 2st player: ";
    cin>>PlayerName2;
    cout<<"\n";
 
    show_cells();
 
    for (int move=1; move<=9; move++)
    {
        if (move%2) make_move(1);
        else make_move(2);
        show_cells();
        if(move>=5) 
        {
            win=check();
            if(win!='-')
                break;
        }
    }
 
    result();
}

это доп. cpp

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
#pragma once
#include <iostream>
 
using namespace std;
 
 
char cells[9]={'-', '-', '-', '-', '-', '-', '-', '-', '-'};
 
 
void show_cells()
{
    cout<<"------------" <<"\n"<<endl;
    cout<<"Numbers of cells:"<<endl;
    cout<<"-"<<1 <<"-"<<'|'<<"-"<<2<<"-"<<'|'<<"-"<<3<<"-"<<"|"<<endl;
    cout<<"-"<<4<<"-"<<'|'<<"-"<<5<<"-"<<'|'<<"-"<<6<<"-"<<"|"<<endl;
    cout<<"-"<<7<<"-"<<'|'<<"-"<<8<<"-"<<'|'<<"-"<<9<<"-"<<"|"<<"\n"<<endl;
 
    cout<<"Current situation (--- is empty):"<<endl;
    cout<<"-"<<cells[0]<<"-"<<'|'<<"-"<<cells[1]<<"-"<<'|'<<"-"<<cells[2]<<"-"<<" |"<<endl;
    cout<<"-"<<cells[3]<<"-"<<'|'<<"-"<<cells[4]<<"-"<<'|'<<"-"<<cells[5]<<"-"<<"|"<< endl;
    cout<<"-"<<cells[6]<<"-"<<'|'<<"-"<<cells[7]<<"-"<<'|'<<"-"<<cells[8]<<"-"<<"|"<<"\n"<<endl;
    cout<<"------------\n"<<endl;
}
 
void make_move(int num)
{
    
    if(num==1) cout<<PlayerName1;
    else cout<<PlayerName2;
    cout<<", enter a cell's number to make move: ";
    int cell;
    cin>>cell;
    cout<<"\n";
    while(cell> 9||cell<1||cells[cell-1]=='O'||cells[cell-1]=='X')
    {
        cout<<"Enter a CORRECT (1-9) or EMPTY (---) cell's number to make move: ";
        cin>>cell;
        cout<<"\n";
    }
 
    if (num==1)
        cells[cell-1]='X';
    else 
        cells[cell-1]='O';
}
 
char check()
{
    int i;
    for(i=0; i<3; i++)
        if(cells[i*3+0]==cells[i*3+1]&&cells[i*3+1]==cells[i*3+2]&&cells[i*3+2]!='-')
            return cells[i*3+1];
        else if(cells[i]==cells[3+i]&&cells[3+i]==cells[6+i]&&cells[6+i]!='-')
            return cells[3+i];
    if((cells[0]==cells[4]&&cells[4]==cells[8]||
        cells[2]==cells[4]&&cells[4]==cells[6])&&
        cells[4]!='-')
        return cells[4];
    return '-';
}
 
void result()
{
    if (win=='X') cout<<PlayerName1<<"You win! Congratulations!"<<PlayerName2<<" is looser! Bugoga..."<<endl;
    else if (win=='O') cout<<PlayerName2<<" You win! Congratulations!"<<PlayerName1<<" is looser! Bugoga..."<<endl;
    else cout<<"Draw!!!"<<endl;
}
это ашник

C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
void show_cells();
void make_move(int num);
char check();
void result();
 
char win='-';
char PlayerName1[40];
char PlayerName2[40];
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
31.10.2014, 18:49
Можно выложить сам проект в архиве ? Строите в Visual Studio ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2014, 18:49
Помогаю со студенческими работами здесь

Поиск глобальных переменных
Есть задачка, которую не могу решить. Дано 9000 .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для...

Использование глобальных переменных - моветон ли?
Ребят, очень часто вижу как отцы С++, когда проверяют чей-то код и обнаруживают там глобальные переменные, заявляют, что это не хорошо, что...

Массив (переписать без глобальных переменных)
Помогите написать ету програму без глобальных переменных #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; ...

Ошибка в сравнении глобальных переменных в функциях
Здравствуйте! Я всю жизнь писал на Pascal и с С столкнулся впервые пару дней назад, когда начал эксперементировать с Arduino. Поискал...

Исправить без использования глобальных переменных
#include&lt;iostream&gt; using namespace std; int a,n,maximum=-1000,x; void zapros() { cout&lt;&lt;&quot;Vvedite razmer massiva&quot;&lt;&lt;endl; } ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru