Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Funkcia Copy - Pascal

Dostali sme za ulohu napisat vlastnu funkciu, ktora ma fungovat ako funkcia copy v Pascale. Neviem si s tym rady, akosi nedostavam napad ako to vsetko dat dohromady. Stacia mi iba nejake zachytne body ako to spravit, hadam mi to dopne. :) Dakujem.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Chceš to rychle nebo pomalu? Rychle: jestli tím "copy" myslíš kopírování souboru, tak to je už hotov…
JoDiK 24.05.2012 19:41
JoDiK
ospravedlnujem sa.. ide o funkciu, ktora pracuje so stringami...takto vyzera copy(retazec,od ktoreho…
ehm 24.05.2012 19:48
ehm
Stačí sa pozrieť na knižnicu System... Takto vyzerá funkcia _Copy originál v Unit-e System: var Len…
pme 24.05.2012 20:11
pme
Vymyslet se dá spoustu věcí, co třeba pointerová matematika? Neboli žádný cyklus, jen přiřazení odku… nový
JoDiK 25.05.2012 22:38
JoDiK
Ještě by šla použít direktiva ASM a napsat to v assembleru ;-) nový
Jan Fiala 25.05.2012 22:48
Jan Fiala
Tojo, to je ale už vyšší dívčí :-) nový
JoDiK 25.05.2012 22:50
JoDiK
ne vyssi, ale nizsi. A najefektivnejsi. Je to totiz na jeden riadok :D rep movsb samozrejme predtym… poslední
MM.. 25.05.2012 23:33
MM..

Chceš to rychle nebo pomalu?
Rychle: jestli tím "copy" myslíš kopírování souboru, tak to je už hotové v nápovědě a určitě aspoň milionkrát na nejrůznějších stránkách na internetu
Pomalu: Programování není těžký se naučit, jen se doporučuje začít od jednoduchých zadání a podle toho, jak to postupně budeš zvládat jít do složitějších...
PS: podal jsi velmi málo a navíc zmatených informací, to se v programování nenosí...

ospravedlnujem sa.. ide o funkciu, ktora pracuje so stringami...takto vyzera copy(retazec,od ktoreho znaku,kolko znakov), teda napr. copy(ret,1,2), vysledok je string, priradim ho takto napr: ret2:=copy(ret,1,2)

priklad.
readln(ret);
-- zadam vetu napr. auto

ret1:=copy(ret,1,2)

vznikne au

Stačí sa pozrieť na knižnicu System...
Takto vyzerá funkcia _Copy originál v Unit-e System:

var
  Len, I: Integer;
begin
  Len := Byte(S[0]);
  if Len = 0 then
    Byte(Result[0]) := 0
  else
  begin
    if Index <= 0 then Index := 1
    else if Index > Len then Count := 0;
    Len := Len - Index + 1;
    if Count < 0 then Count := 0
    else if Count > Len then Count := Len;
    Byte(Result[0]) := Count;
    for I := 1 to Count do
      Result[I] := S[Index + I - 1];
  end;
end;

Neviem si predstaviť ako vymyslieť svoju vlastnú funkciu inak...

Vymyslet se dá spoustu věcí, co třeba pointerová matematika? Neboli žádný cyklus, jen přiřazení odkud se bude brát přímo ze zdroje?

function copy(s : string; odkud, delka : integer) : string;
var ls : byte absolute s;
    pvystup: ^string;
begin
  if odkud>ls then s:='';
  if delka>ls-odkud+1 then delka:=ls-odkud+1;
  pvystup:=ptr(seg(s),ofs(s)+odkud-1);
  pvystup^[0]:=chr(delka);
  copy:=pvystup^;
end;

ne vyssi, ale nizsi. A najefektivnejsi. Je to totiz na jeden riadok :D
rep movsb
samozrejme predtym treba nastavit ecx, esi, edi a selektory (ds, es)

P.S> slusne kniznice vyssich jazykov maju toto urobene pomocou rep movsd a len zvysne 0-3 bajty pomocou movsb, je to tak najefektivnejsie

Zpět do poradny Odpovědět na původní otázku Nahoru