Russian Qt Forum

Qt => Вопросы новичков => Тема начата: nikakula от Ноябрь 16, 2014, 18:04



Название: Как сделать глобальную переменную?
Отправлено: nikakula от Ноябрь 16, 2014, 18:04
Есть две формы. Переменная i высчитывается в первой форме, а отображаться она должна во второй форме. Для этого, на сколько я понимаю, она должна быть глобальной. Как ее таковой сделать?


Название: Re: Как сделать глобальную переменную?
Отправлено: vitfil от Ноябрь 16, 2014, 18:42
Глобальные переменные... "Отрежу руку!" (С) "Мастер и Маргарита"


Название: Re: Как сделать глобальную переменную?
Отправлено: kambala от Ноябрь 16, 2014, 18:48
можно передать переменную в другую форму, например через конструктор или отдельный метод


Название: Re: Как сделать глобальную переменную?
Отправлено: Old от Ноябрь 16, 2014, 19:53
Есть две формы. Переменная i высчитывается в первой форме, а отображаться она должна во второй форме. Для этого, на сколько я понимаю, она должна быть глобальной. Как ее таковой сделать?
Как только переменная высчиталась, нужно послать сигнал с ее значением, а во второй форме сделать слот.

P.S. Ну и конечно, плохо если что-то вычисляется в формах.


Название: Re: Как сделать глобальную переменную?
Отправлено: Alexu007 от Ноябрь 17, 2014, 00:19
Чем плоха глобальная переменная? Тем, что её может несанкционированно изменить чужой дядя программист? Ну так он и сигнал-слот поменять может при желании.

И вообще это всё байда для крупных проектов с десятками програмистов. Маленкую програмульку можно написать с нарушением всех правил.

Код
C++ (Qt)
//В первой форме в начале объявляете переменную:
 
#include ...
#include ...
#include ...
 
int global_XYZ = 10;
 
//во второй, где нужно эту переменную увидеть:
//название переменной может быть любой. global_XYZ это для примера.
 
#include ...
#include ...
#include ...
 
extern int global_XYZ;



И эта. Плохо что-то вычислять в формах. А где вычислять то? Между формами?


Название: Re: Как сделать глобальную переменную?
Отправлено: Igors от Ноябрь 18, 2014, 09:58
И вообще это всё байда для крупных проектов с десятками програмистов. Маленкую програмульку можно написать с нарушением всех правил.
Конечно это не преступление, но рано или поздно жизнь научит: чем меньше глобальных переменных - тем лучше. Хорошее лекарство (ускоритель понимания) - параллельные расчеты.


Название: Re: Как сделать глобальную переменную?
Отправлено: DenKor29 от Ноябрь 21, 2014, 08:23
Есть две формы. Переменная i высчитывается в первой форме, а отображаться она должна во второй форме. Для этого, на сколько я понимаю, она должна быть глобальной. Как ее таковой сделать?

Используйте концепцию сигнал - слот и будет Вам глобальное счастье  :)
Из первой формы высылается сигнал при изменении заначения переменной. Во второй форме этот сигнал ловится в нужный слот. Глобальная переменная при этом не нужна.


Название: Re: Как сделать глобальную переменную?
Отправлено: Alexu007 от Ноябрь 21, 2014, 18:08
А можно вопрос чуть-чуть не по теме? Как правильно сделать досрочный выход из вложенных циклов? Ну, например, нужно найти координаты чего-нибудь на плоскости. goto как я понимаю, очень не приветствуется?


Название: Re: Как сделать глобальную переменную?
Отправлено: Alex Custov от Ноябрь 21, 2014, 18:31
А можно вопрос чуть-чуть не по теме? Как правильно сделать досрочный выход из вложенных циклов? Ну, например, нужно найти координаты чего-нибудь на плоскости. goto как я понимаю, очень не приветствуется?

Можно и через goto. Религиозные убеждения обычно прощают использование goto во вложенных циклах. Но фундаменталисты предпочитают использовать булевый флаг (типа found = true), по которому обрываются все внешние циклы.


Название: Re: Как сделать глобальную переменную?
Отправлено: Igors от Ноябрь 21, 2014, 18:34
А можно вопрос чуть-чуть не по теме? Как правильно сделать досрочный выход из вложенных циклов? Ну, например, нужно найти координаты чего-нибудь на плоскости. goto как я понимаю, очень не приветствуется?
Если действительно глубокая вложенность (5-6 циклов), то возможно испустить исключение (throw). В остальных случаях - банальный break, или вставка флага в условие цикла, напр

Код
C++ (Qt)
bool found = false;
for (int i = 0; i < numI; ++i) {
for (int j = 0; j < numJ; ++j) {
 // do something
 if (...) {
  ...
  found = true;
  break;
 }
}
if (found) break;
}
 
Код
C++ (Qt)
bool found = false;
for (int i = 0; i < numI && !found; ++i) {
for (int j = 0; j < numJ && !found; ++j) {
 // do something
 if (...) {
  ...
  found = true;
 }
}
}

gpto используется когда нужна исключительная заточка по скорости (часто вкупе с likely/unlikely)


Название: Re: Как сделать глобальную переменную?
Отправлено: vulko от Ноябрь 21, 2014, 23:43
А можно вопрос чуть-чуть не по теме? Как правильно сделать досрочный выход из вложенных циклов? Ну, например, нужно найти координаты чего-нибудь на плоскости. goto как я понимаю, очень не приветствуется?

Можно и через goto. Религиозные убеждения обычно прощают использование goto во вложенных циклах. Но фундаменталисты предпочитают использовать булевый флаг (типа found = true), по которому обрываются все внешние циклы.

Не можно.
Вместо goto можно делать if else, continue, return и break.
Понимание почему не можно приходит при переносе кода, например, из плюсов в жабу.
И хорошо если goto используется для перехода ниже по функции, а если их много и много условий и они дают нелинейное ветвление...

А бывает что с помощью goto как бы упрощают логику алгоритма, при этом читабельность такого кода может стремиться к нулю.

Религия тут ни при чем.


Название: Re: Как сделать глобальную переменную?
Отправлено: Alexu007 от Ноябрь 22, 2014, 15:42
А если пять вложенных циклов? Четыре ifа против одного goto только потому, что кто-то когда-то придумал, что низзя...

Может в старые стародавние времена, когда вся программа представляла непрерывную последовательность команд - чрезмерное увлечение goto и приводило к неприятностям. Но сегодня программа (на Qt) это набор обработчиков (функций), а goto прыгает только внутри функции.


Название: Re: Как сделать глобальную переменную?
Отправлено: Igors от Ноябрь 22, 2014, 16:49
А если пять вложенных циклов? Четыре ifа против одного goto только потому, что кто-то когда-то придумал, что низзя...
Ну в общем-то правильно придумал. Если необходимость такого глубокого выхода возникает - значит что-то не так, и это наталкивает на какие-то мысли/решения. А с goto просто "затыкается дырка". Вообще приведите живой пример, а то "если-если"


Название: Re: Как сделать глобальную переменную?
Отправлено: Bepec от Ноябрь 22, 2014, 17:08
Goto лишает код структурированности. В результате его использования точка выполнения кода прыгает хз куда. И зачастую в таких конструкциях пока не пройдёшь дебагером, логики не поймёшь.

И потому это плохо. Ведь при добавлении кода без понимания всей логики можно таких дров наломать :D Что ай ай ай.


Название: Re: Как сделать глобальную переменную?
Отправлено: Alex Custov от Ноябрь 22, 2014, 19:08
Не можно.
Вместо goto можно делать if else, continue, return и break.

При этом страдает другое религиозное чуйство - красота кода.

Понимание почему не можно приходит при переносе кода, например, из плюсов в жабу.

Почему? Не вижу связи (я переносил код).


Название: Re: Как сделать глобальную переменную?
Отправлено: gil9red от Ноябрь 22, 2014, 21:19
При этом страдает другое религиозное чуйство - красота кода.

https://ru.wikipedia.org/wiki/Goto люблю вики :)


Почему? Не вижу связи (я переносил код).

Наверное, потому что в яве нет goto, из-за чего придется переписывать алгоритм, который в реализации с++ использует goto :)


Название: Re: Как сделать глобальную переменную?
Отправлено: Alex Custov от Ноябрь 22, 2014, 21:24
Наверное, потому что в яве нет goto, из-за чего придется переписывать алгоритм, который в реализации с++ использует goto :)

Его и так придётся переписывать, просто потому, что Java - это не C++ (К.О.). Особенно если С++ код написан с использованием более-менее нового стандарта.


Название: Re: Как сделать глобальную переменную?
Отправлено: vulko от Ноябрь 23, 2014, 00:18
Не можно.
Вместо goto можно делать if else, continue, return и break.

При этом страдает другое религиозное чуйство - красота кода.

Понимание почему не можно приходит при переносе кода, например, из плюсов в жабу.

Почему? Не вижу связи (я переносил код).

что такое красота кода? и почему с goto красивее?
реальный пример есть?


Название: Re: Как сделать глобальную переменную?
Отправлено: Bepec от Ноябрь 23, 2014, 10:22
Блин, реально разжёванная давно тема - у операторов if else return и прочих имеются правила входа и выхода.
У Goto нет правил, поэтому код написанный с его использованием не поддаётся быстрому анализу человеком. Так же он непонятнее, не структурированнее и сложнее в правке.

Исправляя что то в ф-ции НЕ использующей goto мы точно знаем что можем повлиять только на блок кода в конструкции if else и прочих.

Исправляя что то в ф-ции использующей goto мы не имеем гарантий что не создадим опасную ситуацию даже самыми безобидными исправлениями.

Пример:
Создание и удаление объекта.
Без goto: мы точно знаем где и как будет исполняться код. Создали объект, зашло в if, у него 2 пути в конце которого надо удалить объект.

С goto: мы не знаем где и как будет исполняться код. Создали объект, и вот тут засада... goto может перебросить точку исполнения вверх и мы создадим 2 объекта, может перебросить вниз до создания и мы попытаемся удалить пустой указатель.


Название: Re: Как сделать глобальную переменную?
Отправлено: Hrundel от Ноябрь 25, 2014, 01:18
На работе был один чудлан, написал глючную прогу с 8 глобальными переменными. И давай их в хвост и в гриву использовать. Его через месяц уволили, а меня попросили исправить ошибки и внедрить. Две недели бился с этими 8 перемеными - искал в каком месте программы ошибочные значения получают. Плюнул за три недели написал все с нуля.