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

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

31.10.2014, 16:06. Показов 2292. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru