Parametr funkce jako ukazatel – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Parametr funkce jako ukazatel – Delphi – Fórum – Programujte.comParametr funkce jako ukazatel – Delphi – Fórum – Programujte.com

 

jurin
~ Anonymní uživatel
16 příspěvků
18. 4. 2013   #1
-
0
-

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

Nahlásit jako SPAM
IP: 80.188.228.–
KIIV
~ Moderátor
+43
God of flame
18. 4. 2013   #2
-
0
-

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...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jurin
~ Anonymní uživatel
16 příspěvků
18. 4. 2013   #3
-
0
-

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?

Nahlásit jako SPAM
IP: 80.188.228.–
KIIV
~ Moderátor
+43
God of flame
18. 4. 2013   #4
-
0
-

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)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jurin
~ Anonymní uživatel
16 příspěvků
18. 4. 2013   #5
-
0
-

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?

Nahlásit jako SPAM
IP: 80.188.228.–
KIIV
~ Moderátor
+43
God of flame
18. 4. 2013   #6
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Sniper
~ Anonymní uživatel
215 příspěvků
18. 4. 2013   #7
-
0
-

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.

Nahlásit jako SPAM
IP: 90.179.201.–
Michal
~ Anonymní uživatel
683 příspěvků
21. 4. 2013   #8
-
0
-

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í)

  1. string[20] (velikost 21B) --> se zarovná na 24B
  2. Exp: DWORD; (velikost 4B) --> se dostáváme na 28B
  3. Amt: string[13]; (velikost 14B)
  4. Flag: byte; (velikost 1B)
  5. SNumber: string[10]; (velikost 11B) -> 54B se zarovná na k*4B
  6. konečná velikost 56B

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.

Nahlásit jako SPAM
IP: 62.240.183.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý