Страницы

Поиск по вопросам

Показаны сообщения с ярлыком global-variables. Показать все сообщения
Показаны сообщения с ярлыком global-variables. Показать все сообщения

пятница, 14 февраля 2020 г.

Почему не записывается новое значение в глобальную переменую?

#javascript #global_variables #ecmascript




var arr = ["V", "l", "a", "d", "i", "m", "i", "r"];

var join = function (x) {
  return window.x = x.join('');
}

join(arr);

console.log(arr);




Вопрос стоит так, нужно получить именно новую переменную arr,которая в функции записывается
глобально, а не параметр функции.
    


Ответы

Ответ 1



Тоже отбитый вариант var arr = ["V", "l", "a", "d", "i", "m", "i", "r"]; var join = function(x) { for (var key in window) if (window[key] == x) window[key] = x.join(''); } join(arr); console.log(arr); Не особо правильно конечно но var arr = ["V", "l", "a", "d", "i", "m", "i", "r"]; var join = function (x) { window[x] = window[x].join(''); } join("arr"); console.log(arr);

Ответ 2



Такой код плохой, так как var join = function (x /* аргумент */) { return window.x /* глобальная переменная */ = x.join(''); } идёт путаница с x, в одном месте это название параметра в другом глобальная переменная. Конечно сам код запустится и скомпилируется, но таково кода следует избегать так как его сложно читать и сложно отлаживать. Так же таких конструкций тоже желательно избегать return window.x = x.join(''); лучше сделать отдельными операциями (одна строчка на одну операцию или группу операций единых по смыслу) что бы более была ясна суть, это конечно не ошибка рекомендую делать так window.x = x.join(''); return window.x; Заметим что результат попадает в возвратку функции и в x глобальную переменную, поэтому что бы вывести этот результат в консоль оттуда и надо брать console.log(x); или var rez = join(arr); console.log(rez); итого var arr = ["V", "l", "a", "d", "i", "m", "i", "r"]; var join = function(arr) { window.x = arr.join(''); return window.x; } join(arr); console.log(x);

Ответ 3



var arr = ["V", "l", "a", "d", "i", "m", "i", "r"]; var join = function (x) { return window.x = x.join(''); } join(arr); console.log(x); // <- ошибка

среда, 29 января 2020 г.

Объявление глобальной переменной внутри функции

#c #объявление #global_variables


Возможно ли объявить глобальную переменную в функции? Если да, то как?
    


Ответы

Ответ 1



Объявить глобальную переменную в функции, то есть переменную с внешним или внутренним связыванием, можно. А, вот, определить такую переменную нельзя, так как глобальная переменная - это переменная определенная вне функции. Например, #include int x; void f( int i ) { extern int x; x = i; } int main(void) { printf( "x = %d\n", x ); f( 10 ); printf( "x = %d\n", x ); return 0; } Вывод программы на консоль x = 0 x = 10 В этой программе в функции f объявляется глобальная переменная x extern int x;

Ответ 2



Объявить или определить? Возможно, я несколько путаюсь в терминологии, тогда пусть меня поправят, но если я правильно понимаю, то int x = 5; // Определение глобальной переменной int main(int argc, const char * argv[]) { extern int x; // Ее объявление, локальное для функции main() printf("%d\n",x); } Более того, они могут находиться в разных файлах.

Ответ 3



Нет, невозможно. Всё, что объявлено в функции, видно только в ней. Это основной принцип структурного программирования, называющийся «область видимости». Возможностью межпроцедурного доступа обладают только глобальные переменные. Крайне желательно использовать static-переменные, уровня .c-файла, но в крайнем случае допустимо использовать и действительно глобальные переменные, уровня всей программы. Разумеется, можно: Приписать к локальной переменной модификатор static, тогда она переживёт выход из функции в силу особого смысла этого ключевого слова при локальных переменных; Вернуть из функции указатель на эту переменную. Передать этот указатель внутрь другой функции, которая сохранит его внутри своей статической локальной переменной. И это будет работать, так как статические локальные переменные хранятся не на стеке. Однако лучше переместить эту переменную в структуру, как бы хранящую состояние между вызовами, и передавать эту структуру обеим функциям по указателю. Тогда: Первая функция будет записывать данные в экземпляр структуры (инициализировать её); Вторая функция будет просто читать и писать в эту структуру. Чтобы посторонние не могли вмешаться в массив, воспользуйтесь шаблоном проектирования «прозрачный указатель»: вынесите обе функции и определение структуры в отдельный .c-файл, а остальной программе предоставьте прототипы функций и краткого определения структуры, достаточного для объявления указателей на неё (typedef struct MyStruct;). Заметьте, в любом случае придётся что-то передавать в качестве параметра второй функции.

Ответ 4



Читаем АВТОРОВ языка: Объекты, объявляемые вне всех блоков на одном уровне с определениями функций, всегда статические, и они становятся глобальными для всей программы. "Язык программирования Си" - Брайан В. Керниган, Деннис М. Ритчи

пятница, 24 января 2020 г.

Использование одной переменной в нескольких функциях

#python #global_variables


Делаю калькулятор. Программа работала. Решил упростить и вынести счёт значения (eval)
в отдельную функцию. Появилась ошибка:


  UnboundLocalError: local variable 'result' referenced before assignment


Пример кода:

def calc():
    try:
        result = eval(calc_entry.get())
        calc_entry.delete(0, 1000)
    except:
        messagebox.showerror('Ошибка!', 'Проверьте введённые данные')

def act(key):
    if key == '=':
        calc()
        calc_entry.insert(END, str(result))

    


Ответы

Ответ 1



Я думаю, что надо в конец блока try в функции calc вернуть значение result путем инструкции: return result и изменить строку в act(): calc() на: result = calc()

воскресенье, 22 декабря 2019 г.

global в функции это нормально?

#php #global_variables


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

использовать класс внутри функции получилось только с помощью global
пример кода

blabla('SELECT ... ', $param1, $param2);
}


это нормально? или лучше использовать что-то другое для определения $db внутри функции?
    


Ответы

Ответ 1



Идеальным ответом является комментарий от Vladimir Gamalian: Для небольших скриптов вполне нормально, польза от отказа от global ощущается с увеличением сложности программной системы. От себя я бы определил так: Если, как в данном случае, код пишется процедурно, то ничего плохого в таком использовании global нет. Вообще, global ругают по двум причинам. Первая - это действительно страх и ужас, когда этот оператор используется не по назначению, для передачи локальных переменных в функцию, что катастрофически запутывает программу. Допустим, у нас есть функция function f1() { global $var $var++; } и где-то в коде программы встречается вот такой кусок: $var = 1; f1(); Что произошло с переменной $var, что делала функция f1() - из этого кода решительно не понятно. Такого кода надо избегать всегда. Вместо global в данном случае надо всегда писать так: function f1($var) { return $var++; } и использовать $var = 1; $var = f1($var); Вторая причина - это, условно говоря, невозможность подменить $db на лету. В более сложных программных системах иногда возникает необходимость подменять тот или иной сервис в зависимости от задачи. К примеру, вместо mysql использовать, скажем, MongoDB. Для одной и той же задачи, но в зависимости от контекста. И в этом случае global станет помехой, и нам нужно будет изобретать более сложные способы передачи сервисов в функцию. Но до тех пор пока наша программа достаточно простая, не использует ООП, и при этом мы используем этот оператор для действительно глобальных сервисов, использование global вполне оправдано.

пятница, 29 марта 2019 г.

Объявление глобальной переменной внутри функции

Возможно ли объявить глобальную переменную в функции? Если да, то как?


Ответ

Объявить глобальную переменную в функции, то есть переменную с внешним или внутренним связыванием, можно. А, вот, определить такую переменную нельзя, так как глобальная переменная - это переменная определенная вне функции.
Например,
#include
int x;
void f( int i ) { extern int x; x = i; }
int main(void) { printf( "x = %d
", x ); f( 10 ); printf( "x = %d
", x );
return 0; }
Вывод программы на консоль
x = 0 x = 10
В этой программе в функции f объявляется глобальная переменная x
extern int x;

среда, 13 февраля 2019 г.

global в функции это нормально?

есть класс, который осуществляет работу с БД есть функция, которая возвращает определенную строку, в т.ч. с помощью класса
использовать класс внутри функции получилось только с помощью global пример кода
$db = new TestClass();
function getContent($param1, $param2){ global $db; return $db->blabla('SELECT ... ', $param1, $param2); }
это нормально? или лучше использовать что-то другое для определения $db внутри функции?


Ответ

Идеальным ответом является комментарий от Vladimir Gamalian:
Для небольших скриптов вполне нормально, польза от отказа от global ощущается с увеличением сложности программной системы.
От себя я бы определил так:
Если, как в данном случае, код пишется процедурно, то ничего плохого в таком использовании global нет.
Вообще, global ругают по двум причинам. Первая - это действительно страх и ужас, когда этот оператор используется не по назначению, для передачи локальных переменных в функцию, что катастрофически запутывает программу. Допустим, у нас есть функция
function f1() { global $var $var++; }
и где-то в коде программы встречается вот такой кусок:
$var = 1; f1();
Что произошло с переменной $var, что делала функция f1() - из этого кода решительно не понятно. Такого кода надо избегать всегда. Вместо global в данном случае надо всегда писать так:
function f1($var) { return $var++; }
и использовать
$var = 1; $var = f1($var);
Вторая причина - это, условно говоря, невозможность подменить $db на лету. В более сложных программных системах иногда возникает необходимость подменять тот или иной сервис в зависимости от задачи. К примеру, вместо mysql использовать, скажем, MongoDB. Для одной и той же задачи, но в зависимости от контекста. И в этом случае global станет помехой, и нам нужно будет изобретать более сложные способы передачи сервисов в функцию.
Но до тех пор пока наша программа достаточно простая, не использует ООП, и при этом мы используем этот оператор для действительно глобальных сервисов, использование global вполне оправдано.