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

Zdravím.
Když mam pole.

pole: array[1..5] of integer;
begin
pole[1]:= 7;
pole[2]:= 0;
pole[3]:= 0;
pole[4]:= 0;
pole[5]:= 11;

Potřebují zjistit, jestli je ve všech polích stejné číslo.
Přečtu si do proměnné první pole[1] a pak pomocí smyčky for projedu zbytek a porovnám.
Je jednodušší řešení?

Předmět Autor Datum
Není. Jenom se to dá trochu zoptimalizovat tím, že skočíš, jakmile najdeš první odlišný prvek.
Wikan 20.11.2018 15:41
Wikan
Jen taková připomínka, pokud se pole inicializuje hned za beginem, bylo by možná lepší ho inicializo… poslední
ml1 20.11.2018 16:39
ml1

Jen taková připomínka, pokud se pole inicializuje hned za beginem, bylo by možná lepší ho inicializovat už v deklaraci zápisem typu:


var pole: array[1..5] of integer = (7, 0, 0, 0, 11);

přesnou syntaxi si ale zjistěte v dokumentaci, toto zrovna z hlavy nevim a taky to musím hledat, když to zrovna potřebuju.

Existuje řešení, které není jednodušší (teda jak se to vezme), ale vede na jednodušší (rychlejší) kód. Jde o to, že indexování pole znamená kombinaci násobení a sčítání (hodnota je uložená na adrese základ+číslo_prvku*velikost_prvku), pokud je potřeba přistupovat k prvkům pole sekvenčně (což tady je), neni potřeba pořád dokola násobit (chytrý kompilátor použije posun, ale stejně to při každém indexování musí dělat opakovaně) a sčítat (k tomu si přidejte cyklus for), ale stačí adresu (ukazatel) navyšovat o velikost prvku.
postup by vypadal asi takto (nemám to plně promyšlené, tak jen naznačím)


reference := pole [1]
ukazatel na pole := adresa pole[2]
while (nejsem na konci pole (tj. ukazatel na pole < adresa pole [poslední])) 
   begin
      if (hodnota uložená na ukazateli <> reference) then 
             begin 
                nalezena neshoda
                break //přerušení cyklu
             end;
      inc(ukazatel na pole, sizeof(integer)) //pokud to delphi dovoluje, jinak použít normální sčítání nebo 
   end
if ukazatel = konec pole then vše se shodovalo else 

Lze to asi napsat na tucet dalších způsobů, ale snad jsem tu myšlenku vystihnul. Zrovna v delphi se s ukazateli pracuje trochu hůř (skoro mám pocit, že ani nejdou sčítat), alespoň co vím z verzí 3 a 7. Matně si vzpomínám, že inc(ukazatel) ho inkrementoval o velikost jeho typu, takže druhý parametr inc je zbytečný, ale to by opět bylo nutné ověřit v nápovědě. Tedy spousta zjišťování, kvůli drobné optimalizaci - to by mělo smysl, pokud by se to porovnávání dělalo v programu nějak často, nebo by ta pole byla hodně velká.

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