С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
Kizi
1

Без глобальных переменных.

22.10.2011, 20:37. Показов 5665. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1.
Код
void __fastcall TForm2::FormClick(TObject *Sender)
{
  TPoint pt;
  GetCursorPos(&pt);
  int x = pt.x;
  int y = pt.y;
}
Как другой функции узнать значение "x" и "y" без объявления глобальной переменной?
Можно ли и как обратится к IDE функции из другой функции что бы узнать значение "x" и "y"?

2.
Код
bool fun( int x, int y);
{
  int z;
  //всякое
}
Функция "fun" вызывается неоднократно.
Как без объявления глобальной переменной "z", сохранять ее значение, ведь при повторном объявлении значение обнулится?
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
22.10.2011, 20:37
Ответы с готовыми решениями:

Получить значение переменной из потока без создания глобальных переменных
void __fastcall Pars::Execute() { Synchronize(&UpdateCaption); }...

Просмотр значений глобальных переменных при отладке
Есть ли возможность в C++ Builder 10.3 при отладке проcматривать значения глобальных переменных?

Объявление глобальных переменных для всего проекта
Подскажите как объявить переменные, так чтобы они были глобальными для всего проекта, т.е. для всех...

Непонятная робота глобальных переменных в разных Юнитах билдера
Проблема следующая. Есть Юнит5, где сохранены глобальные переменные. В Юнит3, я делаю некие...

23
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
22.10.2011, 20:55 2
А в чем проблема объявить глобальную переменную?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
22.10.2011, 21:10 3
1.TPoint pt, как минимум, можно сделать членом класса.
2. Объявить её используя ключевое слово static.
P.S. глобальные переменные, без крайней необходимости, не следует использовать вообще .
1
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
22.10.2011, 21:39 4
Цитата Сообщение от rangerx Посмотреть сообщение
глобальные переменные, без крайней необходимости, не следует использовать вообще
- вопрос дилетанта: "а почему" ?? Я очень часто их использую. И никогда по этой причине не имел неприятностей. Да и логически мне этот тезис непонятен... .
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
23.10.2011, 23:55 5
nick42, большинство начинающих используют глобальные переменные потому что:
1) "используя" ОО подход абсолютно не понимают, что представляет из себя ООП как таковое
2) чтобы побыстрее справиться с той или иной задачей, просто объявляют переменные "где попало"
Это что касается частого использования глобальных перменных... А так, совет один: пользуйся поиском. В сети немало статей на тему "почему глобальные переменные это плохо".
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
24.10.2011, 00:22 6
почитайте, что пишет про глобальные переменные Крис Касперски, может, не все так однозначно

C++
1
2
3
4
5
6
bool fun(int x,int y)
{
  int z;
  //всякое
  return z;
}
при чем тут bool понять не могу.
0
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
24.10.2011, 14:08 7
Тогда вопрос второй от дилетанта: "а зачем"? Зачем мне поиском собирать статьи на тему глобальных переменных? Я обычно, как всякий словянин, начинаю шевелиться тогда, когда ощущаю дискомфорт. Вот сегодня я где-то за час написал программу на Билдере (это в теме "Движение разных... Движение разных Image (не могу продумать реализацию) ). Вот её начало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
       TShape *selFly;
 
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
selFly здесь глобальная переменная, как я понимаю? Мне так удобно; программа написана быстро; и , вы меня извините, - я так и буду писать, пока что-то реальное (а не публикации) не убедит меня, что так поступать ошибочно.
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
24.10.2011, 21:11 8
а поискать все же стоило, Касперски как раз и пишет, что глобальные переменные - такие же переменные, как и все , вот и не было бы сердитого монолога от nick42
единственное, с чем я согласен относительно глобальных переменных - это не запутаться, где, какая и к чему относится
0
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
24.10.2011, 21:26 9
Цитата Сообщение от LK Посмотреть сообщение
вот и не было бы сердитого монолога от nick42
:dance3: - почему же "сердитого"?! Я только за то, чтобы начинающие программисты впитывали как можно больше знаний, но при этом не отрывались бы от земли (помнили о поставленной задаче) . В конечном счёте в программировании важна красота решения. А достичь его (решение) можно ведь разными путями.
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
24.10.2011, 22:15 10
Цитата Сообщение от LK Посмотреть сообщение
а поискать все же стоило, Касперски как раз и пишет, что глобальные переменные - такие же переменные, как и все
Я не знаю, что там пишет Крис Касперски, но глобальные переменные НЕ "такие же переменные, как и все". А если говорить об ООП, то такое понятие как глобальная переменная в нём отсутствует вообще. Я не против глобальных переменных как таковых, я просто пытаюсь объяснить, что их использование очень часто свидетельствует о низкой квалификации программиста, т.к. они используются там, где их использование является абсолютно неуместным.
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
24.10.2011, 22:35 11
Цитата Сообщение от rangerx Посмотреть сообщение
1. Я не знаю, что там пишет Крис Касперски
2. использование очень часто свидетельствует о низкой квалификации программиста,
3. используются там, где их использование является абсолютно неуместным.
1. это печально
2. предложите альтернативу
3. где их использование является уместным ?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
25.10.2011, 00:20 12
1. Честно говоря, не совсем понимаю, какое отношение тематика написанных им книг имеет к обсуждаемой теме...
2. Для начала, разобраться с тем, что из себя представляет ООП.
3. Cложно с ходу ответить на этот вопрос... Скажем, какие-нибудь общедоступные константы(например, число ПИ).
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
25.10.2011, 00:36 13
т.е., по сути вопроса ответа нет, печально...
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
25.10.2011, 00:48 14
Цитата Сообщение от LK Посмотреть сообщение
т.е., по сути вопроса ответа нет, печально...
Я ответил тебе абсолютно по сути... Ладно попробуем подойти с другой стороны: читал ли ты таких авторов как Скотт Майерс, Герб Саттер... И какие книги по ООП ты прочёл(в том числе и по паттернам проектирования)?
0
518 / 306 / 58
Регистрация: 30.07.2008
Сообщений: 607
25.10.2011, 00:48 15
Лучший ответ Сообщение было отмечено как решение

Решение

для начала Глобальная переменная - это то что доступно всем функциям и классам

потом - если делать переменную членом класса - она тоже "глобальная", но распространяется на класс порадивший ее


вот мой пример: в любое время можно узнать что где, и как =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <jpeg.hpp>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
///////////////////////////
POINT form_pos_old;
RECT TrayWindowRect;
bool WPCx = false;
bool WPCy = false;
BYTE size_ = 15;  // OTSTUP
///////////////////////////
String cache = "";
String cache_BIG = "";
String ver_info = " - [WJ LFCe v0.2a]";
bool fail = false; // error status
//---------------------------------------------------------------------------
/*...*/
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Form1->DoubleBuffered = true;
    cache = ExtractFilePath( Application->ExeName ) + "cache\\";
    cache_BIG = ExtractFilePath( Application->ExeName ) + "cache\\cacheB\\";
    Memo1->Lines->Clear(); // clear LOG
    l("Start: OK"); // log
 
    Form1->Caption = String(Time()) + ver_info;
}
//---------------------------------------------------------------------------
/*...*/
//---------------------------------------------------------------------------

а по теме:
непонятно когда вызывается fun( int x, int y);
1) если сразу после нажатия то и передавать fun(tp.x, tp.y);
2) можно использовать указатель
4) можно вообще в Edit1 хранить xD xD xD (кстати, вот и без глобальных переменных)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------
bool fun( int x, int y);
{
if(x == y) return true;
else return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClick(TObject *Sender)
{
  TPoint pt; // невижу смысла НЕ делать глобальный TPoint
/*
1) так как тратится время на создание TPoint
2) --- // ---  на уничтожение TPoint в конце функции
 
например если в таймере следить за позицией курсора, то гораздо удобнее, рациональнее использовать глобальный TPoint
*/
  GetCursorPos(&pt);
  int x = pt.x;
  int y = pt.y;
}
//---------------------------------------------------------------------------
3
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
25.10.2011, 01:09 16
Цитата Сообщение от rangerx Посмотреть сообщение
1. Я ответил тебе абсолютно по сути...
2. какие книги по...
1. довольно расплывчастым был ответ
2. чукча - не читатель ... чукча - писатель ... ... хватит того, что ты читал и Майерса, и Скотта , и ихнее мнение, имхо, как и все остальное, "не догма, а руководство к действию", хотя я сомневаюсь, что ты знаешь, кто это сказал
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
25.10.2011, 01:22 17
Цитата Сообщение от Gremlin Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
POINT form_pos_old;
RECT TrayWindowRect;
bool WPCx = false;
bool WPCy = false;
BYTE size_ = 15; // OTSTUP
///////////////////////////
String cache = "";
String cache_BIG = "";
String ver_info = " - [WJ LFCe v0.2a]";
bool fail = false; // error status
Все эти флаги состояния и т.д. в виде глобальных переменных это процедурный подход, не объектно-ориентированный.
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Записей в блоге: 3
25.10.2011, 01:27 18
наверное, вам одному понятен вырванный из контекста кусок кода
в отличие от вас, уважаемый, буду более конкретным:
Крис Касперски
Противодействие дизассемблеру "во сне и наяву"
Совет №6 - используйте глобальные переменные
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
25.10.2011, 01:56 19
Цитата Сообщение от LK Посмотреть сообщение
1. довольно расплывчастым был ответ
Расплывчатым, на самом деле, является не мой ответ, а вопросы которые ты задаешь. Сама твоя постановка вопроса говорит о том, что ты не очень разбираешься в теме. Т.е. для того чтобы ответить на твой вопрос вроде "что применять в качестве альтернативы глобальным пременным" мне прдётся объяснять тебе основы ООП...
Цитата Сообщение от LK Посмотреть сообщение
2. чукча - не читатель ... чукча - писатель ... ... хватит того, что ты читал и Майерса, и Скотта , и ихнее мнение, имхо, как и все остальное, "не догма, а руководство к действию", хотя я сомневаюсь, что ты знаешь, кто это сказал
Я абсолютно не понял к чему этот выпад и переход на личности... Будем считать, что это попытка хоть как-то сохранить лицо в виду отсутствия аргументов. По сути: да, я читал книги данных(и не только) авторов. А тем, у кого уровень гонора, не соответствует уровню заний, я крайне советую прочесть не только упомянутых выше авторов, но и какую-нибудь книгу по объектно-ориентированному программированию.
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
25.10.2011, 02:01 20
Лучший ответ Сообщение было отмечено как решение

Решение

Этот диспут напоминает мне старинный спор про goto
Из своего скромного опыта могу сказать.
а) Иногда без глобальных - ну никак. Если некоторые данные пронизывают всю задачу, замучаешься передавать их параметрами.
б) Глобальные переменные - лишняя головная боль и источник странных ошибок. Например, сначала ты ее объявил, как int, а потом она стала double, где-то забыл поправить - дальше ясно...
в) Транслятор не ловит неиспользование глобальных переменных, а я страх как не люблю "мусора"
г) VCL первым делом создает глобальную TForm1 *Form1, так что ООП тоже не чужд глобальности.
Вывод. Надо каждый раз подумать, а можно ли обойтись без глобальности. Предпочитаю по возможности использовать static. Ее использование хотя бы ограничено пределами одного модуля. Легче отследить смысл и использование.
Но если кому-то комфортно иметь дело с глобальными переменными - да пусть ему будет хорошо!
3
25.10.2011, 02:01
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
25.10.2011, 02:01
Помогаю со студенческими работами здесь

Обойтись без использование глобальных переменных
Столкнулся на этапе написания программы с тем что необходимо анализировать данные за разный...

Массив (переписать без глобальных переменных)
Помогите написать ету програму без глобальных переменных #include &lt;cstdlib&gt; #include...

Быстрая сортировка без глобальных переменных
Реализовать двоичную сортировку, используя массив. Без использования функции...

Исправить без использования глобальных переменных
#include&lt;iostream&gt; using namespace std; int a,n,maximum=-1000,x; void zapros() { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru