Erros, bugs, perguntas - página 453

 
Interesting:

Não crie objectos dinâmicos - não terá de usar agora e tudo o mais relacionado com estes objectos (mas então não poderá fazer muitas coisas).

Quer compreender não o significado de agora, mas o significado de trabalhar com objectos dinâmicos...

//////////////////////////////////////// SIGA O MEU TEXTO (NÃO CONSIGO SAIR DA CITAÇÃO) :) //////////////////////////////////////////////////////////////

nulo OnStart()
{
//---
primer obekt;
obekt.f1();
}
//+------------------------------------------------------------------+
manual de classe
{
público:
f1() nulo;

primer();
};

primer::primer()
{
Alerta("Penso que a inicialização aqui também é apenas no momento da criação");
};

cartilha::f1()
{
int l[];
ArrayResize(l,3);
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5);
l[3]=47;
l[4]=37;
Alerta(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]);
};

Este código não produz um erro e a matriz é dinâmica. Porque????

E se o quiser destruir:

{

obekt;
obekt.f1();


}

Parece que eles pegaram em C++ e estragaram o manuseamento de endereços e colocaram-no no MQL

 

220Volt:

MAIS ADIANTE ESTÁ O MEU TEXTO (NÃO POSSO DEIXAR DE CITAR) :)

Este código não dá um erro e a matriz é dinâmica. Porque????

1. porque deve ser executado com um erro?

a) O objecto é criado automaticamente (isto é causado pelo método de declaração de uma instância de objecto no OnStart) e é automaticamente apagado

primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
 primer *obekt2; //Указатель на динамический объект

void OnStart()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete(obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

Quanto aos objectos, as suas instâncias podem ser criadas de forma automática ou dinâmica. No primeiro caso, o construtor é normalmente executado durante a inicialização, no segundo caso é executado após a utilização de um novo operador.

b) Logicamente, também não deveria haver erros em f1() (embora eu pessoalmente o tivesse implementado de forma diferente).

Quanto às matrizes dinâmicas. Diferem das matrizes estáticas na medida em que tais matrizes não têm dimensionalidade conhecida, o que significa que antes de trabalhar com tal matriz, deve especificá-la usando o ArrayResize (deve especificar um novo tamanho na primeira dimensão da matriz). É importante notar que os elementos da matriz são numerados a partir de 0.

2. Se está interessado em trabalhar com objectos dinâmicos, estude cuidadosamente este exemplo - Tetris (embora eu ainda não consiga compreender o que faz no fórum antigo)...

 

Desculpem a intromissão, só quero mesmo chegar ao fundo da questão. Vou dizer-vos sobre o que estou errado.

Se olharmos para a notação C++ (temos uma classe de primário declarada)

primer *ukazatel=novo primer;

diz que o ukazatel contém o endereço em memória onde o nosso objecto, uma cópia da classe primer, é armazenado. Dos endereços MQL são removidos, e o ukazatel contém um descritor de objectos. O que é que ganhamos com isso? A única diferença que notei, se dentro do bloco declaramos através de um novo objecto e nos esquecemos de utilizar o apagar antes de terminar o bloco, então o objecto será apagado apenas quando o programa estiver terminado. E após a saída do bloco, a ligação com este objecto através da pega será perdida.

Tive a ideia de que se declarado através de novo, então a memória para o objecto é atribuída dinamicamente (ou seja, pode aumentar o seu tamanho), e se não houver novo, então o objecto só pode ter variáveis estáticas. Mas a minha suposição não foi confirmada (o guião, que publiquei anteriormente, o objecto é declarado não através de novo, mas trata de uma variável dinâmica).

E depois de todas estas paixões, estou numa situação não muito agradável, e não compreendo qual é a diferença com ou sem ele, e se o próprio compilador arranja alguma coisa lá, porque é que eu me deveria incomodar?

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

Até tentou fazer algo como o descrito na documentação (para descobrir algo sobre novidades) :

interruptor(5)

{

caso 5: m_shape=novo CTetrisShape1; // esta opção não funciona de todo (e isto é da documentação!!!!!!) só desta maneira

( m_shape=novo CTetrisShape1; )

}

e agora não podemos aceder ao objecto m_shape.___, será apresentado um erro

 

220Volt:

E agora encontro-me numa situação não muito boa depois de todas estas paixões, e não compreendo qual é a diferença entre ter ou não ter algo novo, e se o compilador arranja alguma coisa lá, porque é que eu me deveria incomodar de todo?

As instâncias de objectos são criadas dinamicamente usando o novo se operador (e é por isso que pedi para ver o exemplo do Tetris):

1. O número de casos de objectos não é conhecido antecipadamente (mas presume-se que haverá sempre mais do que um);

2. Se se quiser criar uma série de apontadores para objectos "heterogéneos", que têm o mesmo antepassado;

3. se for suposto que o objecto (ou antes um ponteiro para este objecto) será usado como parâmetro para um procedimento ou função (provavelmente deverá passá-lo para a biblioteca);

4. Se se pretende trabalhar com um objecto (leia-se: um ponteiro para este objecto) em diferentes partes do programa. Por exemplo, o mesmo objecto "ordem" pode estar em: um conjunto de ordens criadas pelo Consultor Especialista; um conjunto de ordens para um determinado símbolo; um conjunto de ordens que formaram uma determinada posição, e assim por diante.

5. Há muitas mais tarefas que se resolvem aplicando-lhes votos e indicações dinamicamente criadas.

 
220Volt:

Até tentou fazer algo como o descrito na documentação (para descobrir algo sobre novidades) :

........................

e agora não podemos aceder ao objecto m_shape.___, será atirado um erro

Na verdade, no exemplo do Tetris é implementado da seguinte forma (note que no seu caso falta o operador de pausa)

   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }

Não se esqueça de verificar se o ponteiro é NULL

 if(m_shape!=NULL)
 {
//С указателем можно работать
 }
 

Interessante obrigado pela sua ajuda
 

Desenvolvedores.

Na documentação, especificar "explicitamente" todas as coisas que ou não funcionam no testador, ou funcionam com certas características (para que não surjam questões desnecessárias).

Por exemplo, deve mencionar explicitamente as peculiaridades da hora local e hora GMT (igual à hora do servidor), bem como a natureza problemática do TimeGMTOffset para obter o resultado esperado.

 

Quem sabe - existe uma forma normal de traduzir um conjunto de caracteres Unicode para uma cadeia?

 
TheXpert:

Quem sabe - existe uma forma normal de traduzir um conjunto de caracteres Unicode para uma cadeia?

Parece-me que teria de traduzir cada elemento da matriz individualmente.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5