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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
fom4ik
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52
#1

Ошибка повторения имен переменных при использовании глобальной переменной - C++

12.11.2011, 01:40. Просмотров 1727. Ответов 10
Метки нет (Все метки)

Есть 3 файла:

head.h
C++
1
2
3
4
5
6
7
8
#ifndef HeuristicKardano_probmatr_h
#define HeuristicKardano_probmatr_h
int m1[26];
int m2[26][26];
int m3[26][26][26];
#endif
 
void createProb();
funct.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
#include "head.h"
#include <iostream>
 
extern int m1[];
extern int m2[][26];
extern int m3[][26][26];
 
void createProb()
{
    FILE * fo;
    fo = fopen("out.txt","r");
    int i,j,k;
 
    for (i = 0; i != 26; i++)
    {
        fscanf(fo, "%i ",&m1[i]);
    }
 
    for (i = 0; i != 26; i ++)
        for (j = 0; j != 26; j++)
        {
            fscanf(fo, "%i ",&m2[i][j]);
        }
 
    for (i = 0; i != 26; i ++)
        for (j = 0; j != 26; j++)
            for (k = 0; k != 26; k++)
            {
                fscanf(fo, "%i ",&m3[i][j][k]);
            }
 
fclose(fo);
}
main.cpp
C++
1
2
3
4
5
6
7
#include "head.h"
 
int main(int argc, char *argv[])
{
    createProb();
    return 0;
}
В этой программе я заполняю массивы из файла.

Если m1,m2,m3 объявлены в func.cpp то проблем не возникает.

А если как написано выше, то возникает следующая ошибка :-1: ошибка: duplicate symbol _m1 in heuristic.o and main.o for architecture x86_64

Кампилятор GCC
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 01:40     Ошибка повторения имен переменных при использовании глобальной переменной
Посмотрите здесь:
Ошибка при объявлении глобальной переменной: "Переменная не является однозначной" C++
Ошибка при использовании нескольких переменных с одним именем в разных уровнях вложенности циклов for C++
Различие глобальной и глобальной статической переменной C++
Задать значения глобальной переменной при разных условиях C++
C++ Использование имен предопределенных объектов в качестве имен переменных
C++ LNK2019 при объявлении переменной типа из пространства имен в структуре
warning при использовании переменной из подключаемого файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 05:38     Ошибка повторения имен переменных при использовании глобальной переменной #2
определения массивов должны быть в .cpp файле
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.11.2011, 07:39     Ошибка повторения имен переменных при использовании глобальной переменной #3
И в данном контексте их необязательно делать глобальными.
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
12.11.2011, 11:51     Ошибка повторения имен переменных при использовании глобальной переменной #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
fom4ik, Ты знаешь, что делает директива #include "head.h" ?
Она просто вместо себя подставляет указанный файл.
Попробуй сделать такой эксперимент. Вместо #include ... в файл funkt.cpp вставь файл head.h
Теперь посмотри на получившийся код и все поймешь.
А ведь именно этот код и видит транслятор!

Добавлено через 19 минут
Цитата Сообщение от accept Посмотреть сообщение
определения массивов должны быть в .cpp файле
Ну, в общем случае это ниоткуда не следует. Хотя так грамотнее, безопаснее и "так положено".
Хотя бывают и исключения. У меня в одном проекте есть структура, которая должна быть видна всем модулям, как extern. При этом структура "дышит", т.е. все время меняется (при разработке). В хедере я написал так
C
1
2
3
4
5
6
#if defined (_E)
#define _EX
#else
#define _EX extern
#endif
_EX int M[10][20];  // В самом деле там структура
Теперь достаточно в одном из модулей проекта (скажем, в главном) написать #define _E
А можно сделать и так
C
1
2
3
4
5
#if defined (_E)
 int M[10][20];  // Со всеми инициализациями
#else
 extern int M[10][20];  
#endif
fom4ik
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52
12.11.2011, 14:19  [ТС]     Ошибка повторения имен переменных при использовании глобальной переменной #5
kazak, их глобальность нужна будет позже, я думал как обойтись без глобальных переменных, но так удобнее.


Байт, все стало понятно, спасибо
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 14:58     Ошибка повторения имен переменных при использовании глобальной переменной #6
Цитата Сообщение от Байт
Хотя бывают и исключения. У меня в одном проекте есть структура, которая должна быть видна всем модулям, как extern. При этом структура "дышит", т.е. все время меняется (при разработке).
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
12.11.2011, 15:14     Ошибка повторения имен переменных при использовании глобальной переменной #7
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Простите, не понял. Нельзя ли пояснить на примере?
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
12.11.2011, 15:18     Ошибка повторения имен переменных при использовании глобальной переменной #8
Цитата Сообщение от Байт Посмотреть сообщение

Код C
12345678 #if defined (_E)#define _EX#else#define _EX extern#endif_EX int M[10][20]; // В самом деле там структура


Теперь достаточно в одном из модулей проекта (скажем, в главном) написать #define _E
А можно сделать и так

Код C
1234567 #if defined (_E) int M[10][20]; // Со всеми инициализациями#else extern int M[10][20]; #endif
Мне больше нравится 1-й вариант. Ведь при изменении чего-то, скажем размерности массива M во 2-м варианте призодится менять в двух местах, что чревато ошибками.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 15:20     Ошибка повторения имен переменных при использовании глобальной переменной #9
struct.h
C
1
2
3
struct x {
    int a;
};
struct.c
C
1
2
3
#include "struct.h"
 
struct x s = { 4 };
main.c
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include "struct.h"
 
int main(void)
{
    extern struct x s;
    
    printf("%d\n", s.a);
    return 0;
}
Код
[guest@localhost tests]$ .ansi main.c struct.c -o t
[guest@localhost tests]$ ./t
4
[guest@localhost tests]$
Сыроежка
Заблокирован
12.11.2011, 20:48     Ошибка повторения имен переменных при использовании глобальной переменной #10
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Для структур не выделяется память! Структуры - это объявление типа. Память выделяется для объектов этого типа, то есть для объектов, которые имеют тип заданной структуры!

Так что ваш пассаж совершенно некорректный!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 02:18     Ошибка повторения имен переменных при использовании глобальной переменной
Еще ссылки по теме:
Конфликт глобальной и локальной переменных C++
Инициализация глобальной переменной C++
Избавиться от глобальной переменной C++
Работа с глобальной переменной типа bool C++
Можно ли обратиться к перекрытой глобальной переменной? C++

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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2011, 02:18     Ошибка повторения имен переменных при использовании глобальной переменной #11
Цитата Сообщение от Сыроежка
Для структур не выделяется память!
C
1
2
3
4
5
6
7
struct x {
    int a;
};
 
...
 
    struct x s;
создаётся структура s

Цитата Сообщение от Сыроежка
Структуры - это объявление типа.
можно по-разному говорить
структурой можно назвать структурный тип
структурой можно назвать структурную переменную
Yandex
Объявления
13.11.2011, 02:18     Ошибка повторения имен переменных при использовании глобальной переменной
Ответ Создать тему
Опции темы

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