![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Линкер выдает ошибку --
Error: _DAT defined in module main.cpp is duplicated in module dat.cpp Суть такова: В заголовочном файле dat.h есть структура DAT( там же заполняется ), в файле main.cpp включен файл dat.h и в dat.cpp тоже включен файл dat.h соответственно. Ошибка потому что тип DAT обьявляется дважды, пачиму так ![]() 30 минут непоняток.... -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 2 Всего: 58 |
apook,
Можно в файле main.cpp записать макрос (перед включением dat.h), к примеру : #define MAIN_CPP а в dat.h #ifdef MAIN_CPP (заполняем) #else (просто объявляем) #endif Это сообщение отредактировал(а) GrayCardinal - 20.9.2007, 12:41 |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Дело в том что она тока там и определяется(то бишь в хеадере)
так поправки: структура такая -- struct { char Ы[ 3 ][ 1 ]; //идентификаторы int Г; } DAT={ { "\x1", "\x1", "\x1" }, { 25 } }; надо чтоб эта структура заполнялась только в файле dat.h и именно таким способом -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 2 Всего: 58 |
apook,
Именно таким способом не прокатит ![]() Добавлено через 1 минуту и 2 секунды ЗЫ и объявляется дважды НЕ ТИП, а ПЕРЕМЕННАЯ "DAT". |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Да это понятно там опечатка, но почему не прокатит не понятно я с этим не согласен, п о ч е м у у у???
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
c extern все понятно
О, а как сделать? Хотелось заполнить сразу при обьявлении... -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Потому что header - это НЕ отдельный модуль, а всего лишь кусочек другого модуля. В твоём случае этот кусочек фигурирует аж в двух модулях(можешь с тем же успехом убрать include и руками скопировать содержимое своего хэдера в оба модуля), как и дважды фигурирует определение переменной DAT. Так понятно? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Но ведь дело в том что так и надо делать( по правильному, соответственно в main.cpp и функция int main() так что я не могу в этом модуле не включить и в нем dat.h так как из main я пользуюсь данными из структуры DAT), не прокатывает только заполнение структуры при ее обьявлении... я специально вытащил ее из класса только для того чтоб заполнять при обьявлении, в общем стоял перед выбором заполнять ее в конструкторе или таким способом, польстился чето на второй
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 2 Всего: 58 |
Ыыыы. LOL. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
apook, так и заполняй себе при объявлении на здоровье. Только отдели мух от супа, т.е. объявление типа от объявления переменной. Первое - в хедер, второе - в cpp.
А не нравится - все претензии к Страуструпу - это он, гад, напридумал... А нет, это даже Керниган с прочими праотцами С... ![]() ![]() ![]() -------------------- ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
apook, не парь мозги ни себе ни нам. Вот тебе пример(хотя их на форуме десятки):
Если это не понятно, то советую обратиться к книге и постараться увидеть там нечто большее, чем "фигу". -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Ну что-за пример! я б не додумался до такого Заполнять при обьявлении имелось ввиду напр:
проделать сие в хеадере как я теперь понял нельзя.... -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
И чем твой пример отличается от int x = 75;? 0_o Вообще говоря, тебе не плохо было бы узнать разницу между объявлением и определением. "Заполнять"(а точнее, инициализировать) при объявлении нельзя - так устроен язык С++. В хэдере можно делать абсолютно всё, что можно делать в самом модуле(.cpp), но нужно осозновать возможные последствия содеянного. Попробуй задаться для себя вопросом: в чём для тебя принципиальная разница "заполнения" в хэдере или модуле? Думаю, когда ответишь на него, все вопросы сразу отпадут. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
![]() -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Думаю ответ: хотелось инициализировать общую переменную в одном месте, но ты, почему-то выбрал для этого хэдер(таким образом сделав инициализацию во всех модулях, которые используют этот хэдер), вместо того, чтобы сделать инициализацию в одном из модулей или вообще в отдельном модуле. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
так, если уж разбитраться что подтолкнуло обьявить переменную в хеадере, то скажу что этому предшествовало, предупреждаю что все не очень серьезно. а дело было так, напоминаю что переменная является структурой и вполне вероятно, так как я не совсем ясно представляю всех нюансов достижения будущей программой поставленного результата, эта структура станет массивом структур.. Структура являлась членом некого класса, дойдя до написания конструктора которого я встал перед вопросом заполнения полей структуры( а заполняется она заранее известными данными) , их примерно 10 - 15(полей) т.е не много(чтоб начать плодить хеадеры с коими итак путанница) но и не мало чтоб это незаметно выглядело в конструкторе(строки типа
Кстати уже инициализировал в конструкторе(временно), но однак так и останется.... Сейчас пришло на ум поиграться со значеничми по умолчанию и инициализировать типа статически, но опять же не все компиляторы поддерживают такую фишку в default constructor, есть-ли какие-нибудь соображения?? чты эт не очень серьезно так ка прога и так работть будет Это сообщение отредактировал(а) apook - 22.9.2007, 14:21 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
apook, при очень большом желании можно и зайца курить научить (вопрос зачем?). В твоём случае, один из вариантов может быть такой:
В одном из *.cpp файлов нужно определить _DATA. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
если инициализацией простой не обойтись, то можно сделать следущее:
(надеюсь правильно тебя понял)
|
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Одной из причин было уменьшение строчек кода, хотяб иллюзия этого
![]() Спасибо за предложеннные варианты. -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
как борться с тем что при включении хеадера значительно утяжеляется исполняемый файл, даже если (ради эксперемента) не вызывать ничего из этого файла ?
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
ради эксперимента попробовать не включать такой хедер
![]() Это сообщение отредактировал(а) akizelokro - 28.9.2007, 13:28 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Мне почему-то хочется включить iostream.h
Хотя включив просто iostream.h файл не увеличивается, а если вызвать cout то увеличивается с 4.67 kb до 28.9 kb!!! ![]() а файл string хватает просто включить и файл увеличивается до 70 kb ![]() ![]() ![]() Это сообщение отредактировал(а) apook - 28.9.2007, 14:29 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Странные нынче программисты пошли... no comments -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
товарищ Уолтер Савич говорит что в cpp файле для хеадера следует писать
говорится так-же что при таком включении не надо передавать имя такого файла в параметре компилятора, а так же не надо включать его через include напр: #include"somefile.cpp" на практике это не работает. Работает так:
и имя файла передается с пареметром компилятору что-за ? Это сообщение отредактировал(а) apook - 1.10.2007, 07:04 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
apook, ты сам то понял, что написал?
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Да, ну если захотеть не понять то можно и не понять. Извиняюсь я не на экзамене и даже не на уроке чтоб формулировать суперточно. Тебя смутила фраза
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
а что именно не понятно то? я чесно не понял...
![]() -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Предположу, что достопочтенный товарищ Савич писал не
а
Также предпоожу, что (насколько я трудно тебя понял) он пытается показать как функции хедера (.hpp,.h файл) возложить на файл с расщирением .cpp. Если это даже близко не так, то мне вас не близко не понять -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
apook |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
да точно
![]() -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||
|
|||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Все разобраля! Действительно бредово получилось
![]() ![]() Вот кусочек из примера Уолтера Савича
Смущает комментарий "Хотя в данном файле этого не требуется" находящийся напротив включения #include "list.h", развивая мысль и убрав эту строку получаем ошибку .... has no been declared. Запутал подлец с утра, а я напридумывал черти-че см мой вопрос выше -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Ты на форуме, где ты должен формулировать свои вопросы достаточно точно, чтобы получить адекватные ответы. Ты нафлудил 782 поста и так и не научился, ни вопросы задавать, ни мысли формулировать, ни программировать. На месте модераторов я бы давно тебе влепил бы не одно предупреждение ибо такая халатность и отсутствие уважения к форумчанам(мы тебе чё, обязаны, что ль?) простительны только ньюбам. Я его не читал, но если кусочек не сильно выдран из контекста, то могу лишь посоветовать Савичу пустить себе пулю в лоб, пока это не сделал кто-то другой. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
archimed7592 твои претензии выдраны из контекста
Я ведь не к тебе именно обратился, а к тем кто непосчитает вопрос флудом и не против посоветовать.. зачем так преувеличивать?
Че-за крутизна, не нравлюсь не общайся -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Маленький совет: разберись с тем, что такое единица трансляции и правило одного определения, и узнай, что делают директивы include, ifndef, define, endif. Далее, если с логическим мышлением всё в порядке, тебе станет ясно, что и как надо делать.
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
"Крутизна" как раз таки исходит с твоей стороны:
А это: Если бы я понял, я бы наверное не спрашивал бы тебя понял ли ты сам. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
apook, согласен с UnrealMan и archimed7592. И от себя еще раз попрошу читабельно формулировать задачи, желательно используя знаки препинания в предложениях.
За код, приведенный тобой вначале, я бы послал автора штудировать Страуструпа и других хороших товарищей, так как в .cpp-файлах конструкция вида #ifndef... #define........#endif бессмысленна, потому что они и так транслируются один раз. Применима она как раз в хедерах, которые могут включаться не в один .cpp-файл. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
apook, правда непонятно нифига, не заводись
![]() Первый раз вижу защиту от двойного подключения в cpp-файле... пропустил страницу обсуждения... Это сообщение отредактировал(а) zkv - 1.10.2007, 16:18 |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Программирование на С++, 4 издание, Уолтер Савич, стр 649 специально нашел в инете электронный вариант прикрепил как-раз эту страницу. Надо поуглубленней изучит книгу тут говорят неплохой автор ![]() Это сообщение отредактировал(а) apook - 1.10.2007, 18:09 Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
А теперь разуй глаза и посмотри на 648 страницу. Это не модуль трансляции. Это обычный заголовочный файл с расширением .cpp [не стал читать полностью, но, по всей видимости это пример того как можно "разделить" интерфейс от реализации в случае шаблонов] Это сообщение отредактировал(а) archimed7592 - 1.10.2007, 18:13 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Впрочем я что-то подобное говорил в первом вопросе по этому поводу. Все-равно твоя реакция предвзята, че так сразу в штыки...
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Ни хрена себе предвзята. 5 страниц флуду ни о чём. Давай не будем обсуждать меня или тебя, а будем обсуждать твою проблему. Она исчерпана? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |