Avatar billede delphin Nybegynder
08. juli 2004 - 21:01 Der er 6 kommentarer

Hukommelse/pointer problem?

Jeg har konverteret en header for en dll fil skrevet i c++ til delphi. Det er også gået ok, men mit problem er, at mit program kun virker en gang i mellem selvom jeg kører det med samme parametre hver gang. Jeg tror, det er pga., at jeg skal "pointe" til den første post i et array som dll filen skal bruge. Arrayet bliver sikkert gemt på forskellige måder/steder i hukommelsen fra gang til gang og derfor går det nogle gange galt. Giver det nogen mening?? -  og hvis det gør - kan jeg så på en eller anden måde sikre mig, at arrayet altid bliver gemt på en passende "pæn" måde i hukommelsen??

Mit array er bare et 1 dim array: buffer: array [a..b] of word;
Avatar billede hrc Mester
10. juli 2004 - 20:27 #1
Har du husket at sætte stdcall i din header (sikkert, når du nu skriver at det er et C++ dll)?
Avatar billede hrc Mester
10. juli 2004 - 21:33 #2
Jeg har prøvet at lege lidt med at sende en array over til et dll som tager parametrene med StdCall. Det bliver aldrig 100% som din problemopstilling men måske er der noget du kan bruge:

// Det kaldende program (med header)

type
  TfrmMain = class(TForm)
    btnTest: TButton;
    lbData: TListBox;
    procedure btnTestClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    fArray : array of word;
  public
  end;

var
  frmMain: TfrmMain;

// Får hele smøren hvad "efternavne" angår.
function Inc100(var aArray : array of word; aCount : integer) : integer; stdcall; external 'dlltest.dll' name 'Inc100';

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  i : integer;
begin
  Setlength(fArray,100);
  for i := 0 to 99 do
    fArray[i] := i;
end;

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  i : integer;
begin
  Inc100(fArray,100);

  for i := low(fArray) to high(fArray) do
    lbData.Items.Add(IntToStr(fArray[i]));
end;


Den fantastiske DLL-fil:

library DLLTest;

uses
  SysUtils,
  Classes;

{$R *.res}

function Inc100(var aArray : array of word; aCount : integer) : integer; stdcall;
var
  i : integer;
begin
  try
    for i := 0 to aCount - 1 do
      aArray[i] := aArray[i] + 100;
    result := 1
  except
    result := 0;
  end;
end;

exports Inc100;

begin
end.
Avatar billede delphin Nybegynder
11. juli 2004 - 00:34 #3
Ja, jeg har husket stdcall... men mange tak for dit eksempel - måske kan jeg bruge det til at blive inspireret til at ændre i min header, men desværre har jeg først mulighed for at kigge på det på mandag (i morgen) - men jeg vender tilbage, når jeg har fået set noget mere på det :-)
Avatar billede nico26 Nybegynder
11. juli 2004 - 17:09 #4
Det kunne jo være en bug i dll'en
Avatar billede delphin Nybegynder
11. juli 2004 - 21:51 #5
Ja, det kunne det være, men jeg har desværre ikke kildekoden til dll'en, da jeg ikke selv har skrevet den... så jeg håber på, at det ikke er der, fejlen ligger...
Avatar billede delphin Nybegynder
12. juli 2004 - 22:01 #6
Nå, nu har jeg fået det til at virke - det hjalp med lidt inspiration og lidt "roden rundt"... du kan bare lave et svar hrc, så vil jeg gerne give dig pointene...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester