[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 1086

 
drknn:


那么这到底是什么?

bool Fun_New_Bar() // Fun_New_Bar detection fi
{ // ...新酒吧


static datetime New_Time=0; // 当前条形图的时间

这就是所谓的静态变量初始化。只有当这个变量被初始化时,才会被分配为零。
 
khorosh:
这被称为初始化一个静态变量。只有在该变量被初始化时才会被赋值为零。


哦,伙计!酷。一个子程序被调用,一个静态变量 被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?

你的子程序中的静态初始化将在NEW!!!! 的每个新刻度上发生。这适用于所有子程序的所有变量的初始化。你的静态变量的范围和寿命是什么,嗯?

 
drknn:

哦,伙计!酷。一个子程序被调用,一个静态变量被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?
要检查它是否正常工作很容易。为什么会有这种理论化的说法?实践是真理的标准。如果你突然发现你的知识有差距,你应该感到高兴。在这种情况下,我总是很高兴,并对启迪我的人说谢谢。
 
drknn:


哦,伙计!酷。一个子程序被调用,一个静态变量被初始化。子程序结束,将其变量留在RAM地址空间中。而最重要的是,没有把空间本身从忙碌中解放出来,对吗?

你的子程序中的静态初始化将在NEW!!!! 的每个新刻度上发生。这适用于所有子程序的所有变量的初始化。你的静态变量的范围和寿命是什么,嗯?


是的,检查一下你的M1图!毕竟,一切都在按部就班地进行,似乎是这样!而且它并不是每一次嘀嗒声都在 响,而是只有在形成新的嘀嗒声时 才会响。

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
khorosh:
要检查它是否有效很容易。为什么会有这些理论化的东西?实践是真理的标准。如果你发现了自己的知识差距,你应该感到高兴。在这种情况下,我总是很满意,并对启迪我的人说谢谢。


我同意。我有点激动。我很抱歉。检查静力学。写一个脚本。

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  int SchVizovov=0;
	for(int i=1;i<5;i++){
		SchVizovov=Proverka(i);
	}
  Alert("-------------------");
	return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
int Proverka(int Sch){
	
	static int My_value=0; //
	if(My_value==0){
		My_value=Sch;
		Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
		return(Sch);
	}
	else{
	 My_value=Sch;
	 Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
	}
	return(Sch);
}

编译它,然后把它扔到图表上。其结果是http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。

好吧。唉,我不得不承认,statik没有被重新初始化。然后代码就会工作。这不是好事。:( 语言帮助应该解释这种细微差别。帮助只告诉你,静态变量 在函数退出时不会丢失其值。但它并没有说这个变量在被重新初始化时不会重新初始化。天啊,我又碰到了元编辑器中的帮助不完整的事实。天啊,我以为我再也不会被抓了 :)))))))。

 
drknn:


我同意。我有点激动。我很抱歉。检查静力学。写一个脚本。

编译它,然后把它扔到图表上。其结果是http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。

好吧。唉,我不得不承认,statik没有被重新初始化。然后代码就会工作。这不是好事。:( 语言帮助应该解释这种细微差别。帮助只告诉你,静态变量在函数退出时不会丢失其值。但它并没有说这个变量在被重新初始化时不会重新初始化。哦,糟糕,我又被抓住了。天啊,我以为我再也不会被抓了 :)))))))。

不过不要生气,我们都在这里学习。碰巧的是,一些细微的差别没有引起你的注意,当你以为自己知道一切的时候,你却发现了它。

参考文献说,静态变量的初始化 是一次性的,这意味着没有重新初始化这种情况。

 
khorosh:
最主要的是不要生气,我们都在这里学习。碰巧的是,一些细微的差别没有引起你的注意,当你以为自己已经知道了一切的时候,你才发现了它。


我并不因为发现了自己知识上的漏洞而感到不安--当我发现自己代码中的错误时,当我花了一个多小时去发现它们时,当发现不是我的错,而是帮助系统或终端中的错误时,我就会感到不安。如果把我在过去6年的编程过程中为寻找与此类问题有关的错误所花费的时间加起来,我可以说我的生活中相当大的一块时间根本就被毁了。这就是令人沮丧的地方--生命的时间 被浪费在了废话上。它飞走了,再也不回来了。好吧,今天的情况并不令人不安--相反,它令人高兴--我不必花几个晚上去寻找一个错误--它很快就被发现了。

Nikolai,我再次向你道歉--6年来,我一直认为在函数中用一个值声明初始化的变量,在这个函数被再次调用时就会重新初始化。(我对终端的全局快捷方式的变量保持沉默--那是另一首歌)。事实证明,规则也有例外。今天我有一个简单的皇家课程!

 
khorosh:

帮助中说,静态变量的初始化是一次性的,这意味着不存在重新初始化。

引用帮助中的话。

静态变量在调用专门的init()函数之前被初始化一次。

而我们在哪里初始化了一个静态变量?在一个子程序中。我们打破了初始化规则--我们打破了它。

在调用init()函数之前,这个静态变量既没有被声明,也没有从子程序中调用。这就是造成混乱的原因。由于在init()块之前没有初始化静态变量,奇异性规则将是无效的,因为它被绑定在程序结构的一个特定片段上。这是帮助中对它的描述。但它并没有实现--尽管一次性规则是无效的,但重新初始化仍然没有发生!

问题是,一次性规则强加了一种僵化。这时,判断的主语和谓语之间的等价关系就发挥作用了。所以它是等价的--一个没有另一个就不存在。

但话说回来,这种语言也允许另一种违反奇异性规则的行为。如果我们按规定声明这个变量,并且如果它只能在初始化块之前被初始化一个值,我们就不能在代码的其他地方初始化这个变量,因为这将违反奇异性规则。但我做的脚本显示并非如此--变量可以用另一个值即时初始化。

我从来没有在我的代码中使用过这些变量,也不会这么做,因为这里违反了这样的规则。我不知道他们还有什么隐患。

 

我有一个问题 ....

当我在终端设置 中设置邮件时,在SMTP中 - 我使用smtp.gmail.com:25

我得到的错误是 - 邮件:530 5.7.0 必须先发出STARTTLS命令。l3sm2329679fan.0
 
drknn:

引用帮助中的话。

我们在哪里初始化了这个静态变量?在一个子程序中。你破坏了初始化规则--你破坏了它。

在调用init()函数之前,这个静态变量既没有被声明,也没有从子程序中调用。这就是造成混乱的原因。由于静态变量在初始化块之前没有被初始化,奇异性规则是无效的,因为它被绑定在程序结构的一个特定片段上。这正是帮助中所说的情况。但魔鬼并没有满足它--尽管奇点规则无效,但重新初始化仍然没有发生!

另外,在教程中有一个使用静态变量 的例子,从中可以看出,它只被初始化一次,否则tick计数器将无法工作。

//--------------------------------------------------------------------
// staticvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                            // Специальная функция start()
  {
   static int Tick;                    // Статическая локальная перем
   Tick++;                             // Счётчик тиков
   Comment("Поступил тик № ",Tick);    // Сообщение, содержащее номер
   return;                             // Оператор выхода из start()
  }
//--------------------------------------------------------------------