Comportamento de Strange Strange
Results 1 to 8 of 8

Thread: Comportamento de Strange Strange

  1. #1
    Alguém já se deparou com o próximo

    Eu tenho um script com as seguintes declarações

    símbolo de cadeia = XXXXXX;
    string open = Iniciar; Parada de string = stop; string takeP = take;
    valores duplos [3];
    Dados int [1];

    Eu então chamo uma DLL anunciada da seguinte forma

    Vazio Get Param Query (símbolo de string, string aberto, string stop, string takeP,
    valores duplos [], int Data []);

    Os valores retornados na DLL são antecipados, ou seja, os valores padrão para símbolo, abrir, parar e takeP são alterados, mas se eu fizer a próxima avaliação

    if (aberto! = iniciar)
    Impressão (NE);
    outro
    Impressão (EQ);

    o teste falha e eu recebo EQ impresso

    Alguma idéia do que está acontecendo e pode ser corrigido sem um trabalho confuso

    Obrigado

  2. #2

    if (aberto!) = iniciar) Imprimir (NE); mais Imprimir (EQ); o teste falha e eu recebo EQ publicado
    Por que você não nos diz o que está incluído no fator aberto após a chamada? Tem certeza de que você poderia passar strings como ponteiros (como você claramente agir), tê-los alterados em sua DLL e ainda trabalhando em MT4 sem produzir uma violação de acesso? Você pode alocar nova memória para a nova série na sua DLL? Por que você não usa uma string para poder retornar o novo ponteiro? Quem é responsável por liberar essa memória recém alocada? E a pergunta: Por que diabos você está fazendo isso com cordas?

  3. #3

    Por que você não nos diz o que é encontrado na variável aberta após a chamada?
    Basicamente pode ser qualquer coisa, por exemplo, uma série de 4 caracteres abcd
    Tem certeza de que você pode passar seqüências de caracteres como ponteiros (porque você obviamente agir), alterá-los na sua DLL e, em seguida, ainda trabalhando no MT4 sem criar uma violação de acesso?
    Bem, eu não tenho nenhum AV. E tudo funciona bem, pois deixei memória suficiente para os fatores no meu script (ou seja, essa é a razão pela qual eu configuro os valores padrão), pelo menos, tanto quanto os valores retornados estão preocupados É a função de comparação que está falhando nas minhas suposições e gostaria de saber se posso passar strings dessa maneira como faço com doubles e integers (como arrays no entanto)
    Você aloca nova memória para a nova série na sua DLL?
    Se bem entendi estou copiando as informações para a memória alocada pelo script
    Por que você não usa uma string para poder retornar o novo ponteiro? Quem é responsável por liberar essa memória recém alocada?
    Utilizando série dá um AV e como eu entendo toda a memória é gerenciada pelo script
    E a questão principal: Por que você está fazendo isso com cordas?
    Um pouco confuso eu concordo, mas eu estou usando a matriz de níveis para passar o valor real As seqüências de caracteres são para o seguinte propósito completamente

  4. #4

    Se bem entendi estou copiando as informações para a memória alocada com o script
    Você não pode ter certeza de como o metatrader lida com strings internamente. Talvez sua DLL obtenha apenas um ponteiro para alguma cópia da cadeia que seja compatível com C (terminada) que será descartada após a chamada e que armazene as cadeias de maneira totalmente diferente. Seu gerenciador de heap faz clones para operações e gerencia referências, talvez sejam strings Pascal e não strings C, ou usaram uma biblioteca de strings que opera inteiramente com unicode ou algo assim. Quem sabe? Não está documentado em nenhum lugar! Você está tentando manipular as estruturas de dados do metatradador através de uma interface não documentada! O que você está realmente procurando fazer isso não pode ser feito da maneira tradicional?
    um pouco confuso eu concordo, mas eu estou usando a matriz graus para passar o valor real As cordas são para outra finalidade inteiramente
    Não pode ser codificado em valor inteiro? Se essas cadeias de caracteres representarem um número limitado de comandos ou estados, codifique-as. Estabeleça uma constante para todo e qualquer controle ou modo ou estado possível ou o que for para melhor legibilidade, assim como é feito no metatrader também: (OP_BUY, OP_SELL, MODE_FOO, MODE_BAR, etc.). Utilizando cordas para coisas assim parece estranho. Há uma razão pela qual isso não é feito dessa maneira. (exceto PHP talvez, porque as crianças PHP não sabem o que é uma constante)

  5. #5

    O que você está procurando fazer isso não pode ser feito da maneira convencional?
    Então, qual é a maneira convencional de passar vários valores de série de volta de uma DLL (eu uso o Delphi7 do caminho) Eu poderia fazer um trabalho como você explica usando números inteiros, mas eu tinha entendido que seqüências poderiam ser passadas como ponteiros na memória bloquear ver
    http://docs.mql4.com/basis/variables/extfunctionsobrigado

  6. #6

    Então, qual é a maneira tradicional de passar vários valores de série de volta de uma DLL (eu uso o Delphi7 do caminho) Eu posso fazer um trabalho como você descreve usando inteiros, mas eu sabia que as seqüências de caracteres podem ser passadas como ponteiros em o relógio de bloco de memória
    http://docs.mql4.com/basis/variables/extfunctionsVencimento
    há algo escrito sobre ponteiros para blocos de memória e algo que soa como cordas Pascal, não faz sentido (talvez faça mais sentido do original russo) e eles não discutem a alteração da série para uso posterior pelo script mql4. O que eu posso dizer da minha própria experiência é que as strings passadas para a DLL serão simplesmente ponteiros para strings terminadas. Para isso, você usaria um formulário PChar em Pascal. Eu tive um caso em que senti a necessidade de retornar uma série da dll para o script e foi quando eu escrevi minha própria ligação de python. A função que retorna o valor de um objeto string python para o script mql4 chamador é assim: Função Código Inserido PyGetString (item: PPyObject): # 91; color = Vermelho # 93; PChar # 91;color # 93 ;; stdcall; var gs: TGILState; begin gs: = PyGILState_Ensure (); PyGetString: = PyString_AsString (item); PyGILState_Release (gs); fim; (Você pode encontrar o código-fonte completo (LazarusFPC) anexado como um arquivo .rar no final do site:
    http://sites.google.com/site/prof/me...on-integration) O acima irá retornar um ponteiro para a série (feita a partir da DLL python), apenas usando o valor de retorno fuction. O MT4 copia a string para a própria memória do ponteiro. Uma vez eu recomendei a maneira tradicional como eu estava falando com a maneira tradicional de resolver o problema, e não a maneira tradicional de retornar strings. A maneira tradicional de resolver o problema (seja ele qual for) provavelmente não incluiria qualquer uso de strings retornadas no script. Portanto, aqui a questão novamente?

  7. #7
    Como 7Bit afirma que você está manipulando a memória que você (DLL) não alocou e você também não sabe como a MQL lida com a alocação de memória na string ou com a maneira como ela armazena seu tamanho animado (span) MQL String tstr; tstr = DLLreturnNullString (); Isso funciona porque o MQL recebeu um ponteiro para uma cadeia Term (que a sua memória alocada pela DLL deve obter). A MQL lida com a alocação de sua própria memória e lista de alocação internalista de tamanhos de string e copia os dados para a nova memória MQL. Tudo é bom, já que você permite que o MQL crie sua própria cópia da string. MQL String tstr; DLLchangethisString (tstr); Isso é perigoso por vários motivos: A) você não sabe quanta memória (se houver) a MQL alocou para o ponteiro que sua DLL recebe. B) Se você alterar a string, então o MQL não saberá sobre ela e se você alterar a distância, o MQL não atualizará seu próprio 'knowlegde' do comprimento da string C) caso você tente alterar ou ler a string e acima meça a memória que o MQL alocou para ele, então você tem uma falha de proteção. D) Na minha experiência, enquanto o MQL permite que strings tenham até 64KB de tamanho, tenho certeza que a memória nem sempre é alocada como um bloco contíguo de memória. Se você persistir nesse caminho (e o id não informar), o melhor caminho será o MQL int len; String tstr =;/preenche até 255 caracteres no tempo de definição para que a memória tenha sido alocada DLLchangethisString (len, tstr); Imprimir (StringSubstr (tstr, 0, len)); Dessa forma, sua DLL retorna o novo tamanho dessa string para que você tenha algum conhecimento sobre seu novo intervalo. Eu observei um cabeçalho C que detalha a estrutura da cadeia MQL (mas nunca a usou), que alude a como o comprimento da string é armazenado em um INT (4 Bytes) antes do início da string. Então, em sua DLL, você pode tentar decrementar o ponteiro String fornecido pelo MQL (por 4 bytes) e também escrever um inteiro para o local da memória para especificar o novo tamanho, como nunca tenteinão sei quando estou certo com isso e que eu não Aconselho fazê-lo porque você está mexendo com o conhecimento da MQL de exatamente o que é feito com esta String, caso altere seu intervalo de 255 para 10, então o MQL pode vazar a memória da qual sua DLL a ignorou.

  8. #8
    OK Pessoal, obrigado pela ajuda, parece que os documentos da MQL não estão claros. Eu vou agora concentrar em retornar novas strings na DLL (como uma chamada de função no Delphi) ao invés de alterar as existentes e vou procurar restringir o uso de strings contanto que o 7Bit sugira

Permissões de Publicação

  • Não pode publicar novos tópicos
  • Não pode publicar respostas
  • Não pode publicar anexos
  • Não pode editar as suas publicações
  •  
  • Código BB está Ativo
  • Smilies estão Ativos
  • Código [IMG] está Ativo
  • Código [VIDEO] está Ativo
  • Código HTML está Desligado
O site da tradingintuitivo utiliza cookies
O site da tradingintuitivo utiliza cookies, alguns já foram definidos. Pode ler sobre a nossa utilização de cookies aqui. Por favor, clique no botão à direita para aceitar os nossos cookies. Se continuar a usar o site da tradingintuitivo, vamos supor que aceita os nossos cookies.