Forum Delphi.cz

Delphi => Obecné => Téma založeno: vangog 23-05-2019, 10:04:42

Název: funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 10:04:42
Existuje nějaká funkce, abych mohl na konec widestringu přičíst x widecharů?

Mám totiž takovouto funkci - původně kopírovala jeden widechar:

Kód: Delphi [Vybrat]
  1. procedure AddChar(i:Word; var win: widestring; var wout: widestring; add: word = 0);
  2. begin
  3.    wout := wout + win[i];
  4. end;
  5.  

Kam jsem přidal argument add, kterým má být možné přidat více než jeden widechar. Vím, že to mohu udělat pomocí smyčky, ale pokud je na to funkce (v Delphi 7) tak by bylo lepší to udělat přes funkci.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: Stanislav Hruška 23-05-2019, 10:16:03
DupeString - nemám D7
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 10:21:43
DupeString jen opakuje zdrojový řetězec.

Já chci toto:

sourceWideString := "cdef";
ws := "a";
i:= 2;
countChars:=2;
somecommand(ws, sourceWideString, 1, countChars);

Výsledek bude ws = "ade"

somecommand(var wOut: widestring;var wIn: widestring; from: Word; nChars: Word);

Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: geby 23-05-2019, 10:47:56
Nevim jak D7, ale v D2007 jsou funkce:

function StringOfChar(ch: AnsiChar; Count: Integer): AnsiString; overload;
function StringOfChar(ch: WideChar; Count: Integer): WideString; overload;
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 10:50:28
Nevim jak D7, ale v D2007 jsou funkce:

function StringOfChar(ch: AnsiChar; Count: Integer): AnsiString; overload;
function StringOfChar(ch: WideChar; Count: Integer): WideString; overload;

Ahoj, asi sis nepročetl zadání. Dávám sem příklad toho co mám a funkci for bych chtěl nahradit za jiný jednodušší příkaz.

Kód: Delphi [Vybrat]
  1. procedure AddChar(i:Word; var win: widestring; var wout: widestring; add: word = 0);
  2. var n: word;
  3. begin
  4.   if (add>0) then
  5.     begin
  6.       for n:=1 to add do
  7.         wout := wout + win[i-1+n];
  8.     end
  9.   else
  10.       wout := wout + win[i];
  11. end;
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 10:54:43
Coz je v podstate Insert (http://docwiki.embarcadero.com/Libraries/en/System.Insert), jen to chces pro Delphi 7 s parametry typu WideString. Je tak?

Jestli jsem to pochopil správně, tak Insert vloží zdrojový string kamkoliv do cílového řetězce. To není to co hledám. Mě jde hlavně o to, že tam specifikuješ kolik znaků se má zkopírovat ze zdrojového řetězce. Něco jako je funkce Move ale aby to přidalo na konec řetězce. Jinak lze to jednoduše udělat pomocí té smyčky co jsem poslal výše, ale myslím, že je to zbytečný kód na víc.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: Delfin 23-05-2019, 10:57:51
Coz je v podstate Insert (http://docwiki.embarcadero.com/Libraries/en/System.Insert), jen to chces pro Delphi 7 s parametry typu WideString. Je tak?

Jestli jsem to pochopil správně, tak Insert vloží zdrojový string kamkoliv do cílového řetězce.

Tak, tak (ten prispevek jsem uz i smazal). Tys tu ukazku mezitim upravil (predtim to vypadalo na vlozeni)...
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: Stanislav Hruška 23-05-2019, 10:59:35
Ak som to z príkladu dobre pochopil, tak by Ti mala stačiť funkcia Copy.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 11:04:51
Ak som to z príkladu dobre pochopil, tak by Ti mala stačiť funkcia Copy.

Jenže Copy to neposílá do cílového řetězce, nýbrž vytvoří nový string. A já ten cílový string už mám vytvořený v paměti. Tedy pokud by cílový string měl např. 60000 znaků, tedy se bude kopírovat 120000 bajtů i když budu chtít přidat jen dva znaky (4 bajty). To se mi zdá neefektivní.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: Delfin 23-05-2019, 11:11:29
Jenže Copy to neposílá do cílového řetězce, nýbrž vytvoří nový string. A já ten cílový string už mám vytvořený v paměti. Tedy pokud by cílový string měl např. 60000 znaků, tedy se bude kopírovat 120000 bajtů i když budu chtít přidat jen dva znaky (4 bajty). To se mi zdá neefektivní.

Me se to nechce cele cist. Takze co je cilem? Prepsat na urcite pozici retezec jinym (beze zmeny jeho delky)? Pokud ano, pouzij Move.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 11:57:30
Jenže Copy to neposílá do cílového řetězce, nýbrž vytvoří nový string. A já ten cílový string už mám vytvořený v paměti. Tedy pokud by cílový string měl např. 60000 znaků, tedy se bude kopírovat 120000 bajtů i když budu chtít přidat jen dva znaky (4 bajty). To se mi zdá neefektivní.

Me se to nechce cele cist. Takze co je cilem? Prepsat na urcite pozici retezec jinym (beze zmeny jeho delky)? Pokud ano, pouzij Move.

Ne přepisovat nechci nic. Jen přidat řetězec na konec jiného řetězce.  Psal jsem:

for n:=1 to add do
  wout := wout + win[i-1+n];

Je na to nějaký příkaz? Asi ne.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: JaroB 23-05-2019, 13:13:47
Fungovala funkce Concat()

nebo přes SetLength() nastavit  novou délku a pak nakopírovat třeba přes Move() část řetězce.

ale jestli to omezí realokace, kdo ví?
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: pf1957 23-05-2019, 13:40:36
   wout := wout + win[ i ];
Hm, a zkousel jsi nejdriv stejnym spusobem zretezit rovnou string (D7 tu nemam, ale v normalnic Delphi funguje as expected:
Kód: Delphi [Vybrat]
  1.    wout := wout + win;
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 14:55:34
   wout := wout + win[ i ];
Hm, a zkousel jsi nejdriv stejnym spusobem zretezit rovnou string (D7 tu nemam, ale v normalnic Delphi funguje as expected:
Kód: Delphi [Vybrat]
  1.    wout := wout + win;

Není správné použít
wout := wout + win;
protože část dat z win už byla zkopírována. Tuhle funkci, kterou jsem poslal spouštím uvnitř smyčky, která kopíruje data for i:=1 ... to .. do ..

Takže výsledkem wout := wout + win; by byl totální chaos řetězců.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 14:56:10
Fungovala funkce Concat()

nebo přes SetLength() nastavit  novou délku a pak nakopírovat třeba přes Move() část řetězce.

ale jestli to omezí realokace, kdo ví?

To bych mohl zkusit. Počkám až budu mít funkční program a pak otestuju výkon, abych věděl co to udělá.
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: pf1957 23-05-2019, 18:19:59
Není správné použít
wout := wout + win;
A to je nejaky problem otestovat, jestli nebudou fungovat standardni operace s retezci jako
Kód: Delphi [Vybrat]
  1. wout := wout + copy(win, x, y);
Název: Re:funkce na přidání x widecharů na konec widestringu
Přispěvatel: vangog 23-05-2019, 21:24:08
Není správné použít
wout := wout + win;
A to je nejaky problem otestovat, jestli nebudou fungovat standardni operace s retezci jako
Kód: Delphi [Vybrat]
  1. wout := wout + copy(win, x, y);

Tak to mě nenapadlo. Otestoval jsem ty dva kódy a nový kód je rychlejší. Verze s for trvala 27-28s, tahle 26s.

Kód: Delphi [Vybrat]
  1. procedure AddChar(i:Word; var win: widestring; var wout: widestring; add: word = 0);
  2. var n: word;
  3. begin
  4.   if (add>0) then
  5.       wout := wout + copy(win, i-1+n, add);
  6.   else
  7.       wout := wout + win[i];
  8. end;
  9.