Autor Téma: funkce na přidání x widecharů na konec widestringu  (Přečteno 207 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #1 kdy: 23-05-2019, 10:16:03 »
DupeString - nemám D7
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #2 kdy: 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);

« Poslední změna: 23-05-2019, 10:33:57 od vangog »

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 200
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #3 kdy: 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;

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #4 kdy: 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;

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #5 kdy: 23-05-2019, 10:54:43 »
Coz je v podstate 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.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #6 kdy: 23-05-2019, 10:57:51 »
Coz je v podstate 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)...
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #7 kdy: 23-05-2019, 10:59:35 »
Ak som to z príkladu dobre pochopil, tak by Ti mala stačiť funkcia Copy.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #8 kdy: 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í.
« Poslední změna: 23-05-2019, 11:06:30 od vangog »

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #9 kdy: 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.
« Poslední změna: 23-05-2019, 11:14:33 od Delfin »
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ů: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #10 kdy: 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.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 941
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #11 kdy: 23-05-2019, 13:13:47 »
Excellent
Rated 1 time
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í?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2509
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #12 kdy: 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;

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #13 kdy: 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ů.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 353
  • Karma: 0
    • Verze Delphi: 7
Re:funkce na přidání x widecharů na konec widestringu
« Odpověď #14 kdy: 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á.