Autor Téma: Jak odkázat na pointer na pole?  (Přečteno 367 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Jak odkázat na pointer na pole?
« kdy: 09-07-2018, 09:22:10 »
V deklaraci funkce mám
Kód: Delphi [Vybrat]
  1. procedure Dictionary.readFile(fileName: string; var stringlist: TStringList; var header: Array of Byte);
  2.  
Jak odkázat na tu proměnnou abych mohl nastavit velikost pole?
Zkoušel jsem

Kód: Delphi [Vybrat]
  1. type TBytes = array of byte;
  2. type PTBytes = ^TBytes;
  3. setlength(PTBytes(header)^, headerSize);
  4. setlength(Pointer(header)^, headerSize);
  5. setlength(header[0], headerSize);
  6.  
ani jedno nefunguje, zkoušel jsem i předat adresu a nic.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2141
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Jak odkázat na pointer na pole?
« Odpověď #1 kdy: 09-07-2018, 09:30:13 »
Kód: Delphi [Vybrat]
  1. setlength(header, headerSize);
  2.  
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #2 kdy: 09-07-2018, 10:38:01 »
Kód: Delphi [Vybrat]
  1. setlength(header, headerSize);
  2.  

Toto mi píše chybu:
[Error] Incompatible types

Jinak moje pokusy psaly chybu [Error] Invalid typecast.
Jinak než to předávám do funkce tak to deklaruji
header: array of byte;
a volám
WMD.readFile('A:\MessagePoolExample.Bin', header);

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1408
  • Karma: 59
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Jak odkázat na pointer na pole?
« Odpověď #3 kdy: 09-07-2018, 14:21:10 »
Tady bych se zastavil a vratil k zadani. Ukolem je tedy vytvorit kolekci Unicode retezcu (Unicode kvuli prekladum) s moznosti ukladat a nacitat do/ze souboru ve vlastnim binarnim formatu, s tim ze retezce budou v UTF-8? Jake dalsi operace maji probihat nad tou kolekci? Bude se ta kolekce nekde zobrazovat?

Nebo je z toho neco jinak, pripade vlastni rozhodnuti (napr. ten format souboru)?
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #4 kdy: 09-07-2018, 14:48:22 »
Nic se nezměnilo. Jedná se mi o to, abych nenačítal hlavičku dvakrát. Jednou při read a podruhé při append. Při append potřebuju informace z hlavičky, takže pro mě je jednodušší ji sdílet. To jsem chtěl udělat takto. Nicméně mě by vážně zajímalo jak se řeší tahle situace, kdy pořebuju odkázat na buffer, který je vně funkce a není uvnitř třídy.

Je tahle záležitost s pointery na mě trochu moc složitá.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2141
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Jak odkázat na pointer na pole?
« Odpověď #5 kdy: 09-07-2018, 15:06:27 »
Kód: Delphi [Vybrat]
  1. setlength(header, headerSize);
  2.  

OK:

Kód: Delphi [Vybrat]
  1. var
  2.   by: TBytes;
  3.  
  4.   procedure met(var bytes: TBytes);
  5.   begin
  6.     SetLength(bytes, 10);
  7.   end;
  8. begin
  9.     met(by);
  10. ...
  11.  
  12.  
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #6 kdy: 09-07-2018, 15:14:12 »
Kód: Delphi [Vybrat]
  1. setlength(header, headerSize);
  2.  

OK:

Kód: Delphi [Vybrat]
  1. var
  2.   by: TBytes;
  3.  
  4.   procedure met(var bytes: TBytes);
  5.   begin
  6.     SetLength(bytes, 10);
  7.   end;
  8. begin
  9.     met(by);
  10. ...
  11.  
  12.  

Díky. Takže pomocí TBytes. Dobře, je to tak přehlednější.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #7 kdy: 09-07-2018, 15:38:09 »
Ještě tápu ohledně toho proč se mi nedaří vrátit data start:
header:(0,0,0,25);
Offset 0x0000 říká že počet položek je nula.
Offset 0x0025 říká, že zapisovat data mohu začít od bytu 25.
Kód: Delphi [Vybrat]
  1.  
  2. move(header[0], count, offsetsize);
  3. move(header[2], dataStart, offsetsize);
  4.  

Jenže dataStart má nějakou nonsense hodnotu příliš vysokou 10688768.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #8 kdy: 09-07-2018, 18:08:40 »
Ještě tápu ohledně toho proč se mi nedaří vrátit data start:
header:(0,0,0,25);
Offset 0x0000 říká že počet položek je nula.
Offset 0x0025 říká, že zapisovat data mohu začít od bytu 25.
Kód: Delphi [Vybrat]
  1.  
  2. move(header[1], count, offsetsize);
  3. move(header[3], dataStart, offsetsize);
  4.  

Jenže dataStart má nějakou nonsense hodnotu příliš vysokou 10688768.

Už jsem přišel na to kde byla chyba.

Měl jsem nadeklarováno
dataStart,count: integer; místo word. offsetsize je 2

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:Jak odkázat na pointer na pole?
« Odpověď #9 kdy: 10-07-2018, 22:42:12 »
Jak se to vlastně dělá, aby ta definice typu neproběhla dvakrát (v různých modulech). To if not Assigned() then se používá jen na proměnné, ne?

type TBytes = array of byte;

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):