[ 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 | 37
NapísalOffline : 12.09.2010 13:13 | Dlhé retazce

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 | 2
NapísalOffline : 12.09.2010 15:24 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 12.09.2010 19:16 | Dlhé retazce

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 | 2
NapísalOffline : 12.09.2010 19:27 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 12.09.2010 22:25 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 14.09.2010 23:09 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 15.09.2010 9:07 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 15.09.2010 9:53 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 15.09.2010 11:07 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 15.09.2010 14:31 | Dlhé retazce

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 | 2
NapísalOffline : 15.09.2010 14:46 | Dlhé retazce

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 | 0
NapísalOffline : 15.09.2010 16:32 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 15.09.2010 18:54 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 16.09.2010 17:29 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 16.09.2010 22:32 | Dlhé retazce

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 | 2
NapísalOffline : 16.09.2010 22:42 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 17.09.2010 9:03 | Dlhé retazce

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 | 37
Napísal autor témyOffline : 19.09.2010 21:32 | Dlhé retazce

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ý: 05.01.25
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 20.09.2010 12:33 | Dlhé retazce

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 | 0
NapísalOffline : 20.09.2010 14:42 | Dlhé retazce

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


 [ Príspevkov: 20 ] 


Dlhé retazce



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

1076

24.10.2010 23:16

ado21

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

Retazce v Jave

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

13

517

11.01.2014 20:42

focko

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

dlhe vypinanie

v Operačné systémy Microsoft

7

1944

02.11.2007 19:48

fuco

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

Dlhe pripajanie

v Siete

0

483

20.09.2008 2:37

dafo

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

Dlhe startovanie internetu

v Siete

4

476

16.05.2018 21:38

mato59

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

Dlhe zapinanie systemu...

v Notebooky a netbooky

6

844

30.06.2009 16:06

Dolinka

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

Dlhé zapínanie PC

v Intel - Integrated Electronics

25

1927

30.04.2012 15:51

DwEjtSvK

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

Dlhé názvy nickov

v Správy pre vedenie fóra

5

1511

20.10.2007 0:07

Spirit

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

dlhe nacitanie win7

v Operačné systémy Microsoft

2

477

12.08.2011 12:21

nBXXL

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

Dlhé načítanie WP

v Redakčné systémy

7

843

27.07.2011 19:15

Bajzik

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

dlhe nacitanie plochy

v Operačné systémy Microsoft

2

447

10.12.2009 15:07

Semp

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

645

08.09.2010 17:01

booom

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

Konverzia MTS - dlhé renderovanie

v Video programy

4

744

10.09.2011 12:35

deefler

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

coding style - dlhé queričky

v PHP, ASP

5

471

27.01.2010 14:59

GoodWill

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

Windows 7 - dlhe nacitavanie

v Operačné systémy Microsoft

0

597

23.12.2009 14:38

zawin

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

Vista- dlhe nacitavanie systemu,

v Operačné systémy Microsoft

13

1403

03.04.2008 13:54

walther



© 2005 - 2025 PCforum, edited by JanoF