오류, 버그, 질문 - 페이지 2521

 

fxsaber :
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

첫 번째 할당은 MQL에서만 작동합니다. 그리고 그것이 작동하는 것은 너무 나쁩니다. 마지막으로 이 오해를 풀고 싶습니다. 두 번째로 - 문제 없습니다.

 
Alexey Navoykov :

첫 번째 할당은 MQL에서만 작동합니다. 그리고 그것이 작동하는 것은 너무 나쁩니다. 마지막으로 이 오해를 풀고 싶습니다. 두 번째로 - 문제 없습니다.

기이한. 첫 번째는 작동해야 하고 두 번째는 작동하지 않아야 한다고 생각했습니다.

 
fxsaber :

기이한. 나는 첫 번째는 효과가 있고 두 번째는 작동해야한다고 생각했습니다.

글쎄요, 분명히 MQL 개발자들은 할당의 본질을 잘 이해하지 못합니다. 나는 그들에게 이 문제에 대해 오랫동안 이야기해 왔지만 마치 벽에 붙은 완두콩처럼 말입니다.

할당의 본질은 동등한 개체가 개체에 할당된다는 것입니다. 저것들. 같은 유형. 이것은 오른쪽 개체가 먼저 암시적으로 왼쪽 개체의 형식으로 캐스팅된 다음 할당(복사)이 발생함을 의미합니다. 그리고 첫 번째 경우 그러한 캐스팅(A->B)은 당연히 불가능합니다. C++에서는 오류가 발생합니다. 그러나 MQL에서는 대신 왼쪽 개체가 오른쪽 개체로 캐스트되고 A::operator=(A&)가 실행되어 b 개체의 일부만 대체합니다. 이게 과제야?

long에 int를 할당했지만 처음 4바이트만 교체되고 나머지는 그대로 유지된다고 상상해 보세요. 여기에 같은 것이 있습니다.

 
Alexey Navoykov :

long에 int를 할당했지만 처음 4바이트만 교체되고 나머지는 그대로 유지된다고 상상해 보세요. 여기에 같은 것이 있습니다.

그래서 편리합니다. 물론 구조의 맥락에서.

 
fxsaber :

그래서 편리합니다. 물론 구조의 맥락에서.

예, 의심스러운 편의성. 한 줄에 문자를 저장할 수도 있지만 무작위 오류의 원인이 되며 코드의 이해를 어렵게 하거나 왜곡합니다. 위에서 언급했듯이 등호는 객체가 완전히 변경된다는 명확하고 모호하지 않은 의미를 갖습니다. 따라서 이 경우 연산자는 의도한 용도로 사용되지 않습니다. 이러한 비표준 동작을 원하는 경우 이러한 목적을 위해 연산자를 오버로드해야 합니다.

ps 클래스 B에 자체 필드가 없는 경우에만 예외를 허용합니다. 클래스 A와 정확히 동일(완전히 동등)한 경우 이러한 할당을 방지할 이유가 없습니다. C++에서는 여전히 작동하지 않지만 MQL에서는 허용될 수 있습니다.

 
Slava :

opt-file에서 모든 입력 매개변수가 기록된 부분에서 최적화된 매개변수의 값(크기 및 오프셋 필드를 통해 결정됨)에는 Value(최적화 없는 경우와 같이)가 포함되지 않고 Start가 포함됩니다.

Value가 있으면 논리적입니다.

 
Alexey Navoykov :

글쎄요, 분명히 MQL 개발자들은 할당의 본질을 잘 이해하지 못합니다. 나는 그들에게 이 문제에 대해 오랫동안 이야기해 왔지만 마치 벽에 붙은 완두콩처럼 말입니다.

할당의 본질은 동등한 개체가 개체에 할당된다는 것입니다. 저것들. 같은 유형.

사용자 정의 유형에 대한 작업의 본질은 미리 결정되지 않습니다. 그리고 이 경우 적절한 연산자를 호출하는 것으로 구성된 순서만 정의됩니다.

MQL에서는 C++와 달리 operator=가 상속되므로 b = a; A::operator=(const A&)를 호출하는 것과 같습니다.

일반적으로 여기에는 모순이 없습니다. 등가 개체를 할당하는 특정 경우 개체 간에 특정 불일치가 있지만 그 이상은 아닙니다.

 
A100 :

MQL에서는 C++와 달리 operator=가 상속되므로 b = a; b.operator=(const A&)를 호출하는 것과 같습니다.

네, 그게 문제입니다. 그러나 글쓰기의 차이는 여기서 중요한 역할을 하지 않습니다. C++에서는 두 경우 모두 컴파일되지 않습니다.

일반적으로 여기에는 모순이 없습니다. 등가 객체를 할당하는 특별한 경우 엔티티의 특정 불일치가 있습니다.

모순은 적어도 With ++에서는 있을 것입니다. 이것이 컴파일되면 오른쪽 피연산자가 암시적으로 왼쪽으로 캐스팅된 다음 개체가 완전히 교체됩니다. 논리적으로 작동하는 방법. 나는 int-> long으로 예를 들었다. 그리고 객체 내부의 일부를 대체하는 것은 할당이 아닙니다. 따라서 모든 것이 하나입니다. 모순과 불일치.

ps 비록 operator B::operator=(A&) 가 여전히 오버로드될 수 있지만, 제 생각에 제정신인 프로그래머는 B 객체를 부분적으로가 아니라 완전히 교체할 것이라고 믿습니다. 이것이 할당의 본질이기 때문입니다.

간결한 쓰기를 원하는 사람이 있으면 이를 위해 다른 연산자를 만들 수 있습니다(예: &= 또는 |=). 적어도 일반적으로 사용되지 않으므로 혼동하지 마십시오.

 
Alexey Navoykov :

...........

모순은 적어도 With ++에서 있을 것입니다. ......

...........

MQL이 C++를 완전히 준수해야 한다는 아이디어는 어디서 얻었습니까 ???

C 유사는 전혀 동등하다는 것을 의미하지 않습니다!

MQL은 매우 특정한 작업을 위해 설계되었으며 작성된 언어를 완전히 복사할 의무가 전혀 없습니다.

화를 그만둬도 될까요?

그러나 파스칼에서는 할 수 있습니다 .......

그리고 어셈블러에서...

그리고 자바에서 ....

그리고 기본에....

여기에서 언어 비교를 연습하고 있습니까?

=======

추신 나는 당신만을위한 것이 아닙니다 ...

 
Сергей Таболин :

MQL이 C++를 완전히 준수해야 한다는 아이디어는 어디서 얻었습니까 ???

...

여기에서 언어 비교를 연습하고 있습니까?

나는 특정 문구에 응답하고 있었다. 진정해. 발레리안을 마시고 잠자리에 드십시오. 걱정하는 것은 나쁩니다. ...하지만 어떤 사람들에게는 "C ++"라는 단어에 화상을 입습니다.)

사유: