Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 20 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok NapísalOffline : 12.09.2010 13:13

Dobrý den,
musím pracovat s dlhými retazcami typu pwidechar ale nemôžem zistit funkcie alebo metody ktoré s nimi pracuju, napr. ekvivalent Length, Write ( file_out, ansi_string) a pod. prosím o radu, kde by som sa to mohol dozvediet. V helpe som našiel iba deklarácie. Vdaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 12.09.2010 15:24

a odkial mas ze Length nefunguje aj pre PWideChar ?


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 12.09.2010 19:16

Zdravim,
túto konkretne som netestoval, ale ked mám vytvoreny subor file_out ako file a chcem zapísat hodnotu do suboru prikazom write , tak mi vypise chybu pri zapise o nekorektnosti typov.
Neviem ci je problem v type parametra pre write alebo mam hladat niekde inde.
Vdaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 12.09.2010 19:27

hod sem konkretny kus problemoveho kodu, cize ako declarujes premennu , ako ju naplnas a ako sa ju snazis zapisat do suboru


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 12.09.2010 22:25

Skôr, ako začneš pracovať s týmto dátovým typom, by si sa s ním mal trocha oboznámiť, aby ti to uľahčilo prácu. Ak si pracoval s klasickým stringom, tak si možno zaregistroval dátový typ PChar. Je to vlastne smerník na prvý znak v reťazci (string). Príklad:

Kód:
  s: string;
  c: PChar;
// ...
  s:= 'Toto je klasicky reťazec';
  c:= @s[1];
  ShowMessage( 'Výpis reťazca pomocou smerníka: ' + c );


To isté platí aj pre dátový typ PWideChar. Ty ho nemôžeš použiť samostatne. Je to smerník, ktorý musí ukazovať na typ WideChar (prípadne pole 2-bajtových prvkov), teda na prvý znak vo wide reťazci (WideString). Príklad:

Kód:
  s: WideString;
  p: PWideChar;
// ...
  s := 'Velmi dlhy retazec';
  p := @s[1];
  ShowMessage( 'Výpis reťazca pomocou smerníka: ' + p );


Takže po dávke teórie príklad na zápis premennej typu WideString (nie PWideChar, pretože to je smerník) do súboru pomocou streamu:

Kód:
procedure TForm1.Button1Click(Sender: TObject);

var f: TFileStream;
    hlavicka: array[0..1] of byte;
begin

  s := 'Velmi dlhy retazec';
  p := @s[1];

  hlavicka[0] := $FF;
  hlavicka[1] := $FE;

  f := TFileStream.Create( 'E:\skuska.txt', fmCreate OR fmOpenWrite );
  try
    f.WriteBuffer( hlavicka, 2 );
    f.WriteBuffer( p^, length(p) * 2);
  finally
    f.Free;
  end;

end;


Ešte drobné vysvetlenie: WideString používa UNICODE kódovanie, ktoré v súbore určuje hlavička začínajúca hodnotami 0xFF 0xFE. Každý znak v UNICODE zaberá dva bajty, nie jeden, preto je pri určení dĺžky buffera dvojnásobná dĺžka reťazca.

(*
To bol jednoduchý príklad. Ak používaš dlhé reťazce, možno ti bude výhodnejšie zadeklarovať dynamické pole WideChar znakov, pričom veľkosť si budeš manuálne zväčšovať podľa potreby a postupne znak po znaku ukladať do tohto poľa. Potom by si smerník PWideChar priradil na prvý prvok tohto poľa.
*)


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 14.09.2010 23:09

Dakujem za doterajšie odpovede, poučilo som sa ale na skúšobnom príklade mi dáva výnimku EInvalidPointer pri Freemem. Neviem čo robím zle, vdaka za usmernenie.Prikladám proceduru

procedure TForm1.Button1Click(Sender: TObject);

var
myWideString : WideString;
myWideCharPtr : PWideChar;
i : integer;

begin
myWideString := 'hallo';
myWideCharPtr := Addr(myWideString[1]);

GetMem(myWideCharPtr, Length(myWideString)+1*SizeOf(WideChar));
I:=0;
try
while i<= Length(myWideString) do
begin
StringToWideChar(myWideString, myWideCharPtr,Length(myWideString)+1);
showmessage ('gggg'+myWideCharPtr^);
Inc(i);
showmessage('incre '+inttostr(i));
Inc(myWideCharPtr,2);
end;
finally
FreeMem (myWideCharPtr);
end;
end;


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 15.09.2010 9:07

V riadku:
Kód:
StringToWideChar(myWideString, myWideCharPtr,Length(myWideString)+1);

si prepísal adresu v myWideCharPtr a pri dealokovaní je potom nekorektný údaj. Okrem toho prvý parameter funkcie StringToWideChar je typu string - príklad.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 15.09.2010 9:53

Vdaka za odpoved, zmenil som program ale určite nie úplne dobre lebo teraz mi hlási AccessViolation na kernel32.dll, môžem poprosit o zhovievavost ?

procedure TForm1.ConvTXTUTF16x;

var
Str_in : char;
str_ins : string ;
Str_out : Widestring;
PStr_out : PWidechar;

Position : LongInt;

begin
Position := 1;
while not eof (FileInx) do
begin
Read (FileInx, Str_in);
Str_ins := Str_in;

PStr_out := Addr (Str_out[1]);
StringToWideChar ( Str_ins, PStr_out, Length (Str_ins)+ 1) ;
// BlockWrite (FileOutx, Str_out, 2);
Inc (Position);
ConvertForm.Gauge1.Progress := Position * 100 div Subor_Length;
Application.ProcessMessages;
end;
ConvertForm.Button1.Caption := 'Konverzia ukonèená';

end;


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 15.09.2010 11:07

AccessViolation ti hlási, lebo smerník PStr_out si priradil prázdnej premennej:
Kód:
PStr_out := Addr (Str_out[1]);   // Str_out nema nastavenu velkost, teda nema ziaden znak


Upravil som tvoj kód takto (odstránil som z neho signalizačné prvky, aby som to skompiloval, tak si to ešte doplň naspäť):

Kód:
procedure TForm1.Button1Click(Sender: TObject);
var
  Str_in : char;
  str_ins : string ;
  memAlloc: pointer;
  PStr_out : PWidechar;

begin


  AssignFile( FileInx, 'E:\skuska.txt' );
  Reset( FileInx );

  GetMem( PStr_out, FileSize( FileInx ) * sizeOf(WideChar) + 1 );   // rezervuj pamat velkosti suboru v bajtoch * 2 + nulovy znak
  memAlloc := PStr_out;                 // zalohuj pointer, lebo sa bude menit

  while not eof ( FileInx ) do begin

    Read (FileInx, Str_in);
    Str_ins:= Str_in;
    StringToWideChar( Str_ins, PStr_out, Length (Str_ins)+ 1) ;
    inc( PStr_out );   // posunieme sa na dalsi znak

    Application.ProcessMessages;

  end;

  PStr_out^ := WideChar(0); // na koniec nulovy znak
  PStr_out := memAlloc;     // adresa prveho znaku

//  ShowMessage( PStr_out );

  CloseFile( FileInx );
  FreeMem( memAlloc );      // uvolni pamat

end;


Poznámka: V kóde som použil funkciu FileSize na získanie veľkosti súboru. Tá sa ale nedá použiť pri TextFile súboroch. Premennú FileInx som zadefinoval ako File of Char, keďže sa z neho čítaju iba znaky. Nezabudni aj na to, že RAM ti klesne po spustení tohto kódu 2-krát viac, ako je veľkosť čítaného súboru.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 15.09.2010 14:31

Dakujem Ficovi, perfektne to funguje, musím si riadne pozriet teoriu smerníkov. Ak by som mohol, poprosím ešte o zápis 2 bytov, ktoré sú výsledkom volanej funkcie, do súboru. Výstupný súbor som otváral iba ako file, preto BlockWrite, ale tento spôsob a aj ked ho vytvorím ako file of char mi vyhadzuje chybu, lebo parameter write má byt ansi a ja zapisujem widechar. Velká vdaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 15.09.2010 14:46

a skusal si subor definovat ako file of widechar ?


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 15.09.2010 16:32

Fico píše:
Ešte drobné vysvetlenie: WideString používa UNICODE kódovanie, ktoré v súbore určuje hlavička začínajúca hodnotami 0xFF 0xFE. Každý znak v UNICODE zaberá dva bajty, nie jeden, preto je pri určení dĺžky buffera dvojnásobná dĺžka reťazca.
Unicode kódovanie neexistuje (teda aspoň ja žiadne také nepoznám). Je to len nezmysel, ktorý možno použil Microsoft (a možno to neboli ani oni, ale používa sa to vo Windows). V skutočnosti ide o kódovanie UCS2 alebo UTF-16 (už netuším, presne ktoré kódovanie sa tam používa).


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 15.09.2010 18:54

jasug píše:
Ak by som mohol, poprosím ešte o zápis 2 bytov, ktoré sú výsledkom volanej funkcie, do súboru

Skús to tak, ako napísal Coldak, prípadne v totmo príspevku som ti napísal jedno riešenie.

chrono píše:
Unicode kódovanie neexistuje (teda aspoň ja žiadne také nepoznám). Je to len nezmysel, ktorý možno použil Microsoft (a možno to neboli ani oni, ale používa sa to vo Windows). V skutočnosti ide o kódovanie UCS2 alebo UTF-16 (už netuším, presne ktoré kódovanie sa tam používa).

UNICODE zahŕňa viacero spôsobov kódovaní. Nevedel som presne, ktoré sa tu používa, preto som to napísal všeobecne, že používa UNICODE kódovanie.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 16.09.2010 17:29

Dakujem Ficovi, syntakticky to perfektne funguje, ale mám dve otázky:
ako viem rozlíšiť UTF16, UTF16M a pod. a ako si môžem fyzicky overiť či vytvorený kod je správny napr cez ftp: alebo niečo podobné. Dakujem.


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 16.09.2010 22:32

Troška priblíž tvoje otázky. Rozlíšiť, aké je kódovanie reťazca v premennej WideString? Ak si myslel to, tak som vygooglil, že tá používa UTF-16 kódovanie.







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 16.09.2010 22:42

no asi ho zaujima ci je tam little-endian alebo big-endian


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 17.09.2010 9:03

http://cs.wikipedia.org/wiki/Unicode

V tabuľke nižšie nájdeš tento riadok:

wikipedia píše:
FF FE 16b, právě BMP Unicode-16, little-endian


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 05.09.08
Prihlásený: 11.11.22
Príspevky: 69
Témy: 37
Príspevok Napísal autor témyOffline : 19.09.2010 21:32

Ked som získaval základné info o Unicode, tak som vygooglil, že existuje kodovanie UTF-16 a určité klony UTF-16M a UTF-16BE. Tak ma čisto teroreticky zaujímalo či konverzia sa prevádza do základného kodu alebo jeho klonov.
Vdaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
Dlhé retazce

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 20.09.2010 12:33

Na predchadzajucej strane som napisal, ze sa puziva UTF-16 kódovanie.







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 20.09.2010 14:42

A to, či to v skutočnosti je UTF-16LE alebo UTF-16BE záleží od použitého procesora a/alebo operačného systému (napr. vo Windows to bude UTF-16LE).


Odpovedať na tému [ Príspevkov: 20 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. C - retazce

v Assembler, C, C++, Pascal, Java

7

1032

24.10.2010 23:16

ado21 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Retazce v Jave

v Assembler, C, C++, Pascal, Java

13

469

11.01.2014 20:42

focko Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. dlhe vypinanie

v Operačné systémy Microsoft

7

1808

02.11.2007 19:48

fuco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhe pripajanie

v Siete

0

445

20.09.2008 2:37

dafo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. dlhe nacitanie plochy

v Operačné systémy Microsoft

2

408

10.12.2009 15:07

Semp Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhe startovanie internetu

v Siete

4

433

16.05.2018 21:38

mato59 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhe zapinanie systemu...

v Notebooky a netbooky

6

792

30.06.2009 16:06

Dolinka Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhé zapínanie PC

v Intel - Integrated Electronics

25

1782

30.04.2012 15:51

DwEjtSvK Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhé názvy nickov

v Správy pre vedenie fóra

5

1458

20.10.2007 0:07

Spirit Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. dlhe nacitanie win7

v Operačné systémy Microsoft

2

434

12.08.2011 12:21

nBXXL Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhé načítanie WP

v Redakčné systémy

7

796

27.07.2011 19:15

Bajzik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Extrémne dlhé nabíjanie -S3

v Smartfóny a tablety

10

4340

25.02.2014 17:32

Penguin 10 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Dlhe bootovanie Win XP

v Operačné systémy Microsoft

4

598

23.04.2009 12:35

Iv0 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nová case - dlhé grafiky

v PC skrinky, zdroje a všetky druhy chladenia

14

579

08.09.2010 17:01

booom Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Konverzia MTS - dlhé renderovanie

v Video programy

4

698

10.09.2011 12:35

deefler Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. coding style - dlhé queričky

v PHP, ASP

5

421

27.01.2010 14:59

GoodWill Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra