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

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

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

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

12.11.2011, 01:40. Просмотров 1740. Ответов 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
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 01:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка повторения имен переменных при использовании глобальной переменной (C++):

Ошибка при объявлении глобальной переменной: "Переменная не является однозначной" - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; int sec(0); int min(0); int chas(0); int B = 1; int...

Ошибка при использовании нескольких переменных с одним именем в разных уровнях вложенности циклов for - C++
Почему когда создаешь цикл фор по 2 раза и больше раз,и объявляешь там одну и ту же переменную(с одним названием),то не выдаёт ошибку?

Различие глобальной и глобальной статической переменной - C++
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других хейдеров и с++ файлов . когда там описаны...

Задать значения глобальной переменной при разных условиях - C++
Как глобально задать значение переменной при разных условиях, а потом обращаться к этим значениям из других функций? Нужно что-то...

Использование имен предопределенных объектов в качестве имен переменных - C++
Есть код: #include &lt;iostream&gt; using namespace std; void func() { int cout; cout &lt;&lt;cout &lt;&lt;endl; }

LNK2019 при объявлении переменной типа из пространства имен в структуре - C++
Доброго времени суток! Возникла такая проблема , при использовании типа определенного в пространстве имен в структуре BLOCK_INFO_FILE...

10
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 05:38 #2
определения массивов должны быть в .cpp файле
1
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.11.2011, 07:39 #3
И в данном контексте их необязательно делать глобальными.
0
Байт
Эксперт C
16141 / 10419 / 1551
Регистрация: 24.12.2010
Сообщений: 19,723
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
3
fom4ik
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52
12.11.2011, 14:19  [ТС] #5
kazak, их глобальность нужна будет позже, я думал как обойтись без глобальных переменных, но так удобнее.


Байт, все стало понятно, спасибо
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2011, 14:58 #6
Цитата Сообщение от Байт
Хотя бывают и исключения. У меня в одном проекте есть структура, которая должна быть видна всем модулям, как extern. При этом структура "дышит", т.е. все время меняется (при разработке).
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
0
Байт
Эксперт C
16141 / 10419 / 1551
Регистрация: 24.12.2010
Сообщений: 19,723
12.11.2011, 15:14 #7
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Простите, не понял. Нельзя ли пояснить на примере?
1
Day
1158 / 963 / 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-м варианте призодится менять в двух местах, что чревато ошибками.
1
accept
4822 / 3243 / 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]$
0
Сыроежка
Заблокирован
12.11.2011, 20:48 #10
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Для структур не выделяется память! Структуры - это объявление типа. Память выделяется для объектов этого типа, то есть для объектов, которые имеют тип заданной структуры!

Так что ваш пассаж совершенно некорректный!
0
accept
4822 / 3243 / 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

Цитата Сообщение от Сыроежка
Структуры - это объявление типа.
можно по-разному говорить
структурой можно назвать структурный тип
структурой можно назвать структурную переменную
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 02:18
Привет! Вот еще темы с ответами:

warning при использовании переменной из подключаемого файла - C++
При работе с библиотекой slang я подключаю файл slang.h Мне нужно получить значение двух переменных SLtt_Screen_Rows и...

Конфликт глобальной и локальной переменных - C++
Почему не работает функция вывода даных void output(), помогите найти ошибку #include&lt;iostream&gt; #include&lt;conio.h&gt; ...

Избавиться от глобальной переменной - C++
#include &lt;iostream&gt; // подключаем ввод/вывод #include &lt;cmath&gt; // подключаем математические...

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


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
13.11.2011, 02:18
Ответ Создать тему
Опции темы

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