C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблема с общими переменными!, Ну незнаю я !
Faster
Отправлено: 22.01.2004, 07:07


Не зарегистрирован







Вобщем суть такая .. мне надо каким либо образом сделать общие переменные, я додумался запихзатьих в отдельный файл и подгружать в каждом модуле или форме, но LINK мне орёт что они объявлены дважды ...

ВОПРОС, что мне делать ? может ли ктонить запихнуть пример как от этого избавится .... или как правельно надо делать !

P.S.ответов типа я ламер не надо ...
Vlad
Отправлено: 22.01.2004, 09:53


Машинист паровоза

Группа: Участник
Сообщений: 231



делаешь *.H в нем определяешь (и определяешь свои переменные)
#define MY_VAR — ну что-то типа этого,
а в других *.cpp при подлючении пишешь
#ifndef MY_VAR
include <*.h> -свой файл с определениями переменных
#endif

По моему так, должно прокатить.
Bond
Отправлено: 22.01.2004, 10:58


Станционный диспетчер

Группа: Участник
Сообщений: 142



//unit2.cpp
int a;

//unit2.h
#ifndef UNIT2_H
#define UNIT2_H
extern int a;
#endif
Faster
Отправлено: 02.02.2004, 12:08


Не зарегистрирован







ВОТ ТОТО И ОНО ЧТО ЛИНК ВСЁ РАВНОДУЕТСЯ ...

ВОТ ЕЩЁ ПОПРОБУЮ ПО ВТОРОМУ ОТВЕТУ НО ВСЁ РАВНО НЕ ВЕРИТСЯ sad.gif
Pirs
Отправлено: 10.02.2004, 00:36


Дежурный стрелочник

Группа: Участник
Сообщений: 39



Делаешь header файл и объявляешь в нем все свои переменные, НО ОБЯЗАТЕЛЬНО С ПРИСТАВКОЙ EXTERN
Подключай этот файл куда хочешь и сколько хочешь раз, НО В ОДНОМ ИЗ файлов проекта объявляешь точно эти же переменные но без extern.
Внимательно следи что бы объявления в обоих файлах были строго синхронны.

Zmey
Отправлено: 10.02.2004, 09:28


Ученик-кочегар

Группа: Участник
Сообщений: 15



Если тебе надо, что бы две формы (т е их модули ) видели одни и те же переменные объяви их в классе одной из форм (Form1 например) как public, обращение к ним из другой формы Form2: Form1->var .....

Глобальные переменные стоит использовать как можно реже, дабы не засорять память процесса.
Выход — запихнуть их в класс как статические поля, т е:

есть глобальные переменные: int num, double avr
тогда -
class Global
{
public static int num;
public static double avr;
}

обращение к ним как Global::num и Global::avr
eugene_sh
Отправлено: 15.02.2004, 16:35


Не зарегистрирован







Линкер выдает предупреждения, а не ошибки. На них можно не обращать внимания!
** olegenty
Отправлено: 16.02.2004, 09:14


Не зарегистрирован







если сделать, как написал BOND, всё будет пучком и без сообщений.
А на ворнинги компилятора нельзя не обращать внимания: физически память может быть выделена под несколько одноимённых переменных. замучаешься отлаживать потом.
exp
Отправлено: 20.02.2004, 01:16


Мастер участка

Группа: Участник
Сообщений: 304



пиши

extern PACKAGE double d;
Линкер заткнется.
Beut
Отправлено: 20.02.2004, 03:22


Не зарегистрирован







Ну... С классами умеешь работать? Объяви класс и сделай в нём статические поля. А потом их используй smile.gif
Beut
Отправлено: 20.02.2004, 03:46


Не зарегистрирован







А вообще в Билдере есть специальная форма для подобного — называется DataModule. И в ней объявляешь необходимые переменные после строки __fastcall

class TDataModule3 : public TDataModule
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TDataModule3(TComponent* Owner);

//Твои переменные

int i;
double d;

};


И теперь работаешь
DataModule3->i = 5;
int t = DataModule3->i;

DataModule3 для удобства можно переименовать, конечно же smile.gif

И теперь просто подключаешь эту форму ко всем тем формам, в которых тебе нужны будут эти переменные smile.gif
exp
Отправлено: 27.02.2004, 18:06


Мастер участка

Группа: Участник
Сообщений: 304



Ух- ты. удобно.

Вернуться в Вопросы программирования в C++Builder