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 ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • By mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • By mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • By Daniel Jose Sobrinho
      Olá, eu tenho um memo em Delphi com as seguintes linhas
       
      CALDO DE GALINHA
      LEMON PEPPER
       
      Preciso que fique com 10 ponto e virgula, já contando os que vão estar no espaço em branco assim:
       
      CALDO;DE;GALINHA;;;;;;;;
      LEMON;PEPPER;;;;;;;;;
       
      Pra substituir os espaços em branco já usei o stringreplace e funcionou corretamente:
       
      memo1.text := StringReplace(memo1.text,',',';',[rfReplaceAll]);
    • By clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

×

Important Information

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