С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52

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

12.11.2011, 01:40. Показов 3022. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2011, 01:40
Ответы с готовыми решениями:

Ошибка при обращении к динамической глобальной переменной
использую в файле Unit1(Form1) 2 переменные, которые обьявляю как глобальные в начале файла: TStringList *q1 = new TStringList; ...

[Mono] Ошибка при использовании локальной переменной
Проблема заключается в следующем. Есть класс DataBase: using System; using MySql.Data.MySqlClient; namespace MagChatServer { ...

Ошибка синтаксиса при использовании переменной
Фрагмент кода: bdw=shelve.open('baydb') ch=1 while ch!=0: print('введите один из вариантов и нажмите enter:/n &quot;s&quot;...

10
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.11.2011, 05:38
определения массивов должны быть в .cpp файле
1
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
12.11.2011, 07:39
И в данном контексте их необязательно делать глобальными.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.11.2011, 11:51
Лучший ответ Сообщение было отмечено как решение

Решение

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
49 / 7 / 1
Регистрация: 07.11.2010
Сообщений: 52
12.11.2011, 14:19  [ТС]
kazak, их глобальность нужна будет позже, я думал как обойтись без глобальных переменных, но так удобнее.


Байт, все стало понятно, спасибо
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.11.2011, 14:58
Цитата Сообщение от Байт
Хотя бывают и исключения. У меня в одном проекте есть структура, которая должна быть видна всем модулям, как extern. При этом структура "дышит", т.е. все время меняется (при разработке).
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.11.2011, 15:14
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Простите, не понял. Нельзя ли пояснить на примере?
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
12.11.2011, 15:18
Цитата Сообщение от Байт Посмотреть сообщение

Код 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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.11.2011, 15:20
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;
}
Code
1
2
3
4
[guest@localhost tests]$ .ansi main.c struct.c -o t
[guest@localhost tests]$ ./t
4
[guest@localhost tests]$
0
Заблокирован
12.11.2011, 20:48
Цитата Сообщение от accept Посмотреть сообщение
если для структуры выделяется память, то структура должна быть в единице трансляции
если для структуры не выделяется память, то структура должна быть либо в заголовочном файле, либо в единице трансляции
Для структур не выделяется память! Структуры - это объявление типа. Память выделяется для объектов этого типа, то есть для объектов, которые имеют тип заданной структуры!

Так что ваш пассаж совершенно некорректный!
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.11.2011, 02:18
Цитата Сообщение от Сыроежка
Для структур не выделяется память!
C
1
2
3
4
5
6
7
struct x {
    int a;
};
 
...
 
    struct x s;
создаётся структура s

Цитата Сообщение от Сыроежка
Структуры - это объявление типа.
можно по-разному говорить
структурой можно назвать структурный тип
структурой можно назвать структурную переменную
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2011, 02:18
Помогаю со студенческими работами здесь

Ошибка при объявлении глобальной переменной: "Переменная не является однозначной"
#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
Почему когда создаешь цикл фор по 2 раза и больше раз,и объявляешь там одну и ту же переменную(с одним названием),то не выдаёт ошибку?

Ошибка: "не удается найти имя типа или пространство имен Shed" при использовании класса
Я начал с книги фленова. Фленов М. - Библия С#. 2-е издание - 2011. Но Книга написано слишком сложным языком. слишком много теории мало...

Ошибка при использовании структуры или непредвиденное поведение (неверное значение переменной)
Добрый вечер. Столкнулся с проблемой при написании программы. Требуется нарисовать линию из символов (в приведённом ниже коде отсутствует...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru