Jump to content
Manoel010953

Tipos de Variáveis em Dll criada no Delphi

Recommended Posts

Bom Dia pessoal, tudo bom? Sou novo em programação e estou tentando criar uma dll no delphi. 

Essa dll vai ser usada em uma aplicação do delphi também.

Queria saber se é possível utilizar vetores e matrizes e como fazer isso pois eu tentei declarar como um array of array of (um tipo), mas dá erro (essas matrizes seriam parâmetros da função). Colocando só como array of (um tipo) funciona, mas ao tentar acessar a função na dll dá um access violation. Eu já havia criado essa função dentro da minha aplicação e estava funcionando, mas na dll da esse erro. Eu tentei usar um ponteiro também, mas continua dando o erro. Por favor me ajudem.

Segue o código:

 

library NDC_Generator;

uses
  SysUtils,
  Dialogs,
  Classes;

  Type
  Matriz = Array of array of string;
  P1 = ^Matriz;

{$R *.res}

procedure MensagemConfirmacao(AMensagem: WideString); stdcall;
begin
  MessageDlg(AMensagem, mtInformation, [mbOk], 0);
end;

function gerarcombinacoes(Mat: P1; Xb, Total, np,
  NumCri: integer; mp, bud: Double; Pointer: P1): string; stdcall;
var
  i, j, k, T, a, p: integer;
  aux1: string;
  R0: Double;
  vetop, vmax: array of integer;
  matrizaj: array of array of integer;
  vetmax, vetmin: array of Double;
  vet_aux, Vetname: array of string;
  matrizaux1 : array of array of Double;
  matriz_result: array of array of String;

begin
  setlength(vetop, np);
  setlength(vmax, np);
  setlength(matrizaj, T, np);
  setlength(vetmax, NumCri);
  setlength(vetmin, NumCri);
  setlength(vet_aux, T);

  p := 0;

  for i := 0 to np - 1 do
  begin
    vmax[np - i - 1] := Xb - i;
  end;

  for i := 0 to np - 1 do
    vetop := i + 1;
  vetop[np - 1] := np - 1;

  for i := 0 to NumCri - 1 do
  begin
    vetmin := 100000;
    vetmax := -1;
  end;
  i := 0;
  T := 0;

  while (T < Total) do // Gerar as combinações com np elementos
  begin
    if T <> 1 then
      i := np;

    while (i > 0) do // Verifica se alguma das posições já atingiu seu máximo
    begin
      if (i - 1) <> 0 then // Verifica se não se trata da primeira posição que atingiu seu máximo
      begin
        if (vetop[i - 1] = vmax[i - 1]) and (vetop[i - 2] < vmax[i - 2]) then
        begin
          vetop[i - 2] := vetop[i - 2] + 1;
          vetop[i - 1] := vetop[i - 2]; ;
          if (i < np) then
            for j := i to np - 1 do
              vetop[j - 1] := vetop[j - 2] + 1;
          vetop[np - 1] := vetop[np - 2];
          break;
        end; // vetop
      end; // 0
      i := i - 1;
    end; // while i>0
    vetop[np - 1] := vetop[np - 1] + 1;

    R0 := 0;
    for k := 0 to np - 1 do
      R0 := R0 + StrToFloat(
        Mat^[vetop[k] - 1, NumCri + 1]);

    if R0 <= bud then 
    begin
      p := p + 1;
      setlength(matrizaux1, p, NumCri + 1);
      setlength(Vetname, p);
      for a := 0 to NumCri - 1 do
      begin
        for k := 0 to np - 1 do
          matrizaux1[p - 1, a] := matrizaux1[p - 1, a] + StrToFloat(
             Mat^[vetop[k] - 1, a + 1] );


        if (matrizaux1[p - 1, a] > vetmax[a]) then
          vetmax[a] := matrizaux1[p - 1, a];
        if (matrizaux1[p - 1, a] < vetmin[a]) then
          vetmin[a] := matrizaux1[p - 1, a];
      end;
      matrizaux1[p - 1, NumCri] := R0;

     a:= 0;

      for k := 0 to np - 1 do
        Vetname[p - 1] := Vetname[p - 1] +
        Mat^[ vetop[k] - 1,a]  + ' ';
    end; // R0 <= Bud

    T := T + 1;
  end; // While


  a := 0;
  k := 0;
  for i := 0 to p - 1 do
  begin
    if mp <> 0 then
      for j := 0 to NumCri - 1 do
      begin
        if vetmax[j] <> vetmin[j] then
        begin
          R0 := (matrizaux1[i, j] - vetmin[j]) / (vetmax[j] - vetmin[j]);
        end
        else
          R0 := 1;
        if R0 >= mp then
        begin
          a := a + 1;
        end
        else
          break;
      end
      else
        a := NumCri;
    if a = NumCri then
    begin
      k := k + 1;
      for j := 0 to NumCri do
      begin
        setlength(matriz_result, k, NumCri + 2);
        matriz_result[k - 1, j+1] := floattostr( matrizaux1[i, j]);
      end;
      matriz_result[k - 1, 0]:= Vetname;
    end;
    a := 0;
  end;
  for I := 0 to k - 1 do
    for j := 0 to numcri + 1 do
      Pointer^[i,j]:= matriz_result[i,j];

  MensagemConfirmacao('Foram geradas' + inttostr(k) + 'combinações!');
  Result := '0';
end;

exports
gerarcombinacoes;

end. 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By gabrielmdn
      Boa noite meus amigos.
       
      Estou com um problema enorme aqui. Precisei formatar o PC, e entao fiz um backup de tudo que tenho..normal 
      Quando abri o meu projeto no delphi e pedi para compilar ele parou na linha 114 e começou a aumentar os erros. Deixei por duas horas para ver até onde ia...e continuou
      Não tenho ideia do que esta acontecendo. Se não tivesse forçado a parada forçada nao teria parado até agora. 
       
      Alguem ja passou por isso? Estou bem preocupado, pois isso nunca me aconteceu.

    • By eiwes
      Fiz uma iteração foreach para gerar categorias e subcategorias, pois não queria fazer DOIS SELECTS, ficando assim:
       
      //----> Foreach para gerar a categoria, pois são vários items com as mesmas chaves, portanto agrupo foreach($exibeLista as $row){ $dlD[$row["nameD"]][] = [ "nameD"=>$row["nameD"], "idD"=>$row["idD"], "qtdR"=>$row["qtdR"], "qtdF"=>$row["qtdF"] ]; } //----> Foreach para gerar subcategorias foreach($exibeLista as $row){ $dLA[$row["nameP"]][] = [ "nameD"=>$row["nameD"], "idD"=>$row["idD"], "idAss"=>$row["idAss"], "idT"=>$row["idT"], "nameP"=>$row["nameP"], "qtdR"=>$row["qtdR"], "qtdF"=>$row["qtdF"] ]; } $fsHTML = []; $rateD = 0; $qtdAss = 0; if(is_array($dlD) || is_object($dlD)){ foreach ($dlD as $key => $ds) { if ($key <> '' && $key <> NULL) { $rateD += (($ds[0]["qtdR"]*100)/$ds[0]["qtdF"]); $qtdAss += count($dlD[$key]); //----> Array para inserir HTML da Categoria criada e criar accordion $fsHTML[] = ' <div class="col-md-12 col-sm-12 col-xs-12"> <div class="x_panel overflow_hidden padding-into-row-qsts bg-white-row filtro-on"> <span class="rateD">'.ceil($rateD/$qtdAss).'%</span> <span class="opcao-into-top">'.$ds[0]["idD"].' - '.$ds[0]["nameD"].' <a class="collapse-link open-filter-qsts border-radius8"><i class="fa fa-chevron-up"></i></a></span> <div class="x_content" style="display:none;padding-top:10px"> <div class="accordion" id="accordion" role="tablist" aria-multiselectable="true"> '; //----> Verificar se a subcategoria contém a categoria, se contém é incluída na array foreach ($dLA as $keys => $ass) { if($ass[0]["idD"] == $ds[0]["idD"] ){ if($ass[0]['idT'] <> 0){ $link = 't='.$ass[0]['idT']; }else{ $link = 'a='.$ass[0]['idAss'];} $fsHTML[] = ' <div class="panel"> <a class="panel-heading collapsed" href="/v/fs/st?mz=y&type=c&'.$link.'"> <span class="eficiencia-accordion">'.ceil(($ass[0]['qtdR']*100)/$ass[0]['qtdF']).'%</span> <h4 class="panel-title">'.$ass[0]['nameP'].'</h4> <span class="unicamente">'.$ass[0]['qtdR'].' respondido de '.$ass[0]['qtdF'].'</span> </a> </div> '; }//if ass }//foreach ass }//if ds //----> Aqui é aonde ocorre o ERRO! Era pra fazer o fechamento do Accordion e gerar uma nova DIV. //No índice [0] isso ocorre normalmente, porém no [1] ela agrupa todos os accordions. (abaixo farei a amostra) $fsHTML[] = '</div></div></div></div>'; }//foreach ds }//if verifica se é array e se é objeto return implode('', array_unique($fsHTML)); O correto seria assim:
       
      - Categoria
        - Subcategoria
        - Subcategoria
       
      - Categoria
       - Subcategoria
       - Subcategoria
       
       
      Como está acontecendo:
       
      - Categoria
        - Subcategoria
        - Subcategoria
       
      - Categoria
        - Subcategoria
        - Subcategoria
          - Categoria
            - Subcategoria
            - Subcategoria
              - Categoria
                - Subcategoria
                - Subcategoria
                  - Categoria
                    - Subcategoria
                    - Subcategoria
       
       
      Não consigo entender de jeito nenhum pq o primeiro fecha corretamente e a partir do segundo não.
      Alguém me ajuda?
       
       
    • By Karlo Uchoa
      Boa tarde meus amigos,  Estou implementando uma integração entre um banco de dados local e outro na nuvem da Amazon. Estou com um problema sério aqui: ao fazer o Putclientes, por exemplo, ou seja, ao enviar ao servidor as alterações e inserções do Banco local, se, após um insert em lote na tabela da nuvem, o Result da função Put não conseguir retornar ao cliente rest que o chamou, por uma queda do link de internet, por exemplo, esses inserts já foram commitados na nuvem, mas os relacionamentos entre o código externo gerado e o código interno enviado, não pode ser concebida. Sendo assim, no próximo Put, os clientes sem a relação entre os códigos, serão inseridas novamente, gerando duplicidade de cadastros na nuvem. Meu problema é saber como commitar a transação na nuvem somente após o Result chegar ao cliente rest que fez a chamada. Alguém pode me ajudar com isso?
    • By jganjos
      Boa tarde senhores.
      Estou gerando esta array com o PHP
       
      Array ( [header] => Array ( [ico] => fas fa-building [tit] => Empresa [lab] => Cadastro da Empresa ) [forms] => Array ( [RAZAO] => Array ( [tit] => Razão Social ) [NFANTASIA] => Array ( [tit] => Nome Fantasia [lin] => 1 [col] => 10 ) [STATUS] => Array ( [tit] => Status [typ] => switch [val] => 1,0 [lin] => 1 [col] => 2 ) [INSCRICAO] => Array ( [tit] => Inscrição [lin] => 2 [col] => 4 ) [IE] => Array ( [tit] => Insc. Estadual [lin] => 2 [col] => 4 ) [IM] => Array ( [tit] => Insc. Municipal [lin] => 2 [col] => 4 ) [CEP] => Array ( [tit] => CEP [lin] => 3 [col] => 4 [btn] => search ) [TIPO_END] => Array ( [typ] => hidden ) [ENDERECO] => Array ( [tit] => Endereço [lin] => 4 [col] => 9 ) [NUM_END] => Array ( [tit] => Número [lin] => 4 [col] => 3 ) [BAIRRO] => Array ( [tit] => Bairro [lin] => 5 [col] => 6 ) [COMPL] => Array ( [tit] => Complemento [lin] => 5 [col] => 6 ) [MUNICIPIO] => Array ( [tit] => Município [lin] => 6 [col] => 9 ) [UF] => Array ( [tit] => Estado [typ] => list [tab] => estados [lin] => 6 [col] => 3 ) [TEL1] => Array ( [tit] => Telefone [msk] => phone [lin] => 7 [col] => 6 ) [TEL2] => Array ( [tit] => Telefone [msk] => phone [lin] => 7 [col] => 6 ) [EMAIL] => Array ( [tit] => e-mail [typ] => email [lin] => 8 [col] => 6 ) [SITE] => Array ( [tit] => Site da empresa [typ] => website [lin] => 8 [col] => 6 ) ) ) Preciso listar os valores da Array *FORMS* e seus respectivos filhos mas não estou conseguindo utilizando o foreach.
      Alguém teria uma dica?
    • By helkton
      galera preciso criar um array que pegue os itens adicionais de cada ITEM  escolhido...
      vou tentar explicar...
      tenho uma pagina com as categorias do CARDÁPIO
      LANCHES - AÇAI - SALGADOS - PIZZAS
      CADA categoria contem seus devidos itens tipo...
      LANCHES 1-xFrango 2-xSalada 3-xBacon AÇAI 1-Copo 300ml 2-Copo 500ml 3-Copo 700ml até esta funcionando, cada item que o usuário escolher, salvo em uma S_SESSION['itens'] 
      agora vamos supor que, esses itens tenham adicionais, já criei um <?php if(){}?> e ele já faz essa verificação, então se o item LANCHES 1=XFRANGO NÃO conter adicional para ser escolhido ele simplesmente irá ser adicionado no carrinho, AGORA se o item tiver adicional para ser escolhido, irá abrir um MODAL com os adicionais disponíveis para o ITEM
      Agora digamos que o AÇAÍ) 1-COPO 300ML tenha adicional eu abro o meu modal com os seguintes adicionais:
      FRUTAS 1-Morango 1,00 2-Banana 1,00 3-Uva 1,00 COMPLEMENTOS 1-Ninho 1,00 2-Coco Ralado 1,00 3-Castanha 1,00 COBERTURA 1-Chocolate 1,00 2-Leite condensado 1,00 3-Morango 1,00 ADICIONAIS 1-Nutella 1,00 2-Bis 1,00 3-KitKat 1,00 então como pego esses adicionais e salvo em cada ITEM escolhido pelo usuário e se possivel somar esses adicionais que tenha valores também
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.