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 mateus.andriollo
      Tenhos duas tabelas Cab e Itm, gostaria de listar s sequencia de cab e inserir em um array os itens pertencentes a elas, compo incomum idcab.
       
      Não consigo fazer, o array será para json
    • By arlindophp
      <?php
       
      function doPut($url, $fields)
      {
          $fields = (is_array($fields)) ? http_build_query($fields) : $fields;
       
          if ($ch = curl_init($url)) {
              curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));
              curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
              curl_exec($ch);
              //$resp = curl_exec($ch);
       
              $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
       
              curl_close($ch);
       
              return (int) $status;
          } else {
              return false;
          }
      }
       
      session_start();
      $s_chave = $_POST['edtChave'];
      $_SESSION['s_chave'] = $s_chave;
      $edtChave = $_POST['edtChave'];
       
      $edtCultura = $_POST['edtCultura'];
      $edtPraga = $_POST['edtPraga'];
      $edtDose = $_POST['edtDose'];
      $edtEspecificacao = $_POST['edtEspecificacao'];
      $edtAplicaTerrestre = $_POST['edtAplicaTerrestre'];
      $edtAplicarea = $_POST['edtAplicarea'];
      $edtIntseg = $_POST['edtIntseg'];
      $edtIntEntrada = $_POST['edtIntEntrada'];
      $edtDadosGerais = $_POST['edtDadosGerais'];
       
      $url = "www.api.site.com";
      echo 'Url = ' . $url;
      echo '<br>';
       
          $data_array2 = array();
          for ($i = 0; $i < 5; $i++) {
              $montagem_array = array(
                  'cultura' => $_POST['edtCultura'],
                  'praga' => $_POST['edtPraga'],
                  'dose' => $_POST['edtDose'],
                  'especificacao' => $_POST['edtEspecificacao'],
                  'aplicaterrestre' => $_POST['edtAplicaTerrestre'],
                  'aplicaerea' => $_POST['edtAplicarea'],
                  'intseg' => $_POST['edtIntseg'],
                  'intentrada' => $_POST['edtIntEntrada'],
                  'dadosgerais' => $_POST['edtDadosGerais'],
              );
       
              $data_array2[$i] = $montagem_array;
          }
       
          //$json = json_encode($data_array2);
       
      echo '<br>';
      echo 'Array convertido para formato json: ' . json_encode($data_array2);
      echo '<br>';
      //$data = $array_para_string;
      //echo $data.'+cultura=asdf&praga=asdf&dose=dasf&especificacao=sadf&aplicaterrestre=sadf&aplicaerea=asdf&intseg=2&intentrada=1&dadosgerais=sdaf';
       
      $header = array(
          'Authorization: falkdsjçlaskf'
       
      );
       
      //Nova tentativa 07/01/2022
      if (doPut($url, $data_array2) == 200) {
       
          echo 'Passou!';
          echo '<br>';
          echo json_encode($data_array2);
          echo '<br>';
      }
      // do something
      else {
          echo 'Não deu certo';
          echo '<br>';
          echo json_encode($data_array2);
          echo '<br>';
      }
      //Nova tentativa
       
      //header('location:jsonpostprodutobula_teste.php');
    • By arlindophp
      <?php
       
      function doPut($url, $fields)
      {
          $fields = (is_array($fields)) ? http_build_query($fields) : $fields;
       
          if ($ch = curl_init($url)) {
              curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));
              curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
              curl_exec($ch);
              //$resp = curl_exec($ch);
       
              $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
       
              curl_close($ch);
       
              return (int) $status;
          } else {
              return false;
          }
      }
       
      session_start();
      $s_chave = $_POST['edtChave'];
      $_SESSION['s_chave'] = $s_chave;
      $edtChave = $_POST['edtChave'];
       
      $edtCultura = $_POST['edtCultura'];
      $edtPraga = $_POST['edtPraga'];
      $edtDose = $_POST['edtDose'];
      $edtEspecificacao = $_POST['edtEspecificacao'];
      $edtAplicaTerrestre = $_POST['edtAplicaTerrestre'];
      $edtAplicarea = $_POST['edtAplicarea'];
      $edtIntseg = $_POST['edtIntseg'];
      $edtIntEntrada = $_POST['edtIntEntrada'];
      $edtDadosGerais = $_POST['edtDadosGerais'];
       
      $url = "www.api.site.com";
      echo 'Url = ' . $url;
      echo '<br>';
       
          $data_array2 = array();
          for ($i = 0; $i < 5; $i++) {
              $montagem_array = array(
                  'cultura' => $_POST['edtCultura'],
                  'praga' => $_POST['edtPraga'],
                  'dose' => $_POST['edtDose'],
                  'especificacao' => $_POST['edtEspecificacao'],
                  'aplicaterrestre' => $_POST['edtAplicaTerrestre'],
                  'aplicaerea' => $_POST['edtAplicarea'],
                  'intseg' => $_POST['edtIntseg'],
                  'intentrada' => $_POST['edtIntEntrada'],
                  'dadosgerais' => $_POST['edtDadosGerais'],
              );
       
              $data_array2[$i] = $montagem_array;
          }
       
          //$json = json_encode($data_array2);
       
      echo '<br>';
      echo 'Array convertido para formato json: ' . json_encode($data_array2);
      echo '<br>';
      //$data = $array_para_string;
      //echo $data.'+cultura=asdf&praga=asdf&dose=dasf&especificacao=sadf&aplicaterrestre=sadf&aplicaerea=asdf&intseg=2&intentrada=1&dadosgerais=sdaf';
       
      $header = array(
          'Authorization: falkdsjçlaskf'
       
      );
       
      //Nova tentativa 07/01/2022
      if (doPut($url, $data_array2) == 200) {
       
          echo 'Passou!';
          echo '<br>';
          echo json_encode($data_array2);
          echo '<br>';
      }
      // do something
      else {
          echo 'Não deu certo';
          echo '<br>';
          echo json_encode($data_array2);
          echo '<br>';
      }
      //Nova tentativa
       
      //header('location:jsonpostprodutobula_teste.php');
    • By arlindophp
      Pessoal estou tentando realizar um put com um json utilizando a biblioteca curl, mas só consigo fazer um por vez. Existe alguma forma de fazer isso usando a biblioteca Curl do php? Segue o código fonte funcionando, mas o curl não está aceitando um array multidimensional.
      *****************************
      <?php   function doPut($url, $fields) {     $fields = (is_array($fields)) ? http_build_query($fields) : $fields;       if ($ch = curl_init($url)) {         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));         curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);         curl_exec($ch);         //$resp = curl_exec($ch);           $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);           curl_close($ch);           return (int) $status;     } else {         return false;     } }   session_start(); $s_chave = $_POST['edtChave']; $_SESSION['s_chave'] = $s_chave; $edtChave = $_POST['edtChave'];   $edtCultura = $_POST['edtCultura']; $edtPraga = $_POST['edtPraga']; $edtDose = $_POST['edtDose']; $edtEspecificacao = $_POST['edtEspecificacao']; $edtAplicaTerrestre = $_POST['edtAplicaTerrestre']; $edtAplicarea = $_POST['edtAplicarea']; $edtIntseg = $_POST['edtIntseg']; $edtIntEntrada = $_POST['edtIntEntrada']; $edtDadosGerais = $_POST['edtDadosGerais'];   $url = "www.api.site.com"; echo 'Url = ' . $url; echo '<br>';       $data_array2 = array();     for ($i = 0; $i < 5; $i++) {         $montagem_array = array(             'cultura' => $_POST['edtCultura'],             'praga' => $_POST['edtPraga'],             'dose' => $_POST['edtDose'],             'especificacao' => $_POST['edtEspecificacao'],             'aplicaterrestre' => $_POST['edtAplicaTerrestre'],             'aplicaerea' => $_POST['edtAplicarea'],             'intseg' => $_POST['edtIntseg'],             'intentrada' => $_POST['edtIntEntrada'],             'dadosgerais' => $_POST['edtDadosGerais'],         );           $data_array2[$i] = $montagem_array;     }       //$json = json_encode($data_array2);   echo '<br>'; echo 'Array convertido para formato json: ' . json_encode($data_array2); echo '<br>'; //$data = $array_para_string; //echo $data.'+cultura=asdf&praga=asdf&dose=dasf&especificacao=sadf&aplicaterrestre=sadf&aplicaerea=asdf&intseg=2&intentrada=1&dadosgerais=sdaf';   $header = array(     'Authorization: falkdsjçlaskf'   );   //Nova tentativa 07/01/2022 if (doPut($url, $data_array2) == 200) {       echo 'Passou!';     echo '<br>';     echo json_encode($data_array2);     echo '<br>'; } // do something else {     echo 'Não deu certo';     echo '<br>';     echo json_encode($data_array2);     echo '<br>'; } //Nova tentativa   //header('location:jsonpostprodutobula_teste.php');
    • By lezão
      Boa tarde, galera!
      Tudo bem com vcs?
       
      Estou precisando de uma limitador de palavras.
      Tenho um texto de 600 palavras e gostaria de que na pagina principal aparece se, apenas 30 palavras do texto.
      Achei esse codigo na innternet, mas ele não limita palavras, mas sim ele corta as palavras ficando assim:  "Tenho um texto de 600 palav..."
      ?php echo substr("$texto;", 0, 200); ? com uma variavel que limita as palavras ficaria assim: "Tenho um texto de 600 palavras". exibiria essas 6 palavras.
×

Important Information

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