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

 
Продолжаются вопросы. :), Откуда берутся значения переменных.
Test3R
Отправлено: 02.02.2007, 12:33


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

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



Значения переменных должны определиться в главной форме по нажитию на кнопку Button2. При нажатии на кнопку Button3 должен произвестись расчёт. Переменные должны иметь положительные значения после нажатия на кнопку Button2. Но, видимо, они берутся не с главной формы (где они положительные), а из юнита классов, где их значения не определены.
Как сделать, чтоб значения переменных брались из главной формы?

User Attached Image Скачать файл
Копия_НЛ.zip


Test3R
Отправлено: 02.02.2007, 12:46


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

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



Добавлю, что при расчёте (кнопка Button1) возникает ошибка деления на 0, хотя в главной форме переменные определены положительно, вывод — они берутся из юнита классов.
Как сделать, чтоб значения переменных при расчёте брались из главной формы? smile.gif
olegenty
Отправлено: 02.02.2007, 13:21


Ветеран

Группа: Модератор
Сообщений: 2412



как вариант — сделать их членами класса-формы и обратиться соответствующим образом.
Test3R
Отправлено: 02.02.2007, 14:33


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

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



Ок. Но просто в разработке проги могут добавиться ещё формы, из которых будут меняться переменные моего класса. Так что хотелось бы ещё услышать варианты.
AVC
Отправлено: 02.02.2007, 15:14


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Test3R @ 02.02.2007, 13:33)
Так что хотелось бы ещё услышать варианты.

Использование глобальных переменных увеличивает шанс появления ошибок из-за возростания трудноотслеживаемых неявных связей, возможно с "побочными" эффектами.
В крайнем случае можно инкапсулировать их в отдельный класс с четко оговоренными правилами их использования.
Test3R
Отправлено: 02.02.2007, 16:05


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

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



QUOTE
Использование глобальных переменных увеличивает шанс появления ошибок из-за возростания трудноотслеживаемых неявных связей, возможно с "побочными" эффектами.
В крайнем случае можно инкапсулировать их в отдельный класс с четко оговоренными правилами их использования.


Из вашего сообщения почти ничего не понял. smile.gif Что значит "инкапсулировать их в отдельный класс" и как это сделать?
nawok78
Отправлено: 02.02.2007, 17:24


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

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



есть такое понятие как область значений (или видимости) — пусть меня поправят — смысл в том что в разных областях можно объявить одинаковые переменные , апотом обращаться к ним

a::Var или b::Var

а так сделай эти переменные не глобальными в к-м либо юните, а полями формы (если не нужно чтоб для каждого экз-ра формы они были едины). потом в подключай ашник главной формы в другом сишнике и обрашайся к переменной :
FMain->Var
aquanet sk
Отправлено: 03.02.2007, 00:56


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

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



на счет последнего сообщени смогу пояснить, если не врубишься.
Test3R
Отправлено: 03.02.2007, 12:11


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

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



2nawok78
Спасиб конечно, но не понял, где надо объявлять переменную. В каком файле в моём случае.

2aquanet sk
Ты прям как знал, что я не пойму, что делать. smile.gif Мож аська есть?
Если нету, то объясни для моего случая, чтоб нагляднее было мне.

Вот переменные принимают значения при нажатии на Button2:
Parameters.AttKick = 50;
Parameters.AttDexterity = 60;
Parameters.AttGoodLuck = 30;
Parameters.AttHealth = 10;
Parameters.AttHP = 5000;
Parameters.AttPower = 30;
Parameters.DefKick = 50;
Parameters.DefDexterity = 30;
Parameters.DefGoodLuck = 60;
Parameters.DefHealth = 10;
Parameters.DefHP = 5000;
Parameters.DefPower= 30;

Как и где именно мне их надо объявить, чтобы при расчёте в ClassesUnit.cpp они брались из главной формы.
И как к ним надо обращаться и в главном cpp, и в ClassesUnit.cpp? Так — Parameters.DefPower или Parameters->DefPower?
beginner
Отправлено: 03.02.2007, 13:26


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

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



Классы спроектированы на редкость неудачно.
Лучше бы переделать. Хотя бы тип Parameters в TChances
изменить на TParameters*.

А чтоб эта версия работала нужно
1. Изменить тип TParameters Parameters; в NLUNit.h на
TParameters *Parameters;

2. после randomize() в TForm1::TForm1 написать
Parameters = &Move.Parameters;

3. C помощью редактора заменить в NLUnit.cpp все
Parameters.
на
Parameters->

4. В конец TForm1::Button2Click написать
Move.Chances.Parameters = Move.Parameters;

Но лучше перепроектировать класс.
Test3R
Отправлено: 03.02.2007, 13:59


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

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



2beginner
Спасиб. Подскажите, как перепроектировать классы мои, чтоб было удачно? smile.gif Хотелось бы про все классы услышать.
Test3R
Отправлено: 04.02.2007, 12:20


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

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



И всё-таки, как лучше перепроектировать классы мои?
nawok78
Отправлено: 05.02.2007, 10:58


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

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



QUOTE

И как к ним надо обращаться и в главном cpp, и в ClassesUnit.cpp? Так — Parameters.DefPower или Parameters->DefPower?

Parameters.DefPower — если Parameters — статическая переменная
Parameters->DefPower- если Parameters — динамическая переменная (указатель)
smile.gif

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