Biblioteka łączona statycznie, problem

0

Witam, piszę program z biblioteką łączoną statycznie, ma on za zadanie wyliczyć procent rekordów z wartością 'Tak', lecz po wyliczeniu otrzymuje zero ;/ Gdzie jest błąd?

Biblioteka

 type   data=record
  popiera:string;
  plec:Char;
  miasto:string;
  wykszt:string;
  wiek:18..100;
  czy:string;
  end;
function procent(z:array of data):extended;stdcall;

var i,a:integer;
  
begin
a:=0;
for i:=1 to 50 do
begin
if z[i].popiera='Tak' Then
begin
a:=a+1;
end;
end;
Result:=a/2;

end;
exports procent index 1;
 

Program

 type   data=record
  popiera:string;
  plec:Char;
  miasto:string;
  wykszt:string;
  wiek:18..100;
  czy:string;
  end;
var
  Form1: TForm1;
  s,a:string;
  i,k:integer;
  d:extended;
  
 var  BS: Textfile;
 var p:array[1..50] of data;

 function proc(z:array of data):extended;stdcall;external 'Project2.dll' index 1;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

OpenDialog1.Execute;
Edit1.Text:=OpenDialog1.FileName;
s:=Edit1.Text;



try
AssignFile(BS,s);
Reset(BS);
for i:=1 to 50 do
begin
readln(BS,p[i].popiera);
readln(BS,p[i].plec);
readln(BS,p[i].miasto);
readln(BS,p[i].wykszt);
readln(BS,p[i].wiek);
readln(BS,p[i].czy);
end;

Edit2.Text:=p[39].miasto;
CloseFile(BS);
d:=proc(p);
edit3.Text:=FloattoStr(d);

except
ShowMessage('Niepoprawny plik!');
end;

end;



end.
0

nie testowałem i nie jestem pewien ale chyba nie zdefiniowałeś jakie p ma pobierać
bo masz:
readln(BS,p[i].popiera);
readln(BS,p[i].plec);
readln(BS,p[i].miasto);
readln(BS,p[i].wykszt);
readln(BS,p[i].wiek);
readln(BS,p[i].czy);

a ładujesz:
d:=proc(p);

0

@up:
Wszystko jest dobrze. Gdzie ty masz tam błąd ?

Z tego, co wiem, to NIGDY w BIBLIOTEKACH nie używaj string'ów.
Czyli:

type   data=record
  popiera:pchar; //niby, dlaczego nie boolean ?
  plec:Char;
  miasto:pchar;
  wykszt:pchar;
  wiek:18..100;
  czy:string;
  end;

Popraw w bibliotece i w programie.
Całego kodu nie czytałem, ale polecam:
Rozdział 10
Wszystko o bibliotekach DLL.
Wg.mnie ważna część dot.tego tematu:

Ten podpunkt jest związany z użyciem łańcuchów w bibliotekach DLL. Ma to związek z komentarzem, który znajduje się w kodzie biblioteki zaraz po utworzeniu jej poprzez Repozytorium.

Twórcy przestrzegają w owym komentarzu przed używaniem w bibliotekach łańcuchów typu String. Taki typ danych nie może znaleźć się w parametrach eksportowanych procedur; nie może też występować jako zwracany przezeń element. Zamiast tego należy używać łańcuchów typu PChar lub ShortString.

Używanie długich łańcuchów nie jest wykluczone, lecz zarówno na liście uses w bibliotece, jak i w aplikacji musi się znaleźć moduł ShareMem. Uwaga! Musi on się znaleźć na pierwszym miejscu spośród wszystkich modułów na liście uses

Poprawki kodu:

Result:=a/2;

A czy nie przypadkiem 'a*2' ?

wiek:18..100;

Takie coś w ogóle powinno działać ?
Nie lepiej 'wiek:integer' ?

for i:=1 to 50 do

Lepiej, jak dasz:
for i:= Low(z) To High(z) Do
for i:= Low(p) To High(p) Do
Wtedy program i biblioteka nie wyjdą z błędem w razie zmiany rozmiaru tablicy.

0

Z tego, co wiem, to NIGDY w BIBLIOTEKACH nie używaj string'ów.

Po pierwsze, to dotyczy bibliotek DLL, a tu mowa o statycznej, a po drugie
nie „nigdy”, tylko trzeba wiedzieć jak to w DLLce zrobić żeby zadziałało.

0

Dzięki za porady (zastosowałem wszystkie :D, co do a*2 zamiast a/2 => sam zauważyłem :D).

1 użytkowników online, w tym zalogowanych: 0, gości: 1