Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Linker Warning при работе с разными модулями 
V
    Опции темы
Venik333
Дата 22.6.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.6.2010

Репутация: нет
Всего: нет



У меня есть много форм , и есть глобальная переменная , чтобы отображать ее на формах и там же изменять
Для этого я создаю отдельный заголовочный файл File1.h  и там ее объявляю , потом включаю этот файл во все формы и указываю на переменную так extern int Kol;
Для демонстрации на каждой форме есть 2 кнопки - при нажатии одной выводит содержимое переменной и увеличивает ее на единицу , при нажатии на вторую выводит след. форму
Все работает , но меня смущает почему линкер выдает предупреждения ? Не могу понять что не так , подскажите плиз

File1.h
Код

#ifndef File1_H
#define File1_H

int Kol=0;

#endif



Unit1.cpp
Код

#include "Unit1.h"
#include "File1.h"      //здесь глобальная переменная
#include "Unit2.cpp" //здесь вторая форма
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
extern int Kol;      //указываю что она уже объявлена в другом месте
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        this->Edit1->Text=Kol;
        Kol++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Form2->ShowModal();
}



Unit2.cpp
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "File1.h"  //здесь глобальная переменная
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
extern int Kol;    //указываю что она уже объявлена в другом месте
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{
        this->Edit1->Text=Kol;
        Kol++;
}



[Linker Warning] Public symbol '_Kol' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\3\UNIT1.OBJ and C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT2.OBJ
[Linker Warning] Public symbol '_Form2' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\3\UNIT1.OBJ and C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT2.OBJ

PM MAIL   Вверх
RatHat
Дата 22.6.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: -1
Всего: 1



в хедере напиши не просто 
Код

int Kol=0; 

а
Код

static int Kol=0;

--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
xvr
Дата 22.6.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(RatHat @ 22.6.2010,  11:37)
в хедере напиши не просто 
Код

int Kol=0; 

а
Код

static int Kol=0;

И получишь по своему собственному Kol в каждом модуле  smile 

К исходному вопросу:

А вообще такого извращения я еще не видел  smile 
 smile 
Возвращается муж из командировки, открывает дверь своим ключем, заходит в спальню.
Видит - в кровати лежит голый мужик.
Муж открывает дверцу шкафа, и обнаруживает там свою жену.
- (Устало) Сколько раз я тебе говорил, это ОН должен прятатся в шкафу, а ТЫ лежать на кровати.
---

extern int Kol; должно быть написано в хидере, а int Kol=0; в ОДНОМ cpp модуле.


PM MAIL   Вверх
RatHat
Дата 22.6.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: -1
Всего: 1



xvr, точно, лоханулся я. *ушёл в дворники*
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
Venik333
Дата 22.6.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.6.2010

Репутация: нет
Всего: нет



[Linker Warning] Public symbol '_Form2' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\3\UNIT1.OBJ and C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT2.OBJ
 
вот с предупреждением я разобрался - надо подключать файл формы .h а не .cpp

Код

static int Kol=0;


так только в каждом отдельная выходит действительно 

Мне надо чтобы переменная была видна из всех модулей и в каждом я бы смог ее изменять
К примеру сначало в основной форме - просмотрел ее значение и изменил как захотел - потом оттуда вызвал вторую форму - просмотрел текущее значение и изменил как захотел - потом вызвал третью форму и т.д.
Как правильно реализовать это?
PM MAIL   Вверх
xvr
Дата 22.6.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Venik333 @  22.6.2010,  11:59 Найти цитируемый пост)
Мне надо чтобы переменная была видна из всех модулей и в каждом я бы смог ее изменять
К примеру сначало в основной форме - просмотрел ее значение и изменил как захотел - потом оттуда вызвал вторую форму - просмотрел текущее значение и изменил как захотел - потом вызвал третью форму и т.д.
Как правильно реализовать это? 
Читать ответы, повторяю:

Цитата(xvr @  22.6.2010,  11:46 Найти цитируемый пост)

extern int Kol; должно быть написано в хидере, а int Kol=0; в ОДНОМ cpp модуле.


PM MAIL   Вверх
Venik333
Дата 22.6.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.6.2010

Репутация: нет
Всего: нет



Цитата(xvr @ 22.6.2010,  12:17)
Цитата(Venik333 @  22.6.2010,  11:59 Найти цитируемый пост)
Мне надо чтобы переменная была видна из всех модулей и в каждом я бы смог ее изменять
К примеру сначало в основной форме - просмотрел ее значение и изменил как захотел - потом оттуда вызвал вторую форму - просмотрел текущее значение и изменил как захотел - потом вызвал третью форму и т.д.
Как правильно реализовать это? 
Читать ответы, повторяю:

Цитата(xvr @  22.6.2010,  11:46 Найти цитируемый пост)

extern int Kol; должно быть написано в хидере, а int Kol=0; в ОДНОМ cpp модуле.

А все понял , спасибо  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0958 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.