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

Объявление массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 93, средняя оценка - 4.83
yava
3 / 3 / 0
Регистрация: 13.07.2009
Сообщений: 83
13.07.2009, 11:32     Объявление массива #1
Есть два файла первый с функцией main() main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include "first.cpp"
using namespace std;
 
 
 
void main()
{
    cout << "test" <<"\n";
    
 
    string cmd;
    cin >> cmd;
}
и второй файл first.cpp:
C++
1
int marray[10][10];
Компилятор выдает ошибку, я не поемаю почему и как исправить:
Error 1 error LNK2005: "int (* marray)[10]" (?marray@@3PAY09HA) already defined in first.obj main.obj
Error 2 fatal error LNK1169: one or more multiply defined symbols found D:\master\Debug\include_files.exe 1
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
13.07.2009, 11:36     Объявление массива #2
У тебя есть строка #include "first.cpp", при этом файл first.cpp наверняка дополнительно включен в проект (т.е. он ещё раз компилируется). В итоге ты фактически имеешь следующий набор исходников:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
int marray[10][10]; // <---- результат работы директивы #include "first.cpp"
using namespace std;
 
 
 
void main()
{
        cout << "test" <<"\n";
        
 
        string cmd;
        cin >> cmd;
}
C++
1
int marray[10][10];
Т.е. имеешь два определения myarray
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
13.07.2009, 11:39     Объявление массива #3
Используй заголовок типа:
first.h
C++
1
int marray[10][10];
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include "first.h"
using namespace std;
 
 extern int marray[10][10];
 
void main()
{
        cout << "test" <<"\n";
        
 
        string cmd;
        cin >> cmd;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
13.07.2009, 12:37     Объявление массива #4
Цитата Сообщение от RazorQ Посмотреть сообщение
Используй заголовок типа:
first.h
C++
1
int marray[10][10];
ТОже неправильно. extern должен быть в файле .h, а строку 6 из твоей версии main.cpp надо удалять
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
13.07.2009, 12:38     Объявление массива #5
Точно. Всё я напутал.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
13.07.2009, 12:47     Объявление массива #6
Итого, окончательный вариант, как оно должно быть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
// Файл main.cpp
#include <iostream>
#include <string>
#include "first.h"
using namespace std;
 
void main()
{
        cout << "test" <<"\n";
        string cmd;
        cin >> cmd;
}
C++
1
2
3
4
// Файл first.cpp
#include "first.h" // <--- в данный момент для контроля от собственных ошибок
 
int marray[10][10];
C++
1
2
3
4
5
6
7
// Файл first.h
#ifndef FIRST_H // <--- пусть тебя не пугает этот макрос. На начальном этапе 
#define FIRST_H //      воспринимай его "так надо", со временем поймёшь
 
extern int marray[10][10];
 
#endif // FIRST_H
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
13.07.2009, 13:20     Объявление массива #7
Цитата Сообщение от Evg Посмотреть сообщение
#ifndef FIRST_H // <--- пусть тебя не пугает этот макрос. На начальном этапе
#define FIRST_H // воспринимай его "так надо", со временем поймёшь
А разве он настолько сложен, чтобы его сейчас понять. Здесь все предельно просто, чтобы один заголовок в один и тот же файл больше одного раза не включался.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
13.07.2009, 13:23     Объявление массива #8
Цитата Сообщение от RazorQ Посмотреть сообщение
А разве он настолько сложен, чтобы его сейчас понять. Здесь все предельно просто, чтобы один заголовок в один и тот же файл больше одного раза не включался.
Нет, не сложно. Но человеку, который в первый раз в жизни растаскивает исходник по двум файлам - действительно сложно. Особенно если учесть, что у него нет чёткого понимания, что делает директива include
yava
3 / 3 / 0
Регистрация: 13.07.2009
Сообщений: 83
13.07.2009, 14:58  [ТС]     Объявление массива #9
Я пишу в VS, да если убрать файл из проекта а объявление оставить, то все работает, но ...
А как сделать так, чтобы файл оставить в проекте и все работало?
Если убрать
C++
1
#include "first.cpp"
то компилятор пишет
Error 1 error C2065: 'marray' : undeclared identifier d:\master\include_files\main.cpp 13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2009, 15:00     Объявление массива
Еще ссылки по теме:

C++ Объявление размера одномерного массива
C++ объявление массива
Объявление двумерного массива (не целочисленные значения) C++
Объявление размерности массива в Microsoft VS C++
C++ Объявление двумерного массива в классе

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
13.07.2009, 15:00     Объявление массива #10
В посте #6 я всё тебе расписал, в каком файле что лежит
Yandex
Объявления
13.07.2009, 15:00     Объявление массива
Ответ Создать тему
Опции темы

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