Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные, как в PHP 
V
    Опции темы
xvr
Дата 6.5.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Alek86 @ 6.5.2008,  11:58)
Цитата(mes @  6.5.2008,  11:46 Найти цитируемый пост)
Сам бы хотел понять что именно хотят получить этим 

думаю просто люди привыкли писать в интерпретируемом, где свободы намного больше
потому и удивляются, как в С++ "неудобно"

Была такая машина - 'Эльбрус 2', и был у нее язык програмирования 'Эль 76', весь насквозь динамический, при описании переменной указывался только ее размер, содержимое же переменной (целое, плавающее или указатель) определялось динамически на этапе выполнения (прямо boost::any). Казалось бы очень удобно, очень гибко и динамично, гип-гип ура! Увы, эта гибкость обернулось ОГРОМНЫМ недостатком - если компилятор C/C++ способен найти несоотвествие типов уже на этапе компиляции (причем все), то на Эльбрусе эти несоотвествия вываливались run-time (причем по мере хождения по этим граблям). И не было никакой гарантии, что не осталось каких нибудь несоотвествий типов (просто потому, что по этому месту не прошли). Явная динамика типов была нужна КРАЙНЕ редко. В следующей версии Эль 76 были добавлены статические описания типов.
PM MAIL   Вверх
mes
Дата 6.5.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
В пхп если програмить процедурно то имхо без глобальных переменных не обойтись. И в с++ я тоже хочю так сделать 

ну  если нужны глобальные переменные , в cpp ничего не мешает их использовать.. также как и процедурный стиль
Код

// в одном .cpp файле 
extern int glob_var1;
void funct1 ()
{
   glob_var1 +=10;
};

// в другом .cpp файле
int glob_var1;  
void funct1();

void funct ()
{
  glob_var1 = 5;
  func1 ();
 std::cout<<glob_var1;
};

В примере обшая переменная для двух функций храняшихся в разных файлах . Единственное отличие oт примера на php - декларация вне фунциии;
Вот и вопрос чем не устраивает такой подход и почему надо обязательно иметь возможность декларировать глобальные переменные в фунции ??

Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
потому что по другому не мыслю как делать. 

Тогда тебе придется рисовать круги от руки как карандашом, несмотря на то что ты держишь циркуль ))

Цитата(Alek86 @  6.5.2008,  11:58 Найти цитируемый пост)
думаю просто люди привыкли писать в интерпретируемом, где свободы намного больше
потому и удивляются, как в С++ "неудобно" 

тут дело не в свободе, а в способе мышления.. Тот кто не пользовался с трудом осознает всю силу строгой типизации ))

Добавлено через 6 минут и 55 секунд
Цитата(xvr @  6.5.2008,  12:11 Найти цитируемый пост)
 не было никакой гарантии, что не осталось каких нибудь несоотвествий типов (просто потому, что по этому месту не прошли

вот за это я не люблю отсутствие строгой типизации.. почему я должен следить за этим , когда эти соответствия может проверить какой нибудь простой автомат...


Это сообщение отредактировал(а) mes - 6.5.2008, 16:27


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 6.5.2008, 16:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(mes @  6.5.2008,  16:24 Найти цитируемый пост)
Вот и вопрос чем не устраивает такой подход и почему надо обязательно иметь возможность декларировать глобальные переменные в фунции ??

у меня когда-то были подобные потребности
возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других


--------------------
user posted image    user posted image
PM MAIL   Вверх
maxim1000
Дата 6.5.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Alek86 @  6.5.2008,  16:42 Найти цитируемый пост)
возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других 

хм... так а что мешает вызвать ту же переменную в третьей функции
ведь область видимости нигде не прописана...

Добавлено через 2 минуты и 14 секунд
хотя как раз эту задачу (ограничение области видимости до двух функций) можно решить с помощью friend:
создаём глобальный экземпляр класса, в котором в закрытой секции прописана эта переменная
и делаем две выбранных функции его друзьями
таким образом без изменения этого класса не получится доступиться к этой переменной откуда-то кроме этих двух функций

Добавлено через 3 минуты и 26 секунд
хотя это, конечно, для того случая, если есть причины не создавать класс, в котором будут эти функции (т.к. налицо нечто общее между ними)


--------------------
qqq
PM WWW   Вверх
opjox
Дата 6.5.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 1
Всего: 14



Цитата(Igor_K @  4.5.2008,  14:22 Найти цитируемый пост)
Мне нужно както объявить глобальные переменные для функций. На пхп я бы сделал так:
Код

function myfunct()
{
    $my_var = true;

    funct();
}

function funct()
{
    global $my_var;
    if ($my_var) echo 'Привет!';

}

в функции myfunct я создаю переменную $my_var. Потом вызываю функцию funct(). В функции funct() переменная $my_var обявлена как глобальная (global $my_var;) и к ней есть доступ.


На C/C++ это лучше сделать и вовсе без глобальных переменных:
Код

void funct(const bool & flag) // если нужна возможность влиять на внешний flag, то убираем const
{
  if(flag) std::cout << "Hello!";
}

void myfunct()
{
  bool flag = true;
  funct(flag);
}


Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
 И в с++ я тоже хочю так сделать, потомучто по другому не мыслю как делать

Цитата(Igor_K @  4.5.2008,  14:35 Найти цитируемый пост)
Такой подход я знаю. Но мне он не подходит.

Приведи конкретный пример.

Цитата(Alek86 @  6.5.2008,  16:42 Найти цитируемый пост)
возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других

namespace?
PM MAIL ICQ   Вверх
Любитель
Дата 7.5.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Что-т в последнее время много тем, по сути сводящиеся к вопросу: "почему С++ не позволяет делать то, что делается в скриптовых языках...".


--------------------
PM MAIL ICQ Skype   Вверх
Lazin
Дата 7.5.2008, 16:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Любитель @  7.5.2008,  16:24 Найти цитируемый пост)
Что-т в последнее время много тем, по сути сводящиеся к вопросу: "почему С++ не позволяет делать то, что делается в скриптовых языках...". 

 smile весна smile 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 7.5.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(opjox @  6.5.2008,  22:45 Найти цитируемый пост)
namespace?

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Igor_K
Дата 7.5.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Ага. тупая моя башка  smile  Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции. В пхп просто такого нету. Того и нужно прописывать их как глобальные.

Про ООП в С++ я ваще ничего не шарю, еще не дорос. Так что ничего написать не могу. smile

Добавлено через 4 минуты и 18 секунд
И еще мне не понравилось в С++ что функция не может массив возвращать :(

Это сообщение отредактировал(а) Igor_K - 7.5.2008, 22:49
PM MAIL   Вверх
bsa
Дата 7.5.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Igor_K @ 7.5.2008,  22:48)
Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции. В пхп просто такого нету. Того и нужно прописывать их как глобальные.

Ты не понял. На самом деле все зависит от способа передачи параметров. Можно передать так, что в вызывающей ничего не изменится (по значению), а можно и так, что изменится (по ссылке или по указателю):
Код
#include <iostream>

void func1(int n) //по значению
{
   std::cout << "n = " << n;
   ++n;
   std::cout << "\nn = " << n << std::endl;
}
void func2(int &n) //по ссылке
{
   std::cout << "n = " << n;
   ++n;
   std::cout << "\nn = " << n << std::endl;
}
void func3(int *n) //по указателю
{
   std::cout << "n = " << *n;
   ++*n;
   std::cout << "\nn = " << *n << std::endl;
}

int main()
{
   int n = 0;
   func1(n);
   //n == 0
   func2(n);
   //n == 1
   func3(&n);
   std::cout << "n = " << n << std::endl; //выведется n = 2
   return 0;
}

PM   Вверх
Rififi
Дата 7.5.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



И еще мне не понравилось в С++ что функция не может массив возвращать :(
в C++ это и не нужно.
PM MAIL   Вверх
opjox
Дата 7.5.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 1
Всего: 14



Цитата(Alek86 @  7.5.2008,  17:04 Найти цитируемый пост)
неймспейс хорошо, а класс - лучше

Так я про способ скрытия глобальных переменных, не переводя их в другую категорию.
А так, согласен, класс лучше, но все же не всегда – создавать экземпляр класса для вызова всего одной функции, для которой нужно укрыть переменные, на мой взгляд, не слишком хорошо. 

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

Цитата(Alek86 @  7.5.2008,  17:04 Найти цитируемый пост)
никакой using namespace ничего плохого не сделает

Неименованному пространству имен никакой using не сделаешь smile 

Цитата(Igor_K @  7.5.2008,  22:48 Найти цитируемый пост)
Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции.

Это смотря как передашь. 

Цитата(Igor_K @  7.5.2008,  22:48 Найти цитируемый пост)
И еще мне не понравилось в С++ что функция не может массив возвращать :(

Код

#include <vector>

char * v1()
{
  char * p = new char[20];
  // какие-то действия c p
  return p;
}

void v2(char *& p)
{
  p = new char[20];
  // какие-то действия c p 
}

void v3(char * p)
{
  // какие-то действия c p
}

void v4(std::vector<char> & v)
{
  // какие-то действия c v
}

/*
писать что-то типа
std::vector<char> v5()
{
  std::vector<char> v;
  // какие-то действия c v
  return v;
}
не стоит, т.к. при выходе будет происходить копирование (т.к. 
внутренний вектор v при выходе из области видимости должен быть уничтожен),
что может быть весьма затратно
*/

int main()
{
  char * p;
  
  p = v1();
  // какние-то действия с p
  delete [] p;

  v2(p);
  // какние-то действия с p
  delete [] p;

  p = new char[20];
  v3(p);
  // какние-то действия с p
  delete [] p;

  std::vector<char> v;
  v4(v);
  // какние-то действия с v
  // при выходе из области видимости v будет самостоятельно уничтожен

  return 0;
}

/*
варианты v1 и v2 не самые лучшие
куда лучше выделять и освобождать память в одной и тойже функции
*/


Это сообщение отредактировал(а) opjox - 9.5.2008, 00:34
PM MAIL ICQ   Вверх
Любитель
Дата 8.5.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
/*
писать что-то типа
std::vector<char> v5()
{
  std::vector<char> v;
  // какие-то действия c v
  return v;
}
не стоит, т.к. при выходе будет происходить копирование (т.к. 
внутренний вектор v при выходе из области видимости должен быть уничтожен),
что может быть весьма затратно
*/

Для QList (и прочие кутешные классы) вполне нормально возвращать коллекцию. Копируется только внутренний указатель (при изменении, если несколько физических объектов владеют этим указателем - делается копия коллекции).


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 8.5.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  8.5.2008,  12:28 Найти цитируемый пост)
QList (и прочие кутешные классы) 

Примечание: это относится  только к объектам реализованным в стиле COW (copy_on_write) 
 



Это сообщение отредактировал(а) mes - 8.5.2008, 20:57


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 8.5.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
создавать экземпляр класса для вызова всего одной функции

static
а вообще надо смотреть по ситуации


Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
Неименованному пространству имен никакой using не сделаешь 

ага
оно включено во всей cpp-шке и так - то есть ВСЕ функции могут попортить переменную


--------------------
user posted image    user posted image
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.