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í?

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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