Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
1

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

31.10.2014, 16:06. Просмотров 868. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2014, 16:06
Ответы с готовыми решениями:

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

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

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

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

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

22
Rico Garcia
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:12 2
Не совсем понятен вопрос. А не лучше написать класс с public переменными и в конструкторе определить их значение допустим?
0
0x10
2638 / 1792 / 298
Регистрация: 24.11.2012
Сообщений: 4,452
31.10.2014, 16:15 3
Чтобы код "нормально читался" человеком, глобальные переменные лучше вообще не использовать.
Ну и в посте написано про какие-то прототипы функций и функции, по факту в коде нет ни того, ни другого.
В чем вопрос-то?
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:22  [ТС] 4
при компиляции выдает переопределение глобальных переменных
0
Rico Garcia
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:24 5
Видимо от того, что они объявлены в каждом файле.
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:35  [ТС] 6
если я переменные остаются только в файле .h , то в файл с функциями их не видит.

Добавлено через 7 минут
кто-нибудь знает что делать в данном случае? чтоб было всем понятно: нужно, чтоб глобальные переменные были видны и в мэйне и в сппшнише с функциями. где объявлять эти переменные?
0
Rico Garcia
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:35 7
Попробуй объявить их в файле .h а определить (т.е. задать значения) в файле .cpp
Но я все-таки настаиваю на написании отдельного класса. Либо использовать локальные переменные вместо глобальных.
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 16:37  [ТС] 8
я классы еще не учила
0
Rico Garcia
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 26
31.10.2014, 16:41 9
Цитата Сообщение от Rico Garcia Посмотреть сообщение
Попробуй объявить их в файле .h а определить (т.е. задать значения) в файле .cpp
Цитата Сообщение от 0x10 Посмотреть сообщение
глобальные переменные лучше вообще не использовать.
Если конечно задание именно с глобальными, то попробуй мой вариант.
0
Байт
Эксперт C
20314 / 12874 / 2693
Регистрация: 24.12.2010
Сообщений: 26,896
31.10.2014, 16:50 10
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
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 17:12  [ТС] 11
Байт, первый вариант не совсем понятен
0
maxillion
274 / 184 / 52
Регистрация: 25.12.2012
Сообщений: 616
31.10.2014, 17:13 12
Цитата Сообщение от Lena86 Посмотреть сообщение
в каком из файлов нужно обозначить глобальные переменные, чтоб код нормально читался.
Только в одном либо в "*.h" либо "*.cpp". Но в принципе можно обойтись и без "*.h", они не всегда нужны. Нужно понимать что директива #include просто напросто вставляет "*.h" в "*.cpp" т.е. в итоге у вас получается как бы один файл.
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 17:42  [ТС] 13
maxillion, у меня задача сделать проект с таким файлами. я понимаю, что можно и без них. вы, наверное, не совсем меня поняли - если я объявляю эти переменные в ашнике, файл с функциями их не видит, а их должны видеть оба сппшника, понимаете? потому что эти переменные нужны почти в каждой из функций, плюс в мэйне их тоже пишу.
0
maxillion
274 / 184 / 52
Регистрация: 25.12.2012
Сообщений: 616
31.10.2014, 17:47 14
Цитата Сообщение от Lena86 Посмотреть сообщение
а их должны видеть оба сппшника
В примере у вас только один.
Значит объявляйте только в function.h, и перенесите #pragma once в function.h тогда всё должно заработать.
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:01  [ТС] 15
maxillion, в смысле в самом ашнике написать #pragma once? и все глобальные переменные? или что?
0
maxillion
274 / 184 / 52
Регистрация: 25.12.2012
Сообщений: 616
31.10.2014, 18:07 16
что такое "ашнике " есть файл с расширением "*.h" сокращение от header - заголовок. Именно заголовочные файлы могут использоваться множество раз, поэтому что бы не возникало множество определений существует директива "#pragma once" .
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:21  [ТС] 17
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
maxillion
274 / 184 / 52
Регистрация: 25.12.2012
Сообщений: 616
31.10.2014, 18:24 18
Выложите весь проект я попробую скоректировать.
0
Lena86
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 81
31.10.2014, 18:29  [ТС] 19
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
maxillion
274 / 184 / 52
Регистрация: 25.12.2012
Сообщений: 616
31.10.2014, 18:49 20
Можно выложить сам проект в архиве ? Строите в Visual Studio ?
0
31.10.2014, 18:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2014, 18:49

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

Объявление глобальных переменных в проекте Dev C++
Доброй ночи всем! Подскажите, пожалуйста, как правильно объявить глобальные переменные в проекте....

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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