Zdravím,
jak má vypadat deklarace funkce pokud jako parametr má mít ukazatel na integer?
A jak se potom taková funkce volá?
Děkuji
no pokud google nelze, tak pokud se ceka pointer na integer, tak pred ten predavanej integer hodis @
a v deklaraci funkce zase neco: ^ integer;
nebo jestli se to ma jen predavat odkazem tak Procedure test(var x: integer); (zmena uvnitr procedury zmeni i promennou, ktera je predana pri volani...
Abych to více objasnil.
Mám DLL knihovnu napsanou v C++ a tá má funkci, která přijímá ukazatel na nějakou strukturu.
A já potřebuji zavolat tuto funkci z delphi.Struktura je dejme tomu S_REQUEST.
Deklarace funkce
function MyTestFce(var req: S_REQUEST):Integer; stdcall; external 'MyLib.dll'
Volání v kodu
myReq : S_REQUEST;
i : Integer;
i := MyTestFce(myReq); //Je to dobře?
i := MyTestFce(@myReq); //Nebo takhle?
v tom pripade spis (req: ^S_REQUEST) a predat strukturu s @
kdo vi jak se to chova s tim var presne... stdcall by na C funkce stacit melo... hlavni je, aby presne sedela ta datova struktura na to co ceka dll ... (coz neni tak snadne jak by se zdalo)
diky.
Jsem si myslel, že s tou strukturou problém nebude, ale raději to tady vypíšu.
Struktura v C++
struct S_REQUEST
{
BYTE XNumber[20];
DWORD Exp;
BYTE Amt[13];
BYTE Flag;
BYTE SNumber[10];
}
Struktura v Delphi
S_REQUEST = record
XNumber: string[20];
Exp: DWORD;
Amt: string[13];
Flag: byte;
SNumber: string[10];
end;
Může to tak být?
nejsem si jist, ale neni string v pascalu (mozna ne v delphi) pole znaku o maximalni delce 255, kdy na prvni pozici je delka? to by byl delsi nez 20 znaku v C o jedna-... spis bych to videl na array [0..19] of byte nebo jak se to zapisuje
KIIV - je to tak. Já bych to udělal takhle:
S_REQUEST = Record
XNumber: Array[0..19] of Byte;
Exp: DWORD;
Amt: Array[0..12] of Byte;
Flag: Byte;
SNumber: Array[0..9] of Byte;
end;
Při týhle deklaraci má struktura velikost 48B, při použití stringu 56B (je tam navíc délka stringu plus nejspíš nějaký to zarovnání), takže stringy nepoužívat.
Sniper to zmínil, Record struktura se automaticky zarovnává na daný počet bajtů pokud někdy v budoucnu budeš opět pracovat s délkou (sizeOf(); ) nějakého recordu dej si na to pozor viz http://stackoverflow.com/questions/9803124/why-isnt-the-size-of-a-record-equal-to-the-sum-of-the-sizes-of-its-fields
S_REQUEST = record
XNumber: string[20];
Exp: DWORD;
Amt: string[13];
Flag: byte;
SNumber: string[10];
end;
Deklarace Recordu se stringem má skutečnou velikost 51B, ale proměnné recordu se v tomto případě zarovnávají na násobek 4B, proto se dostaneš až na 56B. (+ je dobré vědět, že Byte = Char = String[i] -> pokud za sebou je více proměných tohoto typu, zarovnání se mezi nima neuskuteční)
No a na závěr z toho vyplývý, že pokud dáš DWORD na začátek nebo konec datové struktury, dostaneš se na velikost 52B.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku