Jak přidat element na začátek pole? – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak přidat element na začátek pole? – Delphi – Fórum – Programujte.comJak přidat element na začátek pole? – Delphi – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
oxidián0
Grafoman
23. 6. 2018   #1
-
0
-

Jak přidat element na začátek pole? Je na to nějaká funkce?

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
23. 6. 2018   #2
-
0
-

#1 oxidián
u pole nebo u listu? U listu by to šlo metodou insert

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TStringList_Insert.html

u Array podle toho jestli máš rezervu ve velikosti a počátáš si vlastní count nebo je velké akorát, takže nejdříve případne zvětšit kapacitu pole pomocí

SetLength(pole,velikost);

poté posunout všechny prvky na konec nutno jít od konce tzn downto cyklus

no a nakonec doplnit ten prvek pole[0] := ...

lze použít i na vložení na jakoukoliv pozici v poli

Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
23. 6. 2018   #3
-
0
-

#2 MilanL

U pole.

FiltryCheckedArrayList: array of Tstrings;

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
23. 6. 2018   #4
-
0
-

#3 oxidián

// pokud nepracuješ s dostatečně velkým polem, kde máš rezervu
//nebo je pole plné
SetLength(FiltryCheckedArrayList, length(FiltryCheckedArrayList)+1);

//vytvoření místa na dané pozici, pro začátek pozice:=0
for i := length(FiltryCHeckedArrayList)-2 to pozice step -1
  FiltryCheckedArrayList[i+1] := FiltryCheckedArrayList[i];
next;

FiltryCheckedArrayList[pozice] := novyStrings;
Nahlásit jako SPAM
IP: 185.112.167.–
oxidián0
Grafoman
23. 6. 2018   #5
-
0
-

#4 MilanL
OK jasný, takže přímo na to v delphi není funkce, musím si napsat. Dík.

procedure arrayInsert(var arr: Array of TStrings; var str: TStrings);
var i,pozice:integer;
begin
  pozice := 0;
  SetLength(arr, length(arr)+1);

  //vytvoření místa na dané pozici, pro začátek pozice:=0
  for i := length(arr)-2 to pozice step -1
    arr[i+1] := arr[i];
  next;

  arr[pozice] := str;
end;

vrací chybu SetLength(arr,  ... incompatible types

Jak tam dostat ten argument var arr?

Nahlásit jako SPAM
IP: 78.45.195.–
Sniper
~ Anonymní uživatel
215 příspěvků
23. 6. 2018   #6
-
+1
-
Zajímavé

Takto nelze do funkce předávat dynamický array. Jak to máš deklarované tak parametr arr je open array (použij google pro detaily), musíš si nadefinovat typ pro to pole, a ten typ pak použít pro daný parametr.

type
  TStringsObjArray = array of TStrings;

procedure arrayInsert(var arr: TStringsObjArray; str: TStrings);
...
Nahlásit jako SPAM
IP: 92.240.176.–
oxidián0
Grafoman
23. 6. 2018   #7
-
0
-

Díky. A nerozumím tomu:

  for i := length(arr)-2 to pozice step -1
    arr[i+1] := arr[i];
  next;

co je step? Schází tam DO.

Má to být takto?

type
  TStringsObjArr = array of TStrings;
procedure arrayInsert(var arr: TStringsObjArr; var str: TStrings);
var i,pozice:integer;
begin
  pozice := 0;
  SetLength(arr, length(arr)+1);

  //vytvoření místa na dané pozici, pro začátek pozice:=0
  for i := length(arr)-2 to pozice DO
    i:= -1
    arr[i+1] := arr[i];
  next;

  arr[pozice] := str;
end;
Nahlásit jako SPAM
IP: 78.45.195.–
Sniper
~ Anonymní uživatel
215 příspěvků
23. 6. 2018   #8
-
0
-

STEP ve většině dialektů pascalu (delphi nevyjímaje) není. Celkově to vypadá jak z jiného jazyka (NEXT taky v pas není).

type
  TStringsObjArr = array of TStrings;

procedure arrayInsert(var arr: TStringsObjArr; str: TStrings);
var 
  i: integer;
begin
  SetLength(arr,length(arr)+1);

  For i := High(arr) downto Succ(Low(arr)) do
    arr[i] := arr[i - 1];

  arr[0] := str;
end;

Když předáváš v parametru objekt, NIKDY to nedeklaruj jako var pokud k tomu není opravdu vážný důvod.

Nahlásit jako SPAM
IP: 92.240.176.–
Kit+15
Guru
23. 6. 2018   #9
-
0
-

#1 oxidián
Zkus se zamyslet, zda by nebylo lepší mít to pole pozpátku a položky přidávat na konec. Přidávání na začátek je totiž drahé.

Často však bývá výhodnější použití seznamu, zásobníku nebo fronty. Pracuje se s tím mnohem lépe a výkon netrpí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8c6a:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
23. 6. 2018   #10
-
0
-

Teď se chci zeptat jak vyplnit

list: Tstrings;

polem? Je nějaká funkce abych zavolal něco jako list.fromArray(myArray); ty položky se automaticky přidají z pole do seznamu? Nebo musím pokaždé vytvářet vlastní cyklus? Já už viděl podobné funkce, že ze souboru se načte seznam, tak myslím, že by mohlo být i toto. Což o to, napsat to přes for, mohu, ale raději chci využívat ty chytré funkce je to přehlednější a kratší kód.

#9 Kit
Ale tady to není PHP. Je tam deset položek v poli :-) Mě už to jede.

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
23. 6. 2018   #11
-
0
-

#8 Sniper
Díkes, už jsem na to přišel. Ppoužil jsem klasický for cyklus s downto.

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
23. 6. 2018   #12
-
0
-

#10 oxidián
Dlouho jsem dělal v Pascalu a nebyl jsem líný si tyto abstraktní datové struktury vyrobit.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:af:16...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
23. 6. 2018   #13
-
0
-

#12 Kit
Pascal je zastaralý. Dneska máme nové možnosti.

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
23. 6. 2018   #14
-
0
-

#13 oxidián
Pokud máme nové možnosti, tak proč je nevyužíváš?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:d501:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
gna
~ Anonymní uživatel
1860 příspěvků
23. 6. 2018   #15
-
0
-

#13 oxidián
Víš, že to v Delphi je dialekt Pascalu, žejo?

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
23. 6. 2018   #16
-
0
-

#15 gna
Tak je to podobné, ale věci z Pascalu si už nepamatuju.

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
23. 6. 2018   #17
-
0
-

#14 Kit
Co kdybys přestal filosofovat a poskytl konkrétní odpověď na moji otázku. Existuje taková funkce nebo ne?

Dit: už jsem to prozkoumal, a odpověděl jsem si: ne. Takže si to napíšu

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
23. 6. 2018   #18
-
0
-

#17 oxidián
Není. Proto jsem psal, že bys neměl být líný si ji napsat. Pokud takové posuny potřebuješ dělat častěji, tak se hodí posunout o víc než jednu položku a udržovat si index začátku.

Jenom doufám, že neprogramuješ nějaké řazení. U toho se používají jiné postupy.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:f89d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
24. 6. 2018   #19
-
0
-

#8 Sniper
Důvod proč deklaruju arr jako var, je ten, že ta funkce rozšiřuje to pole o jeden element.

procedure arrayInsert(var arr: TStringsObjArr);
var i,pozice:integer;
begin
  i := length(arr);
  SetLength(arr, i+1);
  for i := length(arr)-2 downto 0 DO
    arr[i+1] := arr[i];  // copy array element
end;

Kdyby tam nebylo var, tak po ukončení funkce, bude mít pole opět stejnou hodnotu a hodnoty, které jsem zkopíroval zmizí.

Implementace:

arrayInsert(Self.FiltryCheckedArrayList);

Result before call:

TestyOrganizer.FiltryCheckedArrayList[0][0] = 'filtry.cfg'

TestyOrganizer.FiltryCheckedArrayList[0][1] = '1'

TestyOrganizer.FiltryCheckedArrayList[1][0] = not accessible

TestyOrganizer.FiltryCheckedArrayList[1][1] = not accessible

Result After call:

TestyOrganizer.FiltryCheckedArrayList[0][0] = 'filtry.cfg'

TestyOrganizer.FiltryCheckedArrayList[0][1] = '1'

TestyOrganizer.FiltryCheckedArrayList[1][0] = 'filtry.cfg'

TestyOrganizer.FiltryCheckedArrayList[1][1] = '1'

Nyní ale řeším další problém. Další řádka je:

Self.FiltryCheckedArrayList[0][0] := s;


A výsledek je:

TestyOrganizer.FiltryCheckedArrayList[0][0] = 'filtry oblíbené.cfg'

TestyOrganizer.FiltryCheckedArrayList[0][1] = '1'

TestyOrganizer.FiltryCheckedArrayList[1][0] = 'filtry oblíbené.cfg'

TestyOrganizer.FiltryCheckedArrayList[1][1] = '1'

Což nemělo nastal. Mělo být:

TestyOrganizer.FiltryCheckedArrayList[0][0] = 'filtry.cfg'

TestyOrganizer.FiltryCheckedArrayList[0][1] = '1'

TestyOrganizer.FiltryCheckedArrayList[1][0] = 'filtry oblíbené.cfg'

TestyOrganizer.FiltryCheckedArrayList[1][1] = '1'

Nechápu jak mohlo dojít k tomu, že 2. element odkazuje na 1. index???

Edit:

Už chápu, způsobuje to ta řádka: arr[i+1] := arr[i]; je třeba to nadefinovat jako pole a zkopírovat hodnoty ze seznamu.

Takže to mám správně to má být takto:

procedure arrayInsert(var arr: TStringsObjArr);
var i,pozice:integer;
begin
  i := length(arr);
  SetLength(arr, i+1);
  for i := length(arr)-2 downto 0 DO
    begin
    arr[i+1] := TStringList.Create;
    arr[i+1].AddStrings(arr[i]);
    end;
end;

Takže ta funkce z #3 od Milana byla úplně naho*no, jen mě to zdrželo asi tak o šest hodin.

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
24. 6. 2018   #20
-
0
-

#19 oxidián
Přidej si do parametrů procedury i vkládaný prvek, ať to vypadá trochu standardně.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:f89d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
24. 6. 2018   #21
-
0
-

#20 Kit
Spíš bych měl přejmenovat proceduru. Nic se tam nevkládá, jen se rozšíří pole a kopírují data.

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
24. 6. 2018   #22
-
0
-

#21 oxidián
... a duplikuje první záznam.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:f89d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
gna
~ Anonymní uživatel
1860 příspěvků
24. 6. 2018   #23
-
0
-
Nerozhodně
Kit +

#19 oxidián
Takže to mám správně to má být takto

NE! Když už ty prvky kopíruješ vytvářením nových, tak ještě musíš mazat ty staré.

Ale ty nepotřebuješ vytvářet nové objekty. Jen chceš ty původní posunout.

A samozřejmě když takhle kopíruješ každý prvek na další pozici, tak nakonec bude kopie první položky na druhé pozici, ale zároveň zůstane i na první pozici. To je to nově vytvořené místo, které je potřeba inicializovat.

Já bych to kopírování teda ještě otočil ať tam nestraší to -2. 

setlength(arr, length(arr)+1);
for i := length(arr)-1 downto 1 do
  arr[i] := arr[i-1];
arr[0] := tstringlist.create;

Co ti na takové kravině trvalo 6 hodin?

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1860 příspěvků
24. 6. 2018   #24
-
0
-

A teď koukám, že už to tady několikrát je. Ty jsi prostě debil.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
24. 6. 2018   #25
-
0
-

#23 gna
Ale hovno, mám to přesně tak jak to chci! A ten svůj kód si strč do piče.

Nahlásit jako SPAM
IP: 78.45.195.–
Kit+15
Guru
24. 6. 2018   #26
-
0
-

#25 oxidián
Měj si takové hovno, jaké chceš. My ti ho brát nebudeme.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:35ee:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý