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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
fom4ik
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52
12.11.2011, 01:40     Ошибка повторения имен переменных при использовании глобальной переменной #1
Есть 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 05:38     Ошибка повторения имен переменных при использовании глобальной переменной #2
определения массивов должны быть в .cpp файле
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.11.2011, 07:39     Ошибка повторения имен переменных при использовании глобальной переменной #3
И в данном контексте их необязательно делать глобальными.
Байт
 Аватар для Байт
13941 / 8772 / 1220
Регистрация: 24.12.2010
Сообщений: 15,881
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
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 14:58     Ошибка повторения имен переменных при использовании глобальной переменной #6
Цитата Сообщение от Байт
Хотя бывают и исключения. У меня в одном проекте есть структура, которая должна быть видна всем модулям, как extern. При этом структура "дышит", т.е. все время меняется (при разработке).
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Байт
 Аватар для Байт
13941 / 8772 / 1220
Регистрация: 24.12.2010
Сообщений: 15,881
12.11.2011, 15:14     Ошибка повторения имен переменных при использовании глобальной переменной #7
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Простите, не понял. Нельзя ли пояснить на примере?
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
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
4837 / 3236 / 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++
Ошибка при использовании gets() C++

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 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     Ошибка повторения имен переменных при использовании глобальной переменной
Ответ Создать тему
Опции темы

Текущее время: 14:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru