Delphi > function Rozdel String

Programovacie jazyky, rady, poradňa...
DomCZo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 235
Registrovaný: 16 okt 2006, 22:49

Delphi > function Rozdel String

Príspevok od používateľa DomCZo »

Kód: Vybrať všetko

function Rozdel(co: String; cim: String): TStrings;
var
  i, p: Integer;
begin
  p := 0;
  for i := 1 to Length(co) do
  begin
    if co[i] = cim then
    begin
      Inc(p);
    end;

    if not (co[i] = cim) then
    begin
      Result[p] := Result[p] + co[i];
    end;
  end;
end;

Kód: Vybrať všetko

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  i: Integer;
  s: String;
  s2: TStrings;
begin
  s := 'Ahoj|Ja';
  s2 := Rozdel(s, '|');

  Memo1.Lines.Append(s2[0]);
  Memo1.Lines.Append(s2[1]);
end;
Pomoholi by ste mi, čo robím zle?
Chápem tomu správne, že TStrings je Array Stringov?
Ďakujem.
matwej
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 13 nov 2007, 21:17
Bydlisko: zvolen
Kontaktovať používateľa:

Re: Delphi > function Rozdel String

Príspevok od používateľa matwej »

DomCZo napísal:

Kód: Vybrať všetko

...
    if co[i] = cim then...
  
porovnavanie znaku s retazcom?
to cim by mal byt char ked uz
DomCZo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 235
Registrovaný: 16 okt 2006, 22:49

Príspevok od používateľa DomCZo »

No dik. Ale ani s tym Char to nejde.
impact
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 401
Registrovaný: 17 nov 2005, 16:04

Príspevok od používateľa impact »

Kód: Vybrať všetko

...
if co[i] = cim then
...
co a cim su polia znakov(array of char). Porovnavas tam co (co je jeden znak) s cim co je cele pole...

Spravne by teda kod mal byt:

Kód: Vybrať všetko

...
if co[i] = cim[i] then
...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

Nie, nechápeš tomu dobre. TStrings nie je array stringov, je to trieda. Jej štruktúru si môžeš pozreť tu: http://www.freepascal.org/docs-html/rtl ... rings.html

Tebo to nešlo okrem iného aj preto, že ak si pozreš tú triedu, tak TStrings obsahuje abstraktné metódy. To znamená, ze musíš použiť nejakého potomka, napr. TStringList ktorý ich implementuje. TMemo.Lines je práve typu TStringList tak pohodka.

Kód: Vybrať všetko

procedure TForm1.Button1Click(Sender: TObject) ;
var
   s2:TStringList;
begin
   s2:=TStringList.Create;
   try
     Rozdel('|', 'Ahoj|Ja', s2) ;
     memo1.Lines:=s2;
   finally
     s2.Free;
   end;
end;


procedure Tform1.Rozdel(const cim:Char; co:string; pom:TStrings);
begin
   Assert(Assigned(pom)) ;
   pom.Clear;
   pom.Delimiter:=cim;
   pom.DelimitedText:=co;
end;

---------------
//edit:
impact napísal:

Kód: Vybrať všetko

...
if co[i] = cim then
...
co a cim su polia znakov(array of char). Porovnavas tam co (co je jeden znak) s cim co je cele pole...

Spravne by teda kod mal byt:

Kód: Vybrať všetko

...
if co[i] = cim[i] then
...
V prípade že nemajú rovnakú dlžku tak dostaneš nepekné hlásenie o čítaní z nealokovanej pamäte. Preto to radšej riešte tak, že ten oddelovač bude iba char
DomCZo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 235
Registrovaný: 16 okt 2006, 22:49

Príspevok od používateľa DomCZo »

Uz som to vyriesil.

Kód: Vybrať všetko

type
  PoleStringov = Array of String;

function Rozdel(co: String; cim: Char): PoleStringov;
var
  i, p: Integer;
begin
  p := 0;
  SetLength(Result, p+1);
  for i := 1 to Length(co) do
  begin
    if co[i] = cim then
    begin
      Inc(p);
      SetLength(Result, p+1);
    end;
    if not (co[i] = cim) then
    begin
      Result[p] := Result[p] + co[i];
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  s2: PoleStringov;
  i: Integer;
begin
  s := 'Ahoj|Ja|dva|tri|styri';
  s2 := Rozdel(s, '|');

  for i := Low(s2) to High(s2) do
  begin
      Memo1.Lines.Append('#' + s2[i] + '#');
  end;
end;
Napísať odpoveď